简介

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

官网:https://min.io/ http://www.minio.org.cn/

对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。

对于中小型企业,如果不选择存储上云,那么 Minio 是个不错的选择,麻雀虽小,五脏俱全。当然Minio 除了直接作为对象存储使用,还可以作为云上对象存储服务的网关层,无缝对接到 Amazon S3、MicroSoft Azure。

在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品。

Minio优点

部署简单: 一个single二进制文件即是一切,还可支持各种平台。
minio支持海量存储,可按zone扩展(原zone不受任何影响),支持单个对象最大5TB;
兼容Amazon S3接口,充分考虑开发人员的需求和体验;
低冗余且磁盘损坏高容忍,标准且最高的数据冗余系数为2(即存储一个1M的数据对象,实际占用磁盘空间为2M)。但在任意n/2块disk损坏的情况下依然可以读出数据(n为一个纠删码集合(Erasure Coding Set)中的disk数量)。并且这种损坏恢复是基于单个对象的,而不是基于整个存储卷的。
读写性能优异

MinIO的基础概念

Object:存储到 Minio 的基本对象,如文件、字节流,Anything...
Bucket:用来存储 Object 的逻辑空间。每个 Bucket 之间的数据是相互隔离的。对于客户端而言,就相当于一个存放文件的顶层文件夹。
Drive:即存储数据的磁盘,在 MinIO 启动时,以参数的方式传入。Minio 中所有的对象数据都会存储在 Drive 里。
Set :即一组 Drive 的集合,分布式部署根据集群规模自动划分一个或多个 Set ,每个 Set 中的Drive 分布在不同位置。一个对象存储在一个 Set 上。(For example: {1...64} is divided into 4 sets each of size 16.)
    一个对象存储在一个Set上
    一个集群划分为多个Set
    一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出
    一个SET中的Drive尽可能分布在不同的节点上

纠删码EC(Erasure Code)

MinIO 使用纠删码机制来保证高可靠性,使用 highwayhash 来处理数据损坏( Bit Rot Protection )。

关于纠删码,简单来说就是可以通过数学计算,把丢失的数据进行还原,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。

存储形式

文件对象上传到 MinIO ,会在对应的数据存储磁盘中,以 bucket1 名称为目录,文件名称为下一级目录,文件名下是 part.1 和 xl.meta,前者是编码数据块及检验块,后者是元数据文件。

linux 在指定目录下执行 tree 命令(yum install tree 先安装下)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
├── data
│   └── bucket1
│   └── 104.0.5112.81_chrome_installer-win64.exe
│   ├── a5d0f77e-328c-4987-894a-95dc5b603dab
│   │   └── part.1 # 这个是86MB的文件
│   └── xl.meta

[4.0K] .
├── [4.0K] data
│   └── [4.0K] bucket1
│   └── [4.0K] 104.0.5112.81_chrome_installer-win64.exe
│   ├── [4.0K] a5d0f77e-328c-4987-894a-95dc5b603dab
│   │   └── [ 85M] part.1
│   └── [ 365] xl.meta

Minio环境搭建

磁盘文件格式

官方文档推荐磁盘文件格式使用 xfs

多磁盘

磁盘需要保持一致

文件格式一致
容量一致
每个区使用偶数数量的磁盘,便于纠删码模式
每个区的磁盘数量需要一致,所以扩展后新的区和原始区的磁盘的数量、容量、格式都是一致的

单机部署

minio server的standalone模式,即要管理的磁盘都在host本地。该启动模式一般仅用于实验环境、测试环境的验证和学习使用。在standalone模式下,还可以分为non-erasure code mode和erasure code mode。

non-erasure code mode

在此启动模式下,对于每一份对象数据,minio直接在data下面存储这份数据,不会建立副本,也不会启用纠删码机制。因此,这种模式无论是服务实例还是磁盘都是“单点”,无任何高可用保障,磁盘损坏就表示数据丢失。

如下 这样命令行直接启动 跟上一个目录就是这种模式的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mamh@vm:~$ ./minio server ./data
INFO: Formatting 1st pool, 1 set(s), 1 drives per set.
INFO: WARNING: Host local has more than 0 drives of set. A host failure will result in data becoming unavailable.
MinIO Object Storage Server
Copyright: 2015-2024 MinIO, Inc.
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Version: RELEASE.2024-07-13T01-46-15Z (go1.22.5 linux/amd64)

API: http://192.168.1.106:9000 http://127.0.0.1:9000
RootUser: minioadmin
RootPass: minioadmin

WebUI: http://192.168.1.106:39287 http://127.0.0.1:39287
RootUser: minioadmin
RootPass: minioadmin

CLI: https://min.io/docs/minio/linux/reference/minio-mc.html#quickstart
$ mc alias set 'myminio' 'http://192.168.1.106:9000' 'minioadmin' 'minioadmin'

Docs: https://min.io/docs/minio/linux/index.html
WARN: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables

单机一个磁盘的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
├── data
│   └── bucket1
│   └── 104.0.5112.81_chrome_installer-win64.exe
│   ├── a5d0f77e-328c-4987-894a-95dc5b603dab
│   │   └── part.1 # 这个是86MB的文件
│   └── xl.meta

[4.0K] .
├── [4.0K] data
│   └── [4.0K] bucket1
│   └── [4.0K] 104.0.5112.81_chrome_installer-win64.exe
│   ├── [4.0K] a5d0f77e-328c-4987-894a-95dc5b603dab
│   │   └── [ 85M] part.1
│   └── [ 365] xl.meta

erasure code mode

此模式为minio server实例传入多个本地磁盘参数。一旦遇到多于一个磁盘参数,minio server会自动启用erasure code mode。erasure code对磁盘的个数是有要求的,如不满足要求,实例启动将失败。 erasure code启用后,要求传给minio server的endpoint(standalone模式下,即本地磁盘上的目录)至少为4个。

要有4个磁盘挂载才行,只是搞4个目录启动是会有问题的。

1
2
3
4
5
6
7
8
9
10
mamh@vm:~$ ./minio server data{5..8}  # 只是搞4个目录启动是会有问题的。
INFO: Unable to use the drive /home/mamh/data5: drive not found, will be retried
INFO: Unable to use the drive /home/mamh/data6: drive not found, will be retried
INFO: Unable to use the drive /home/mamh/data7: drive not found, will be retried
INFO: Unable to use the drive /home/mamh/data8: drive not found, will be retried
INFO: Unable to use the drive /home/mamh/data5: drive not found, will be retried
INFO: Unable to use the drive /home/mamh/data6: drive not found, will be retried
INFO: Unable to use the drive /home/mamh/data7: drive not found, will be retried
INFO: Unable to use the drive /home/mamh/data8: drive not found, will be retried
INFO: Waiting for a minimum of 2 drives to come online (elapsed 0s)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mamh@vm:~$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 791M 1.4M 789M 1% /run
/dev/sda2 20G 7.2G 12G 39% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 791M 4.0K 791M 1% /run/user/1000
/dev/sdb1 20G 220M 20G 2% /home/mamh/data1
/dev/sdc1 20G 220M 20G 2% /home/mamh/data2
/dev/sdd1 20G 220M 20G 2% /home/mamh/data3
/dev/sde1 20G 220M 20G 2% /home/mamh/data4

mamh@vm:~$ ./minio server --json data{1..4}
{"level":"INFO","time":"2024-07-13T04:57:04.126540601Z","message":"Formatting 1st pool, 1 set(s), 4 drives per set."}
{"level":"INFO","time":"2024-07-13T04:57:04.126733202Z","message":"WARNING: Host local has more than 2 drives of set. A host failure will result in data becoming unavailable."}
{"level":"INFO","time":"2024-07-13T04:57:04.14233725Z","message":"MinIO Object Storage Server"}
{"level":"INFO","time":"2024-07-13T04:57:04.142381838Z","message":"Copyright: 2015-2024 MinIO, Inc.\nLicense: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html\nVersion: RELEASE.2024-07-13T01-46-15Z (go1.22.5 linux/amd64)\n"}
{"level":"INFO","time":"2024-07-13T04:57:04.14241911Z","message":"API: http://192.168.1.106:9000 http://127.0.0.1:9000 "}
{"level":"INFO","time":"2024-07-13T04:57:04.142453163Z","message":"WebUI: http://192.168.1.106:42729 http://127.0.0.1:42729 "}
{"level":"INFO","time":"2024-07-13T04:57:04.142471188Z","message":"\nDocs: https://min.io/docs/minio/linux/index.html"}
{"level":"WARNING","time":"2024-07-13T04:57:04.142487379Z","message":"Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables","error":{"message":"Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables","source":[""]}}


单机4个硬盘的情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

mamh@vm:~$ tree -h
[4.0K] .
├── [ 38] data1
│   └── [ 54] bucket
│   └── [ 65] 107.0.5304.10_chrome_installer-win64.exe
│   ├── [ 20] e94fd009-4754-4e1c-90ae-2fea05a1ffbb
│   │   └── [ 44M] part.1
│   └── [ 368] xl.meta
├── [ 38] data2
│   └── [ 54] bucket
│   └── [ 65] 107.0.5304.10_chrome_installer-win64.exe
│   ├── [ 20] e94fd009-4754-4e1c-90ae-2fea05a1ffbb
│   │   └── [ 44M] part.1
│   └── [ 368] xl.meta
├── [ 38] data3
│   └── [ 54] bucket
│   └── [ 65] 107.0.5304.10_chrome_installer-win64.exe
│   ├── [ 20] e94fd009-4754-4e1c-90ae-2fea05a1ffbb
│   │   └── [ 44M] part.1
│   └── [ 368] xl.meta
├── [ 38] data4
│   └── [ 54] bucket
│   └── [ 65] 107.0.5304.10_chrome_installer-win64.exe
│   ├── [ 20] e94fd009-4754-4e1c-90ae-2fea05a1ffbb
│   │   └── [ 44M] part.1
│   └── [ 368] xl.meta
├── [4.0K] data5
├── [4.0K] data6
├── [4.0K] data7
├── [4.0K] data8
├── [4.0K] data9
└── [ 99M] minio

21 directories, 9 files