@[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}