Minio技术总结

这篇文章是对Minio的一些技术总结,详细内容可参见官方文档。

部署规范

Minio强烈建议使用XFS格式硬盘,因此在挂载磁盘以及格式化时,统一使用这种格式。

Minio保证所有的节点部署时,使用相同类型的磁盘(SSD或HDD),并且使用相同大小的容量。

Minio每块磁盘的最大使用量受限于容量最小的那块硬盘,即“木桶原理”。比如集群中有十块15TB的硬盘和一块1TB的硬盘,则Minio将限制每块硬盘的容量为1TB。

Minio强烈建议配置/etc/fstab,以便重启时,磁盘顺序不会改变。参见官方例子:

$ mkfs.xfs /dev/sdb -L DISK1
$ mkfs.xfs /dev/sdc -L DISK2
$ mkfs.xfs /dev/sdd -L DISK3
$ mkfs.xfs /dev/sde -L DISK4

$ nano /etc/fstab

 # <file system> <mount point> <type> <options>         <dump> <pass>
 LABEL=DISK1     /mnt/disk1     xfs     defaults,noatime  0       2
 LABEL=DISK2     /mnt/disk2     xfs     defaults,noatime  0       2
 LABEL=DISK3     /mnt/disk3     xfs     defaults,noatime  0       2
 LABEL=DISK4     /mnt/disk4     xfs     defaults,noatime  0       2

因此Minio可以使用{x…y}的格式,以连续序列的方式指定存储目录,比如/mnt/disk{1...4},或者可以指定一个子目录存储/mnt/disk{1...4}/minio

硬件推荐

  • Minio需要足够的内核数来计算散列值。强烈建议双Intel® Xeon® Scalable Gold CPU (每个插槽至少8核) 或任意带有AVX512 指令的CPU。
  • Minio推荐最小4个节点,每个节点关联4个磁盘。这种”4×4″的拓扑逻辑能够提供至少损失4块磁盘的容忍性或者1个节点,并且依然能够支持读写操作。
  • Minio推荐高速网络以支撑最大可能性的吞吐量。Minio受网络限制最大,因为低速网络不能最大限度利用磁盘的IO性能。
  • Minio的内存约束了并发的连接数。

下表列出了不同内存下最大的并发连接数:

磁盘数32 GiB of RAM64 GiB of RAM128 GiB of RAM256 GiB of RAM512 GiB of RAM
41,0742,1494,2978,59517,190
88401,6803,3616,72213,443
165851,1702,3414,6819,362

下表是推荐的单个节点建议的内存:

总的主机存储量推荐主机内存
达到1 Tebibyte (Ti)8GiB
达到10 Tebibyte (Ti)16GiB
达到100 Tebibyte (Ti)32GiB
达到1 Pebibyte (Pi)128GiB

软件推荐

  • Minio推荐运行具有 5.x+ 内核的 Linux 操作系统的服务器,例如 Red Hat Enterprise Linux (RHEL) 9 或 Ubuntu LTS 20.04+。
  • Minio推荐利用负载均衡处理请求,比如Nginx。
  • Minio推荐使用Prometheus / Grafana配置监控和指标体系。

历史数据删除

mc ilm add --expiry-days可以指定日期天数来删除过期的数据。

纠删码

Minio利用纠删码来保证数据冗余和高可用性。当集群中某一些节点或者磁盘失败时,能保证从其于的数据中重组对象数据,并且这种重组过程是实时的(On-The-Fly)。

Minio将每个对象分割成多个数据块奇偶校验块,奇偶校验块用来支持重组丢失或者损坏的数据块。

Minio将上述的多个块数据(数据块和奇偶校验块)写入单个纠删集合中。注:单个对象只写入某一个纠删集合,即使Minio集群中有多个纠删集合。因此一个节点仅仅只包含单个对象的一部分数据块或者校验块。

Minio的每个纠删集合最大支持容忍((N/2)-1)个磁盘损坏,并依然能支持读写操作。

纠删集合

Minio的纠删集合是由一系列磁盘组成的,以此来支持纠删码。

Minio会根据磁盘的总数,来决定纠删集合的个数,以及纠删集合中磁盘的个数。每个纠删集合的磁盘个数必须一致。每个纠删集合分配4-16块磁盘。当集群总数超过16块硬盘时,会将磁盘均匀分配到多个纠删集合中。

举例:
1、20块磁盘会被分配进2个纠删集合,每个纠删集合由10个磁盘。
2、28块磁盘会被分配进2个纠删集合,每个纠删集合由14个磁盘。
3、40块磁盘会被分配进4个纠删集合,每个纠删集合由10个磁盘。
像17,19,34这种不能被2-16的任何数字均匀整除,因此不可以部署这种数量的Minio集群。

Minio纠删集合步长大小将硬盘分解为4-16个。如果硬盘数不能被该区间整除,就不能组成集群。

Minio会将对象的数据块和校验块随机地并且均匀地以没有重叠的方式分布在单个纠删集合中的磁盘中。每个磁盘只保存单个数据块或者单个纠删块,不会有两块数据。

奇偶校验

Minio会根据Reed-Solomon算法来分割对象,分割的块数是根据纠删集合的磁盘个数来确定的。比如纠删集合是10块硬盘,则将数据切割成10份,其中M份数据,N份校验块,M+N=10。

Minio默认为每个对象使用4份校验块。越多纠删块,意味着容忍性更好,但是整体集群的实际数据存储率不高。更多的空间用来存储校验块数据了。这里面是可用性整体磁盘使用率的平衡考量。

Minio最多能忍受N个磁盘的损坏,并且继续支持读写操作,其中N表示奇偶校验块的个数。

Minio集群中如果N恰巧是1/2的磁盘总数,则写操作最少需要N+1个磁盘,来避免数据不一致(脑裂)。

以下表格是一个例子,一个节点,16块1TB的磁盘,不同的奇偶校验块个数对应的不同存储比例:

校验个数总存储存储比率读可用最少磁盘数写操作最少磁盘数
EC: 4 (默认)12 TB0.7501212
EC: 610 TB0.6251010
EC: 88 TB0.50089

存储策略

Minio支持两种存储策略,每个模式的奇偶校验块个数不一样:

  1. 默认是STANDARD模式,最小值2并且要大于等于REDUCED_REDUNDANCY模式(如果设置了的话),校验块默认个数如下,但是你可以用MINIO_STORAGE_CLASS_STANDARD修改默认配置,或者用mc admin config修改storage_class.standard配置。
  2. 纠删集大小默认校验块个数 (EC:N)5或更小EC:26 – 7EC:38或更多EC:4REDUCED_REDUNDANCY模式。更少的奇偶校验块,以达到最大存储容量的目的。该模式至少需要5个磁盘工作。默认值是2,该模式的EC值必须小于STANDARD值。可以通过MINIO_STORAGE_CLASS_RRS环境变量修改该配置。

如果需要对特定的对象修改存储策略,则利用x-amz-storage-class头信息。