
1 基础知识
1.1 纠删码
1.1.1 纠删码的介绍
– 纠删码是一种用于重建丢失或损坏数据的数学算法
– MinIO使用里德-所罗门码(Reed-Solomon code)将对象分片为可变数据和奇偶校验块
– MinIO以12个驱动器数据分片为例,支持6个数据和6个奇偶校验块到10个数据和2个奇偶校验块
– MinIO默认情况下会以N/2个数据和N/2奇偶校验块的方式来进行驱动器分片(支持自定义)
– MinIO默认数据分片方式,12个驱动器支持丢失6个驱动器中的仍然可以重建数据
1.1.2 纠删码的作用
– MinIO使用纠删码和校验和保护数据
– MinIO使用最高级别的冗余允许丢失一半(N/2)的驱动器仍然可以恢复数据
1.1.3 纠删码特点
– 纠删码可以保护数据免受多个驱动器故障的影响
– RAID6允许两个驱动器故障而MinIO纠删码允许丢失一半的驱动器
– RAID属于卷级别的纠删码而MinIO纠删码是基于对象实现的纠删码(不用停机)
1.2 位腐烂保护
– 位腐烂保护是Bit Rot protection的翻译
– 位腐烂也成为数据腐烂或无声数据损坏
– 位腐烂是指驱动器的数据可能会以悄无声息的方式损坏,而不会发出错误信号
– MinIO的纠删码后端使用高速的HighwayHash校验来防止位腐烂
1.3 分布式MinIO
1.3.1 分布式MinIO的介绍
– 分布式MinIO允许多个驱动器(允许跨主机)汇聚到单个对象存储服务器中
– 分布式MinIO允许一个以上节点故障同时确保数据的完整性
1.3.2 分布式MinIO的作用
– 数据保护,使用最高级别的冗余允许丢失一半(N/2)的驱动器仍然可以恢复数据
– 高可用性,16节点的分布式设置允许4个服务器离线服务不受到影响
– 数据一致,MinIO准守read-after-write和list-after-write一致性模型保证数据一致性
1.3.3 分布式MinIO的条件
– MinIO的各节点需要一致的根凭证(即相同的MINIO_ROOT_USER与MINIO_ROOT_PASSWORD)
– MinIO创建每组4-16个驱动器的纠删码集(EC集),驱动器的总数必须是EC集数量的倍数
– MinIO的EC集内每个节点提供的驱动器数量必须相同
– MinIO每个数据对象都写入单个EC集(不超过16个驱动器)
– MinIO建议节点配置一致(相同的操作系统、相同数量的磁盘和相同的网络连接)
– MinIO所需的新目录可以与其他应用程序共享(只需建立独有的子目录即可)
– MinIO节点间的时间差异不能大于15分钟(建议使用NTP确保时间的一致性)
– MinIO运行于Windows建议仅用于实验环境
1.3.4 分布式MinIO的架构
2 最佳实践
2.1 准备服务器
2.1.1 服务器信息
hostname = minio0[1-4].cmdschool.org
vhostname = minio.cmdschool.org(用于负载均衡器或指向任意一个节点)
ip address = 10.168.0.6[0-3]
os = rhel 8.x x86_64
注:以上域名与IP的对应关系请配置DNS解析(不能使用hosts配置代替)
2.1.2 配置公钥认证
In minio01,
ssh-keygen ssh-copy-id -i ~/.ssh/id_rsa.pub minio01 ssh-copy-id -i ~/.ssh/id_rsa.pub minio02 ssh-copy-id -i ~/.ssh/id_rsa.pub minio03 ssh-copy-id -i ~/.ssh/id_rsa.pub minio04
如果你不是很了解公钥认证,请参阅如下文档,
2.1.3 部署MinIO
https://www.cmdschool.org/archives/1741
2.1 手动调试MinIO集群
2.1.1 停止所有节点的服务
In minio01,
ssh minio01 systemctl stop minio.service ssh minio02 systemctl stop minio.service ssh minio03 systemctl stop minio.service ssh minio04 systemctl stop minio.service
2.1.2 清空旧的单机运行数据
In minio01,
ssh minio01 rm -rf /data/minio/.minio.sys/ ssh minio02 rm -rf /data/minio/.minio.sys/ ssh minio03 rm -rf /data/minio/.minio.sys/ ssh minio04 rm -rf /data/minio/.minio.sys/
需要注意的是,测试结果是删除“/data/minio/.minio.sys”即可,你也可以删除“/data/minio”后重建
2.1.3 手动启动每个节点服务
In minio0[1-4],
su - minio
以上切换至普通用户“minio”的用户环境,然后定义如下环境变量,
export MINIO_ROOT_USER="minio" export MINIO_ROOT_PASSWORD="miniopwd" export MINIO_ADDRESS=":9000" export MINIO_LISTENERS="1" export MINIO_CONSOLE_ADDRESS=":9001" export MINIO_DOMAIN="minio.cmdschool.org" export MINIO_SERVER_URL="https://minio.cmdschool.org:9000"
然后,我们使用如下命令启动服务,
/usr/local/bin/minio server https://minio01.cmdschool.org/data/minio \ https://minio02.cmdschool.org/data/minio \ https://minio03.cmdschool.org/data/minio \ https://minio04.cmdschool.org/data/minio
更加简洁地,我们使用带有通配符的命令启动服务,
/usr/local/bin/minio server https://minio{01...04}.cmdschool.org/data/minio
启动第一个节点可见如下提示,
Following servers are currently offline or unreachable [https://minio02.cmdschool.org:9000/data/minio https://minio03.cmdschool.org:9000/data/minio https://minio04.cmdschool.org:9000/data/minio] Waiting for atleast 1 remote servers to be online for bootstrap check
启动第二和三个节点可见如下提示,
API: SYSTEM() Time: 07:21:45 UTC 06/08/2022 Error: Marking https://minio04.cmdschool.org:9000/minio/storage/data/minio/v45 temporary offline; caused by Post "https://minio04.cmdschool.org:9000/minio/storage/data/minio/v45/readall?disk-id=&file-path=format.json&volume=.minio.sys": dial tcp 10.168.0.63:9000: connect: connection refused (*fmt.wrapError) 7: internal/logger/logger.go:278:logger.LogIf() 6: internal/rest/client.go:151:rest.(*Client).Call() 5: cmd/storage-rest-client.go:153:cmd.(*storageRESTClient).call() 4: cmd/storage-rest-client.go:542:cmd.(*storageRESTClient).ReadAll() 3: cmd/format-erasure.go:393:cmd.loadFormatErasure() 2: cmd/format-erasure.go:332:cmd.loadFormatErasureAll.func1() 1: internal/sync/errgroup/errgroup.go:123:errgroup.(*Group).Go.func1() Waiting for all other servers to be online to format the disks (elapses 4m21s)
启动第四个节点可见如下提示,
Formatting 1st pool, 1 set(s), 4 drives per set. Waiting for all MinIO sub-systems to be initialized.. lock acquired Automatically configured API requests per node based on available memory on the system: 19 All MinIO sub-systems initialized successfully in 88.840611ms Waiting for all MinIO IAM sub-system to be initialized.. lock acquired Status: 4 Online, 0 Offline. API: https://minio01.cmdschool.org:9000 RootUser: minio RootPass: miniopwd Console: https://10.168.0.60:9001 https://127.0.0.1:9001 RootUser: minio RootPass: miniopwd Command-line: https://docs.min.io/docs/minio-client-quickstart-guide $ mc alias set myminio https://minio01.cmdschool.org:9000 minio miniopwd Documentation: https://docs.min.io Finished loading IAM sub-system (took 0.0s of 0.1s to load data). Waiting for all other servers to be online to format the disks (elapses 4m21s)
注:从以上启动过程可知,集群至少需要4个节点才能正常启动。
2.2 使用Systemctl控制MinIO集群
In minio0[1-4],
2.2.1 修改配置文件
vim /etc/default/minio
配置修改如下,
MINIO_VOLUMES="https://minio{01...04}.cmdschool.org/data/minio" MINIO_ROOT_USER="minio" MINIO_ROOT_PASSWORD="miniopwd" MINIO_ADDRESS=":9000" MINIO_LISTENERS="1" MINIO_CONSOLE_ADDRESS=":9001" MINIO_DOMAIN="minio.cmdschool.org" MINIO_SERVER_URL="https://minio.cmdschool.org:9000"
2.2.2 启动服务
systemctl start minio.service systemctl status minio.service
2.2.3 测试服务访问
https://minio.cmdschool.org:9001
参阅文档
=====================
纠删码
————–
https://docs.min.io/docs/minio-erasure-code-quickstart-guide
分布式部署
———————
https://docs.min.io/docs/distributed-minio-quickstart-guide.html
没有评论