Minio分布式存储入门(使用新版本)

一、分布式文件系统应用场景

互联网海量非结构化数据的存储需求·

  • 电商网站:海量商品图片
  • 视频网站:海量视频文件网盘:海量文件
  • 社交网站:海量图片

二、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"

Minio分布式存储入门(使用新版本)_第1张图片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命令的使用

Minio分布式存储入门(使用新版本)_第2张图片

mc admin的使用
Minio分布式存储入门(使用新版本)_第3张图片
策略权限

Action为操作行为,Resource为资源

Minio分布式存储入门(使用新版本)_第4张图片

四、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());

你可能感兴趣的:(java,分布式,docker,java)