乐趣区

关于文件:Minio基本使用与原理

@[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}
退出移动版