MinIO

发布于 2021-10-22  5.97k 次阅读


一,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的优点:

  1. 部署简单:执行一个single的二进制执行文件即可
  2. 支持海量数据存储:单对象最大为5TB
  3. 低冗余容错性高:标准且最高的数据冗余系数为2(即存储一个1MB的数据对象,实际占用的磁盘空间为2MB),但是任意的n/2块disk损坏的情况下依然可以读出数据
  4. 读写性能高:读写速率最高可以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集群

一,完全分布式搭建

搭建8个节点,每个节点一块盘,在每一个节点上运行以下命令
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

二,伪分布式搭建

搭建8个节点,每个节点一块盘,使用不同的端口代替不同的主机
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

三,拓展集群

minio拓展集群也非常简单,只需要在新的机器上进行添加即可,再进行运行添加即可
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

二,客户端的基本用法

ls - 列出存储桶和对象 mb - 创建存储桶 cat - 合并对象
cp - 拷贝对象 rm - 删除对象 pipe - Pipe到一个对象
share - 共享 mirror - 存储桶镜像 find - 查找文件和对象
diff - 比较存储桶差异 policy - 给存储桶或前缀设置访问策略  
config - 管理配置文件 watch - 事件监听 events - 管理存储桶事件
update - 管理软件更新 version - 显示版本信息  

不对每一个都举例描述了,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的操作

一,构建一个桶对象

桶的创建的也是通过创建者模式,桶的顶级父类是BaseArgs,直接子类是BucketArgs,在BucketArgs下面实现了很多个创建桶子类

创建桶以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);

四,文件下载

一,构建文件下载对象

通过DownloadObjectArgs类构建文件下载对象

方法:

  • bucket(String name):指定桶的名称
  • object(String name):指定下载的文件名
  • filename(String filename):下载后保存的目录和名称
  • contentType(String contentType):指定下载文件的类型

二,下载文件

minio也提供了两个下载方法:

  • downloadObject(DownloadObjectArgs args)
  • getObject(GetObjectArgs args
DownloadObjectArgs download = DownloadObjectArgs.builder().filename("d:\\hh.jpg").bucket("wql").object("wql.jpg").build();
minioclient.downloadObject(download);

八,SpringBoot整和Minio

SpringBoot整合Minio的API操作其实是一样,MinIO并没有提供SpringBoot自动装配的功能,需要自己进行配置

① 引入配置文件

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
</dependency>

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <optional>true</optional>
</dependency>

<dependency>
   <groupId>io.minio</groupId>
   <artifactId>minio</artifactId>
   <version>8.3.3</version>
</dependency>

② 写properties配置 

minio.endpoint=http://192.168.68.134:9000
minio.accessKey=minioadmin
minio.secretKey=minioadmin

③ 映射有properties配置(因为springboot没有自动装配)

@Data//这是lombok提供的自动set和get
@Component
@ConfigurationProperties(prefix = "minio") //映入配置文件,前缀为minio
public class MinioYml {

    private String endpoint;
    private String accessKey;
    private String secretKey;


}

④ 配置配置类

@Configuration
public class mininconfig {

    @Autowired
    MinioYml minioYml;

    @Bean
    public MinioClient minioClient(){


        MinioClient minioclient = MinioClient.builder().endpoint(minioYml.getEndpoint())
                .credentials(minioYml.getAccessKey(), minioYml.getSecretKey()).build();


        return minioclient;
    }
}

后面的就是自动注入minioclient进行API操作,和原生API是一样的