当前位置:网站首页>Minio基本使用与原理
Minio基本使用与原理
2022-06-25 09:37:00 【@@Mr.Fu】
一、MinIo 核心概念
- 概念
分布式文件系统,简称为OSS对象存储【文件,图片…】。
如图:
二、MinIo 应用场景
- 应用场景
主要是在微服务系统中使用。
如图:
三、MinIo 项目落地
- 条件
- Demo项目
- MinIO
下载地址:
链接:https://pan.baidu.com/s/1x-xETi3hkmxbniJEFJkFyg
提取码: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,如图:
- Demo项目
四、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}
边栏推荐
- 如何自制一个安装程序,将程序打包生成安装程序的办法
- JS tool function, self encapsulating a throttling function
- 从海量手机号中匹配某一个手机号
- Puzzle (019.2) hexagonal lock
- Cubemx stm32f105rb USB flash drive reading and writing detailed tutorial
- puzzle(019.2)六边锁
- The way that flutter makes the keyboard disappear (forwarding from the dependent window)
- The problem of wirengpi program running permission
- 瑞萨RA系列-开发环境搭建
- CYCA 2022少儿形体礼仪初级师资班 深圳总部站圆满结束
猜你喜欢
![[project part - structure and content writing of technical scheme] software system type mass entrepreneurship and innovation project plan and Xinmiao guochuang (Dachuang) application](/img/4a/1e83ea9e8e79c0ae7244a159943480.jpg)
[project part - structure and content writing of technical scheme] software system type mass entrepreneurship and innovation project plan and Xinmiao guochuang (Dachuang) application

纳米数据世界杯数据接口,中超数据,体育数据比分,世界杯赛程api,足球比赛实时数据接口

2022 meisai question a idea sharing

Is it harder to find a job in 2020? Do a good job in these four aspects and find a good job with high salary

瑞萨RA系列-开发环境搭建

Remove the mosaic, there's a way, attached with the running tutorial

How to "transform" small and micro businesses (II)?

Flutter dialog: cupertinoalertdialog

Solution to the problem of repeated startup of esp8266

SQL advanced
随机推荐
2台三菱PLC走BCNetTCP协议,能否实现网口无线通讯?
51 SCM time stamp correlation function
[Ruby on rails full stack course] course directory
Pytorch_ Geometric (pyg) uses dataloader to report an error runtimeerror: sizes of tenants must match except in dimension 0
203 postgraduate entrance examination Japanese self-study postgraduate entrance examination experience post; Can I learn Japanese by myself?
[competition -kab micro entrepreneurship competition] KAB National College Students' micro entrepreneurship action participation experience sharing (including the idea of writing the application form)
PMP考试多少分算通过?
Grabcut image segmentation in opencv
Fluent creates, reads and writes JSON files
Is it safe to open an account with Great Wall Securities by mobile phone?
TLAB mechanism of JVM object memory allocation and TLAB process in G1
Encoding format for x86
MySQL create given statement
How to download the school logo, school name and corporate logo on a transparent background without matting
2022 postgraduate entrance examination experience post -- Alibaba Business School of Hangzhou Normal University -- management science and Engineering (including the recommendation of books and course
Exception: gradle task assemblydebug failed with exit code 1
Cocopod error failed: undefined method `map 'for nil:nilclass
[2020 cloud development + source code] 30 minutes to create and launch wechat applet practical project | zero cost | cloud database | cloud function
Is it safe for Huatai Securities to open an account on it? Is it reliable?
Study on correlation of pumpkin price and design of price prediction model based on BP neural network