Linux下的分布式Minio部署实践
分布式Minio部署可以将多块硬盘(位于相同机器或者不同机器)组成一个对象存储服务,避免单机环境下硬盘容量不足、单点故障等问题。
1. 简介
在当前的云计算和大数据时代,IT系统通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助搭建一个高可靠、高可用、弹性扩展的对象存储服务。
分布式部署,minio拓扑为Multi-Node Multi-Drive (MNMD), 即多个节点,每个节点有多个磁盘。可用于如下场景:
-
企业级的高性能对象存储。
-
多节点/多硬盘级别的可靠性,可配置容忍最多 1/2 节点或硬盘的损失。
-
用于AI/ML、分布式查询、分析以及其他数据湖组件的主要存储。
-
可扩展到 PB 级别的工作负载,具备存储容量和性能的双重扩展能力。
2. minio的数据保护机制
2.1 Erasure Code(纠删码)
Minio 使用 Erasure Code 提供数据的冗余:
- 分布式 Minio 采用
Erasure Code
来防范多个节点宕机和位衰减。 - 分布式 Minio 至少需要 4 个节点(4台服务器),使用分布式 Minio 就会自动启用纠删码功能。
Erasure Code
是一种恢复丢失和损坏数据的数学算法, Minio 采用Reed-Solomon Code
将对象拆分成 N/2 数据 和 N/2 奇偶校验块。MinIO 在 N / 2 个数据盘 和 N / 2 个奇偶校验盘上分片对象。这就意味着如果是12块盘, 一个对象会被分成6个数据块、6个奇偶校验块, 可以丢失任意6块盘的情况下(不管其是存放的数据块还是奇偶校验块), 仍可以从剩下的盘中的数据进行读取和恢复。- Minio 纠删码是作用在对象级别,可以一次恢复一个对象,而RAID 是作用在卷级别,数据恢复时间很长。Minio 对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。
DataDrives :
纠删码中的数据盘,用来存储 Object 原始数据。ParityDrives:
纠删码中的校验盘,用来存储 Object 计算出来的校验数据。- Minio 纠删码的默认配置为
1 : 1
, 即数据盘 ( DataDrives )和 校验盘 ( ParityDrives ) 个数相同, 使用minio分布式部署最终真正可用的存储空间,只有所有磁盘总空间的一半大小。 - 一个
ErasureCode 组/ Sets
中有多个 Drive(DataDrives + ParityDrives), Minio 会先将一块 Block 按照 Drives 数量, 划分为多个小块, 这些小块在 Minio 中叫做 Shards。比如一个 Block 是 10MB, 而 Set 里有 16 个 Drive(8 DataDrives + 8 ParityDrives), 此时 Minio 会将 Block 按照 10 MB / 8 DataDrives 的方式,将数据划分到 8 个 Data Shards,并额外再创建 8 个 空 Shards,用来存储编码后的冗余数据。 - 接着 Minio 就会对
Data Shards
进行纠删码编码, 并将编码后的冗余数据存储到前面创建的 8 个空 Shards 中, 也就是parity shards
中。
2.2 数据保护
分布式 MinIO 使用 Erasure Code
提供针对 多个节点/驱动器 故障 和 Bit Rot
保护。
- 由于分布式 MinIO 所需的 最小磁盘为 4(与擦除编码所需的最小磁盘相同), 因此在您启动分布式 MinIO 时,擦除代码会自动启动。
- 因此 只要
m / 2
个服务器 或m * n / 2
个或更多磁盘在线, 具有 m个服务器 和 n个磁盘 的分布式 MinIO 设置将使您的数据安全。 ( M 表示 服务器总数, N 表示 数据库盘 总数 ) Erasure Code
是用来保证 Object 的每个 Block 的数据正确和可恢复的, 而Bitrot
技术是用来检验磁盘数据的正确性的。Erasure Code
技术比较复杂, 但是Bitrot
技术就比较简单了。本质就是在写数据之前, 先计算好数据的 hash, 然后将 hash 先写入磁盘, 再写入需要存储的数据。这样读取数据时,就可以通过重新计算 hash,和原始写入的 hash进行一致性比较,来判断数据是否有损坏。- 上传文件时,Minio 不是直接上传到 object 在磁盘的最终存储目录的,而是先写到一个临时目录,等所有数据都写到临时目录后,Minio 才会进行 rename 操作,将 object 数据存储到最终存储目录。
3. 部署分布式Minio
3.1 环境准备
机器准备
hostname | os | 配置 | ip | disk |
---|---|---|---|---|
minioserver1 | centos7.9 | 8C32G | 192.168.1.10 | vdb,vdc,vdd,vde |
minioserver2 | centos7.9 | 8C32G | 192.168.1.11 | vdb,vdc,vdd,vde |
minioserver3 | centos7.9 | 8C32G | 192.168.1.12 | vdb,vdc,vdd,vde |
minioserver4 | centos7.9 | 8C32G | 192.168.1.13 | vdb,vdc,vdd,vde |
- 各节点按照上表信息完成基础配置。
- 各节点配置ntp服务,确保时间同步。
- 各节点关闭防火墙或者放行9000和9001端口:
firewall-cmd --permanent --zone=public --add-port=9000-9001/tcp
firewall-cmd --reload
磁盘和挂载点准备
本文以4节点的分布式Minio为例,每个节点4块盘为例。将4块盘分别挂载到4个节点上,并在每个节点上创建目录。
- 格式化磁盘并配置挂载点
]# cat disk-mount.sh
#!/bin/bash
mkfs.xfs /dev/vdb -L DISK1
mkfs.xfs /dev/vdc -L DISK2
mkfs.xfs /dev/vdd -L DISK3
mkfs.xfs /dev/vde -L DISK4
mkdir -p /data/minio/data0{
1..4}
cat >> /etc/fstab <<-EOF
LABEL=DISK1 /data/minio/data01 xfs defaults,noatime 0 2
LABEL=DISK2 /data/minio/data02 xfs defaults,noatime 0 2
LABEL=DISK3 /data/minio/data03 xfs defaults,noatime 0 2
LABEL=DISK4 /data/minio/data04 xfs defaults,noatime 0 2
EOF
mount -a
在4个节点依次执行上述脚本sh disk-mount.sh
,确保硬盘挂载到相应目录:
]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT