一、分布式文件系统应用场景
互联网海量非结构化数据的存储需求·
- 电商网站:海量商品图片
- 视频网站:海量视频文件网盘:海量文件
- 社交网站:海量图片
二、minio的基础概念
2.1 基础感念
- Object
存储到minio的基本对象,如文件、字节流、anything - Bucket
用来存储Object的逻辑空间,每个Bucket的数据是独立的。相当于客户端的顶层文件夹。 - Drive
即存储数据的磁盘,在MinlO启动时,以参数的方式传入。Minio中所有的对象数据都会存储在Drive里。 - Set
- 即一组Drive 的集合,分布式部署根据集群规模自动划分一个或多个Set,每个Set中的Drive分布在不同位置。一个对象存储在一个Set上。(For example: {1…64} is divided into 4 sets each of size 16.)
2.2 纠删码EC
MinlO使用纠删码机制来保证高可靠性,使用highwayhash来处理数据损坏( Bit Rot Protection )。关于纠删码简单来说就是可以通过数学计算,把丢失的数据进行还原,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。
三、使用docker运行部署
3.1 docker命令启动minio(单个磁盘,无纠删码)(9000端口为api控制,50000为控制台端口)账号密码都为admin
docker run --name minio -d \
-p 9000:9000 \
-p 50000:50000 \
-v /mnt/minio/data:/data \
-e MINIO_ROOT_USER="admin" \
-e MINIO_ROOT_PASSWORD="123456789" \
minio/minio:latest server --console-address ":50000" /data
3.2 纠删码模式启动minio
docker run --name minio -d \
-p 9000:9000 \
-p 50000:50000 \
-v /mnt/minio/data1:/data1 \
-v /mnt/minio/data2:/data2 \
-v /mnt/minio/data3:/data3 \
-v /mnt/minio/data4:/data4 \
-v /mnt/minio/data5:/data5 \
-v /mnt/minio/data6:/data6 \
-v /mnt/minio/data7:/data7 \
-v /mnt/minio/data8:/data8\
-e MINIO_ROOT_USER="admin" \
-e MINIO_ROOT_PASSWORD="123456789" \
minio/minio:latest server /data{1...8} --console-address ":50000"
8个文件存在于八个driver,4个为存放校验码,4个存放数据,可以通过纠错码进行恢复。
3.3 分布式集群部署minio
- 数据保护
分布式Minio采用 纠删码来防范多个节点宕机和位衰减 bit rot 。分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。- 高可用
单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的
数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。
例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不
过你需要9台服務器才能写数据。- 一致性
Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。
集群部署完成可以通过nginx负载均衡,让集群有一个统一的入口。
3.4 下载minio client 以及使用
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --help
mv mc /usr/local/sbin/
# 查询mc host配置,配置到.mc/cinfig.json中
mc config host ls
# 添加minio服务
mc config host add minio-server http://192.168.229.130:9000 admin 123456789
# 删除host
mc config host remove minio-server
3.5 mc命令的使用
mc admin的使用
策略权限
Action为操作行为,Resource为资源
四、java操作minio
4.1 引入依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.0</version>
</dependency>
<dependency>
<groupId>me.tongfei</groupId>
<artifactId>progressbar</artifactId>
<version>0.5.3</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.8.1</version>
</dependency>
4.2 编写上传代码
//连接minio
MinioClient minioClient = MinioClient.builder().endpoint("http:192.168.229.130:9000")
.credentials("admin", "123456789")
.build();
//创建bucket
String bucketName = "test";
boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if(!isExist){
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
minioClient.uploadObject(UploadObjectArgs.builder()
.bucket(bucketName)
.object("77.jpg")
.filename("C:\\Users\\86158\\Pictures\\QQ图片20210829121954.jpg")//本地磁盘路径
.build());
4.3 编写下载代码
minioClient.downloadObject(DownloadObjectArgs.builder()
.bucket(bucketName)
.object("77.jpg")
.filename("77.jpg")
.build());