一,MinIO的概述
MinIO和FastDFS一样,也是分布式文件系统,主要用来存储非结构化数据,但和FastDFS相比MinIO的优点有很多,现在大多数人都更倾向于用MinIO存储数据
一,MinIO的简介
MinIO是一个基于Apache License v2.0开源协议的对象存储服务,由Go语言编写,他兼容亚马逊S3云存储服务接口,非常适合存储大容量非结构化数据,如:图片,视频,备份数据,日志文件……,一个对象文件可以是容易大小,从kb到最大5TB不等,MinIO是一个非常轻量的服务,可以很简单的和其他应用结合
MinIO的几个基础概念:
1,Object:存储到Minio的基础对象,如文件,字节流,Anything
2,Buacket(桶):用来存储Object的逻辑空间,每个Buacket之间的数据是相互隔离的,它类似与FastDFS中group的概念
3,Drive:即存储数据磁盘,在MinIO启动时,以参数的方式传入,Minio中的所以数据都实际存储在Drive,类似于Fastdfs的storage
4,set:即一组Drive的集合,分布式部署根据集群规模自动划分一个或多个set,每一个set中的Arive分布在不同位置,一个对象存储在一个Set上
- 一个对象存储在Set上
- 一个集群划分多个set
- 一个set包含的Drive数量是固定的,默认由系统根据集群规模自动计算
- 一个set中的Drive尽可能发布在不同的节点上
MinIO的优点:
- 部署简单:执行一个single的二进制执行文件即可
- 支持海量数据存储:单对象最大为5TB
- 低冗余容错性高:标准且最高的数据冗余系数为2(即存储一个1MB的数据对象,实际占用的磁盘空间为2MB),但是任意的n/2块disk损坏的情况下依然可以读出数据
- 读写性能高:读写速率最高可以10.81GB/s
二,MinIO和FastDFS的对比
MinIO和FastDF除了在应用场景中是相似的,其他方面有很大的不同
1,开发语言:
- FastDFS:采用的传统的C和C++进行开发
- MinIO:采用新生代的GO语言,它的并发量和速率极高
2,应用部署:
- MinIO:采用的轻量化的结构实际,实际只需要运行一个single二进制文件即可
- FastDFS:安装需要先安装libfastcommon函数库,然后配置tracker和storage,nginx拓展模块也需要单独配置
3,应用整合:
- MinIO:兼容云原生平台,容器化部署简单,开发API完备提供了较好的maven依赖,Srpingboot整合方便
- FastDFS:容器化部署较为复杂,java操作还需要编译安装jar包,有很多不同第三方开发的fastdfs封装client,使用起来麻烦
4,使用方面:
- MinIO:使用时,提供有专门的web可视化界面,文件上传时可以自定义修改上传后文件名,支持跨平台(MacOS,Windown,Linux,Docker, Kubernetes)
- FastDFS:没有可视化界面,上传后文件名会重新编码避免重复,无法修改,目前只能在Linux,Docker上使用
5,架构方面(概念类似,结构不同):
- MinIO:使用纠错码进行文件的备份和恢复,文件实际存储在Drive中,空间的隔离使用Buacket,集群由于set组装
- FastDFS:使用Group进行逻辑空间上的隔离,每一个文件的在同一个Group中相互备份,文件实际存储在Storage中,集群由多个tracker和storage组成
总结:MinIO在设计和使用上面是完胜FastDFS的
二,MinIO的EC码和文件存储结构
一,纠删码
纠删码(erasure coding,EC)是一种数据保护方法,它将数据分割成片段,把冗余数据块扩展、编码,并将其存储在不同的位置,比如磁盘、存储节点
从数据函数角度来说,纠删码提供的保护可以用下面这个简单的公式来表示:n = k + m。变量“k”代表原始数据或符号的值。变量“m”代表故障后添加的提供保护的额外或冗余符号的值。变量“n”代表纠删码过程后创建的符号的总值
例:在一个EC 10/16的配置中,会有6个额外的符号(变量m)被添加到10个原始符号(变量k)中。这16个数据片段(变量n)会遍布16个驱动器、节点或地理位置中。而原始文件可以从10个验证片段中重建
Minio使用纠删码机制来保证数据的可靠性,使用highwayhash来处理数据损坏,简单的来说纠删码就是通过数学计算,把丢失的数据进行还原,它可以的将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原成原始数据,即使有小于或等于m份的数据失效,仍然可以通过剩下的数据进行还原
注:使用纠删码最少需要四块盘
二,minio存储形式
文件对象上传到minio后,会在对应的数据存储磁盘中,以Buacket名称为目录,目录下是part.1和xl.meta
- part.1:编码数据块及效验块
- xl.meta:元数据文件
三,Minio的安装
一,MinIO的安装部署(单机普通安装)
MinIO是跨平台的的支持MacOS,Windown,Linux,Docker,kubernetes,且安装非常简单
一,Linux安装
① 下载minio安装包(地址: https://dl.min.io/server/minio/release/linux-amd64/minio)
#wget直接下载 wget https://dl.min.io/server/minio/release/linux-amd64/minio #也可以浏览器下载之后上传
② 将文件设置成可执行文件
chmod +x minio
③ 运行
./minio server /opt/minio
选项:
- drive目录:指定服务运行时drive位置,类型于fastdfs中指定storage的实际文件存储位置(必选项)
- --address:指定minio服务端口好,默认为9000(格式:":端口号")
- --console-address:指定minio的web可视化界面的端口号,默认是动态产生的(格式:":端口号")
- --config-dir:自定义配置文件目录,默认为${HOME}/.minio
常用设置:
- 设置用户名:export MINIO_ROOT_USER=用户
- 设置密码:export MINIO_ROOT_PASSWORD=密码
可视化界面:
二,Docker安装
运行命令(没有minio镜像会自动下载):
run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"
- -p 9000:9000:minio服务端口映射
- -p 9001:9001:minio可视化界面端口映射
- server /data:drive目录
- --console-address ":9001":指定可视化界面端口
其他设置:
- -e "MINIO_ROOT_USER=用户":指定用户
- -e "MINIO_ROOT_PASSWORD=密码":指定密码
三,Windown安装
① 下载minio.exe的可执行程序
下载地址: https://dl.min.io/server/minio/release/windows-amd64/minio.exe
#cmd命令下载,outfile为文件下载输出目录 Invoke-WebRequest -Uri "https://dl.min.io/server/minio/release/windows-amd64/minio.exe" -OutFile "C:\minio.exe"
② 设置用户和密码
setx MINIO_ROOT_USER admin setx MINIO_ROOT_PASSWORD password
③ cmd执行
#F:\Data:drive目录 C:\minio.exe server F:\Data --console-address ":9001"
二,纠删码模式安装部署
一,纠删码模式概述
minio使用纠删码erasure code和效验checksum来保护数据不受硬件和无声数据损坏,即便丢失一半数量的数据(N/2)的硬盘,仍然可以恢复数据
纠删码:一种恢复丢失和损坏数据的数学算法,Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2的奇偶效验块,假如一8块磁盘,一个数据对象会被拆分成4个数据块和4个奇偶效验块,假如丢失任意4块盘,都可以从剩下的数据中进行恢复
二,纠删码模式部署
纠删码部署很简单,只需要在启动Minio时,挂载多个盘即可,minio会自动按盘进行纠删码分块
一,Linux纠删码部署
#启动时指定8个盘data1到data8 ./minio server /opt/minio/data{1...8} --console-address ":9001"
注:{n...m}的写法表示n到m之间的数字,包括n和m,这是minio提供的专有写法
二,Docker纠删码部署
run -p 9000:9000 -p 9001:9001 --name minio\ -v /opt/minio/data1 \ -v /opt/minio/data2 \ -v /opt/minio/data3 \ -v /opt/minio/data4 \ -v /opt/minio/data5 \ -v /opt/minio/data6 \ -v /opt/minio/data7 \ -v /opt/minio/data8 \ minio/minio server /opt/minio/data{1...8} --console-address ":9001"
三,部署完成后上传文件测试
① 提供web控制台创建一个名为wql的Buacket,并上传文件
② 进入drive目录,查看8个盘的文件情况
四,Minio集群搭建
一,Minio分布式集群
分布式存储,关键在于数据的可靠性,即保证数据的完整,不丢失,不损坏,只有在可靠性实现的前提下,才有追求一致性,高可用,高性能的基础,而对于存储领域,一般对于保证数据可靠性的方法有两类
1,冗余法:冗余法是最简单直接的方法,对存储的数据进行副本备份,当数据出现丢失,损坏,即可使用备份内容进行恢复,而数据副本的数量,决定了数据可靠性的高低,这其中会有成本的考量,副本数量越多,数据越可靠,但需要的设备也越多,成本也越高,可靠性是允许丢失一部分数据,采用此方法的分布式系统有很多
例:Hadoop集群的Hdfs(默认3个副本),redis集群,Mysql的主备模式等
2,效验法:即通过效验码的数学计算方式,对出现丢失,损坏的数据进行效验,还原,这里有两个作用,一是效验,通过对数据进行效验计算来检查数据的完整性,在数据传输和保存时经常用到,如TCP协议,二是数据还原通过数据结合效验码,通过数学计算,还原丢失损坏的数据,可以在保证数据可靠性的前提下,降低冗余,如单机硬盘存储中的RAID技术,纠删码技术等
例:Minio采用的就是纠删码技术
分布式MinIO的优势:
1,数据保护:
分布式Minio采用纠删码来防范多个节点宕机,分布式Minio至少需要4个硬盘,使用分布式Minio自动引入纠删码功能
2,高可用:
单机Minio服务存在单点故障,相反,如果有一个有N块硬盘的分布式Minio,只要N/2硬盘在线,数据就是安全的,不过需要至少有N/2+1的硬盘来创建新的对象
3,一致性:
minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型
二,分布式集群搭建
启动一个分布式Minio实例,只需要把硬盘位置做为参数传给minio server命令即可,然后在各个主机上运行即可
搭建注意事项:
- 分布式Minio里所有的节点需要有同样的access密钥和secret密钥,这样这些节点才能建立连接,实现这对密钥,需要在执行minio server命令之前,先将access密钥和secret密钥export成环境变量,新版本使用MINIO_ROOT_USER & MINIO_ROOT_PASSWORD
- 分布式minio使用的磁盘必须是没有然后数据的(必须清空)
- 分布式minio里的节点时间差不能超过3秒,集群集群可以使用NTP保证同步时钟
- 在Windows下分布式Minio并没有成熟
一,Linux搭建minio集群
一,完全分布式搭建
export MINIO_ROOT_USER=admin export MINIO_ROOT_PASSWORD=123 minio server http://192.168.68.150 /minio/data1 http://192.168.68.151 /minio/data2 \ http://192.168.68.152 /minio/data3 http://192.168.68.153 /minio/data4 \ http://192.168.68.154 /minio/data5 http://192.168.68.155 /minio/data6 \ http://192.168.68.156 /minio/data7 http://192.168.68.157 /minio/data8
二,伪分布式搭建
export MINIO_ROOT_USER=admin export MINIO_ROOT_PASSWORD=123 minio server http://192.168.68.134:9000 /minio/data1 http://192.168.68.134:9001 /minio/data2 \ http://192.168.68.134:9002 /minio/data3 http://192.168.68.134:9003 /minio/data4 \ http://192.168.68.134:9004 /minio/data5 http://192.168.68.134:9005 /minio/data6 \ http://192.168.68.134:9006 /minio/data7 http://192.168.68.134:9007 /minio/data8
二,Docker搭建集群
Docker搭建依赖于Docker Compose,Minio官方提供了docker集群搭建的方案,搭建集群的需要docker-compose.yml文件和nginx.conf文件
地址:https://docs.min.io/docs/deploy-minio-on-docker-compose.html
搭建前需要下载对于的docker-compose.yml和nginx.conf到当前目录,然后直接运行以下命令
docker-compose pull docker-compose up
三,拓展集群
export MINIO_ROOT_USER=admin export MINIO_ROOT_PASSWORD=123 minio server http://host{1...12} /minio/data{8...22}
五,Minio客户端的安装使用
一,安装配置minio客户端
一,Linux安装minio客户端
#1,下载mc客户端 wget https://dl.min.io/client/mc/release/linux-amd64/mc #2,添加权限为可执行程序 chmod +x mc #3,拷贝到/usr/bin目录中(这样再然后目录中都能使用) cp ./mc /usr/bin
二,Docker安装minio客户端
#1,拉取minio客户端镜像 docker pull minio/mc #2,运行客户端容器 docker run minio/mc ls play
三,Windowns安装minio客户端
#1,下载客户端运行程序 https://dl.min.io/client/mc/release/windows-amd64/mc.exe #2,运行 mc.exe
四,配置minio客户端(通用)
mc所有的配置都在~/.minio/config.json文件中,使用minio客户端必须配置minio服务地址,这样客户端才能进行控制
1,查看mc host配置
mc config host ls
2,添加minio服务
#格式:mc config host add minio服务名称 地址+端口号 用户名 密码 mc config host add minio-server http://192.168.68.134:9000 minioadmin minioadmin
3,移除minio服务
#格式:mc config host remove minio-server minio服务名称 mc config host remove minio-server wql_minio01
二,客户端的基本用法
不对每一个都举例描述了,minio中文文档上很详细
一,minio对桶(Bucket)的操作
1,创建桶
命令:mc mb 服务名称/bucket名称
#在server-wql的minio服务中创建一个名为fq的桶 mc mb server-wql/f
2,删除桶
命令:mc rb 服务名称/bucket名称
参数:
- --force:递归强制删除
#在server-wql的minio服务中删除一个名为fq的桶 mc rb server-wql/fq
3,查看桶磁盘的使用情况
命令:mc du 服务名称/bucket名称
#查看server-wql服务中fq的使用情况 mc du server-wql/fq
六,Minio客户端admin的使用
admin也是由Minio客户端提供的,是mc下面的子命令,mc命令主要是对文件进行操作,mc admin主要对文件进行权限策略操作,就好比linux中chmod一样
命令
- service - 重新启动和停止所有MinIO服务器
- update - 更新所有MinIO服务器
- info - 显示MinIO服务器信息
- user - 管理用户
- group - 管理组
- policy - 管理固定政策
- config - 管理服务器配置文件
- heal - 修复MinIO服务器上的磁盘,存储桶和对象
- profile - 生成用于调试目的的配置文件数据
- top - 为MinIO提供类似顶部的统计信息
- trace - 显示MinIO服务器的http跟踪
- console - 显示MinIO服务器的控制台日志
- prometheus - 管理prometheus配置设置
一,用户管理
1,新建用户
命令:mc admin user add 服务名称 用户名 密码
mc admin user add minio-wql wql 123
2,查看用户
命令:mc admin user list 服务名称
mc admin user list minio-wql
3,禁用用户
命令:mc admin user disable 服务名 用户名
mc admin user disable minio-wql wql
4,启用用户
命令:mc admin user enable 服务名 用户名
mc admin user enable minio-wql wql
5,查看用户信息
命令:mc admin user info 服务名 用户名
mc admin user info minio-wql wql
6,删除用户
命令:mc admin user remove 服务名 用户名
mc admin user remove minio-wql wql
二,策略管理
policy命令,用添加,删除,列出策略,获取相关策略的信息并为Minio服务器上的用户设置策略
Minio的策略管理可以对资源进行管理,其实很重要,策略管理需要写脚本然后把脚本添加进minio中
1,列出minio服务上的所有策略
命令:mc admin policy list 服务名称
mc admin policy list minio-wql
2,查看策略的详细信息
命令:mc admin policy info 服务名称 策略名称
mc admin policy info minio-wql readonly
3,添加策略
命令:mc admin policy add 服务名称 策略脚本位置
mc admin policy add minio-wql /home/policy_wql.json
4,设置用户的访问策略
命令:mc admin policy set 服务名称 用户名 策略设置
mc admin policy set minio-wql wql=fox
七,java操作Minio客户端
Minio java client SDK提供了简单的API来访问操作minio服务
官方dome:https://github.com/minio/minio-java/tree/master/examples
官方文档:https://docs.min.io/docs/java-client-api-reference.html
引入依赖:除了minio还有两个通信控件
<!--minio客户端--> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.3.3</version> </dependency> <dependency> <groupId>me.tongfei</groupId> <artifactId>progressbar</artifactId> <version>0.8.1</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.2</version> </dependency>
一,创建minio客户端对象
MInio client的创建使用了创建者模式,通过builder进行构建,在通过build进行最终对象生成,客户端对象封装了所有对minio的服务端操作方法
方法:
- endpoint():指定远程minio的url地址,可以string和URL类型
- credentials():指定用户名和密码(在minio中访问密钥对于账号,秘密密钥对于密码)
- build():构建一个minio客户端对象
MinioClient minioclient = MinioClient.builder() .endpoint("http://192.168.68.134:9000") .credentials("minioadmin","minioadmin") .build();
二,桶Bucket的操作
一,构建一个桶对象
创建桶以BucketExistArgs类为例
方法:
- Builder():构建一个桶
- bucket:桶的名称
- build:返回对象
BucketExistsArgs wql = BucketExistsArgs.builder().bucket("wql").
二,桶的创建,删除,判断是否存在
1,桶的创建
通过makeBucket(MakeBucketArgs args)方法创建桶
minioclient.makeBucket(MakeBucketArgs.builder().bucket("wql").build());
2,桶的删除
通过removeBucket(RemoveBucketArgs args)方法删除桶
minioclient.removeBucket(RemoveBucketArgs.builder().bucket("wql").build());
3,判断桶是否存在
通过bucketExists(BucketExistsArgs args)方法判断
BucketExistsArgs wql = BucketExistsArgs.builder().bucket("wql").build(); boolean b = minioclient.bucketExists(wql);
4,查看所有的桶
通过minioclient.listBuckets()方法获取所有桶的list
List<Bucket> buckets = minioclient.listBuckets();
三,文件的上传
一,构建一个上传对象
构建上传对象有两个类:
- UploadObjectArgs
- PutObjectArgs
方法:
- bucket(String name):指定桶的名称
- object(String name):指定上传后的文件名
- filename(String filename):要上传的文件地址
- contentType(String contentType):指定上传文件的类型
UploadObjectArgs upload = UploadObjectArgs.builder().bucket("wql").object("wql.jpg").filename("C:\\gg.jpg").build();
二,上传文件
minio有两个上传方法:
- uploadObject(UploadObjectArgs args):通过文件名上传
- putObject(PutObjectArgs args):通过Stream文件流进行上传
例:通过文件名上传
UploadObjectArgs upload = UploadObjectArgs.builder().bucket("wql").object("wql.jpg").filename("C:\\gg.jpg").build(); ObjectWriteResponse objectWriteResponse = minioclient.uploadObject(upload);
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109