@[toc]

一、MinIo 外围概念

  • 概念
    分布式文件系统,简称为OSS对象存储【文件,图片.......】。
    如图:

二、MinIo 利用场景

  • 利用场景
    次要是在微服务零碎中应用。
    如图:

三、MinIo 我的项目落地

  • 条件

    • Demo我的项目
    • MinIO
      下载地址:
      链接:https://pan.baidu.com/s/1x-xE...
      提取码:tbz9
  • 步骤

    • Demo我的项目

      • 步骤

        • 增加Nuget包

          //增加 Nuget包 Minio
        • 建设MinIo客户端连贯

              MinioClient minioClient = new MinioClient("Ip地址:端口号","用户名","明码");
        • 创立文件桶

              // 判断是否有文件桶    if(!minioClient.BucketExistsAsync("文件桶名称").Result)    {        minioClient.MakeBucketAsync("文件桶名称");    }
        • 上传对象

              minioClient.PutObjectAsync("文件桶名称",上传的文件名称,文件流,文件长度).Wait();      minioClient.PutObjectAsync("文件桶名称","上传的文件名称","文件门路【D://...门路到文件名称.后缀】").Wait();     //生成上传文件链接,返回一个生成文件的门路,须要后端系统中新建一个Access Key和Secret Key,能力应用,    //将客户端连贯的用户名和明码改为Access Key和Secret Key,并设置读和写的权限    minioClient.PresignedPutObjectAsync("文件桶名称",上传的文件名称,过期工夫【单位:秒】).Result;

          如图:

        • 下载对象

           minioClient.GetObjectAsync("文件桶名称",文件名称,输入流地址).Wait(); minioClient.GetObjectAsync("文件桶名称",文件名称,从什么中央开始【0】,下载的长度,输入流地址).Wait();//分段下载对象
        • 刪除对象

          • 单个删除

              minioClient.RemoveObjectAsync("文件桶名称", 对象名称.后缀);
          • 多个删除

             minioClient.RemoveObjectAsync("文件桶名称", 对象名称.后缀汇合).Wait();
        • 对象拷贝

           minioClient.CopyObjectAsync("原文件桶名称", 源文件名称.后缀, "目的地文件桶名称", 新文件名称.后缀).Wait();
      • 整体代码如下

        • 文件上传

             //文件上传   public  IActionResult Upload(IFormFile fromFile)   {      //建设MinIo客户端连贯      MinioClient minioClient = new MinioClient("127.0.0.1:9000","minioadmin","minioadmin");      // 判断是否有文件桶      if(!minioClient.BucketExistsAsync("test").Result)      {        minioClient.MakeBucketAsync("test");      }      //上传文件      minioClient.PutObjectAsync("test",fromFile.FileName,fromFile.OpenReadStream,fromFile.Length).Wait();      return Ok ("文件上传胜利!");   }
        • 文件上传链接生成【网站服务端不倡议应用】
          目标:MinIo 反对上传5TB的对象,然而网站不反对上传5TB对象,所以采纳生成文件上传链接形式来解决,不倡议应用网站服务端的形式来实现【网站服务端没有设置key和签名的api办法】,倡议应用js间接连贯MinIo客户端的形式来实现上传大文件。
          新建Access Key 和Secret Key,并设置读和写的权限,如图:

          代码如下:

             //文件上传   public  IActionResult UploadBigFile(IFormFile fromFile)   {      //建设MinIo客户端连贯      MinioClient minioClient = new MinioClient("127.0.0.1:9000","Access Key","Secret Key");      // 判断是否有文件桶      if(!minioClient.BucketExistsAsync("test").Result)      {        minioClient.MakeBucketAsync("test");      }      //生成大文件上传链接,返回一个文件上传门路      string Url = minioClient.PresignedPutObjectAsync("test",fromFile.FileName,60*60*24).Result;      return Ok ("文件门路生成胜利!");   }
        • 批量文件上传

               public IActionResult Upload(IFormFile[] formFiles)     {        foreach (var formFile in formFiles)        {            //建设MinIo客户端连贯            MinioClient minioClient = new MinioClient("127.0.0.1:9000", "minioadmin", "minioadmin");            // 判断是否有文件桶            if (!minioClient.BucketExistsAsync("test").Result)            {                minioClient.MakeBucketAsync("test");            }            //生成大文件上传链接,返回一个文件上传门路            minioClient.PutObjectAsync("test", formFile.FileName, formFile.OpenReadStream(), formFile.Length);        }         return Ok("文件上传胜利!");     }
        • 文件下载

          • 单文件下载

               //文件下载 public  IActionResult DownLoad(string  fileName) {   FileStreamResult fileStreamResult = null;   try   {     //建设MinIo客户端连贯     MinioClient minioClient = new MinioClient("127.0.0.1:9000","minioadmin","minioadmin");     var imaStream =  new MemortStream()     //下载文件     minioClient.GetObjectAsync("test",fileName,stream=>{stream.CopyTo(imaStream)}).Wait();     imaStream.Position = 0;     //指定对象类型      fileStreamResult = new FileStreamResult(imaStream,"img/jpg");    }   catch(Exception ex)   {               }   return Ok ("文件下载胜利!"); }
          • 分段文件下载

              //文件下载public  IActionResult DownLoadShard(string  fileName){  FileStreamResult fileStreamResult = null;  try  {    //建设MinIo客户端连贯    MinioClient minioClient = new MinioClient("127.0.0.1:9000","minioadmin","minioadmin");    var imaStream =  new MemortStream()    //分段下载文件  留神: 数字是字节单位    minioClient.GetObjectAsync("test",fileName,0,100,stream=>{stream.CopyTo(imaStream)}).Wait();    minioClient.GetObjectAsync("test",fileName,101,1000,stream=>{stream.CopyTo(imaStream)}).Wait();    imaStream.Position = 0;    //指定对象类型     fileStreamResult = new FileStreamResult(imaStream,"img/jpg");   }  catch(Exception ex)  {             }  return Ok ("文件下载胜利!");}
          • 删除文件

              /// <summary>  /// 删除文件  /// </summary>  /// <param name="fileName"></param>  /// <returns></returns>  [HttpDelete("{fileName}")]  public IActionResult DeleteFile(string fileName)  {      //建设MinIo客户端连贯      MinioClient minioClient = new MinioClient("127.0.0.1:9000", "minioadmin", "minioadmin");      // 判断是否有文件桶      if (!minioClient.BucketExistsAsync("test").Result)      {          minioClient.MakeBucketAsync("test");      }      //生成大文件上传链接,返回一个文件上传门路      minioClient.RemoveObjectAsync("test", fileName);      return Ok("删除胜利!");  }
          • 批量删除文件

              /// <summary>  /// 删除文件  /// </summary>  /// <param name="fileName"></param>  /// <returns></returns>  [HttpDelete("DeleteBatchFile")]  public IActionResult DeleteBatchFile(string[] fileNames)  {      //建设MinIo客户端连贯      MinioClient minioClient = new MinioClient("127.0.0.1:9000", "minioadmin", "minioadmin");      // 判断是否有文件桶      if (!minioClient.BucketExistsAsync("test").Result)      {          minioClient.MakeBucketAsync("test");      }      //生成大文件上传链接,返回一个文件上传门路      minioClient.RemoveObjectAsync("test", fileNames.ToList()).Wait();      return Ok("删除胜利!");  }
          • 拷贝文件

              /// <summary>  /// 复制文件  /// </summary>  /// <param name="fileName">原始文件名称</param>  /// <param name="destFileName">复制的文件名称</param>  /// <returns></returns>  [HttpPost("FileCopy")]  public IActionResult FileCopy(string fileName,string destFileName)   {      MinioClient minioClient = new MinioClient("127.0.0.1:9000", "minioadmin", "minioadmin");      if (!minioClient.BucketExistsAsync("testnew").Result)      {          minioClient.MakeBucketAsync("testnew");      }      minioClient.CopyObjectAsync("test", fileName, "testnew", destFileName).Wait();      return Ok("复制胜利!");  }
    • 启动MinIO

      • 运行命令

         #在根目录下执行命令启动  #minio.exe :服务启动命令 #server:是以服务端的形式启动 #--console-address ":9001":将动静端口改为动态端口 #D:\MinIo\data:数据目录  minio.exe server --console-address ":9001" D:\MinIo\data  

        执行后果如下:

      • 验证是否启动胜利
        拜访 http://10.1.57.35:9001,如图:

四、MinIo 文件高可用

  • 场景

    • 如果文件误删后,如何实现文件的高可用性

      • 步骤
        应用多个数据目录来存储。
        新建4个数据目录。

        • 命令

            minio.exe server  --console-address  ":9001"  D:/Assembly/MinIo/data1  D:/Assembly/MinIo/data2 D:/Assembly/MinIo/data3 D:/Assembly/MinIo/data4

          运行后果如图:

  • 纠删码

    • 概念
      纠删码是一种数据保护办法,它将数据宰割成片段,把冗余数据块扩大、编码,并将其存储在不同的地位,比方磁盘、存储节点或者其它地理位置,艰深的说就是一个数据编码而已。
      能够了解为将对象文件进行拆分,而后进行编码,避免任意两份数据失落。
    • 实现过程
      先将对象文件拆分成多份,进行编码(2种编码:数据编码和扩大编码)。
    • 目标
      升高对象文件的存储空间。
    • 纠删码如何保障对象文件的复原
      如图:

      如果有一个文件对象,在minIO中会拆分成A1和A2两份雷同的数据,再将数据存储为 X1、X2、X3、X4 数据文件中,让其别离等于 A1,A2,A1,A2;这样假如数据X1和X2数据失落了,那么数据能够从X3和X4中复原。然而这样存储会呈现问题:如果数据X1 和 X3 数据失落了,那么原先的数据A1就彻底找回来了;然而能够应用上面的一种存储形式X1和X2还是不变,X3 = A1+A2;X4=A1+2*A2,这样任意两份数据失落,都能够复原A1和A2了,如图:

    • MinIo应用纠删码
      MinIo的数据目录至多有四个,并且是偶数目录数。

      • 规定
        四个数据目录中必须有一半数据目录数据不失落能力复原。
      • 纠删码的特色
        能够复原任何的损坏的数据,比方:误删除,磁盘损坏,磁盘中毒等。

        五、MinIo 文件监听

  • 工具

    • Mysql 数据库
    • MinIo
  • 步骤
    1、关上 MinIo 后盾管理系统
    2、点击Setting 目录
    3、点击 Notification 目录
    4、点击 Add Notification Target 按钮
    5、抉择Mysql数据库或者其余数据库(前提是手动建好数据库),而后输出:数据库的IP地址,数据库名称,数据库端口号,数据库用户名和明码,数据库表名(能够不必手动新建);
    6、再点击保留
    7、再次重新启动MinIo
    8、关联文件桶并往队列中发送音讯
    命令:

      #在MinIo根目录下执行  #建设连贯  mc.exe alias set 连贯地址别名【随便起】 http://10.1.57.35:9000 minioadmin minioadmin  #监听单个关联文件桶  mc event add --event  "put,delete" 连贯地址别名/文件桶名称 arn:minio:sqs::_:mysql

    如图:




  • 实现原理
    在MinIo外部会有一个内存队列,通过队列发给数据库;Mino相当于生产者--->MinIo外部队列<---监听--Mysql 数据库(消费者)

    六、MinIo 多租户

  • 多个服务对应多个MinIO
    就是应用不同的端口,并且数据目录是不一样的才能够;

        #在MinIo根目录下执行    #9002 Minio API连贯端口号    #9003 MinIo后盾管理系统端口号    #Window 环境中     minio.exe server --address :9002  --console-address  ":9003"  数据目录  数据目录1    #Linux 环境中      #留神:在Linux零碎中创立数据目录,有几个数据目录就得有几个磁盘才行     minio.exe server --address :9002  --console-address  ":9003"  数据目录{1..4}