如何部署分布式对象存储MinIO?

MinIO

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

如何基于RHEL 8.x二进制部署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

没有评论

发表回复

MinIO
如何使用MinFS挂载MinIO?

1 基础知识 1.1 MinFS的介绍 – MinFS是适用于Amazon S3兼容对象 …

MinIO
如何设置MinIO的桶和权限?

1 前言 一个问题,一篇文章,一出故事。 笔者需要学习创建MinIO存储的桶和权限,于是整理此文。 …

MinIO
如何部署MinIO客户端?

1 基础知识 – MinIO Client简称mc – MinIO Clie …