MinIO 存储原理
Core Operational Concepts — MinIO Object Storage for Linux
一个 MinIO 集群由一个或多个服务器池组成,不同的服务器池之间互相独立,互不影响。写入请求会根据每个服务器池的剩余可用容量多少分配写入每一个服务器池的概率。
一个服务器池中含有若干服务器节点(推荐至少 4 个),这些节点需要拥有相同数量相同容量的硬盘。一个服务器池中的所有硬盘会被分入若干个大小完全相同的纠错集,在服务器池创建时,MinIO 会初始化纠错集分配,随后不能再改变。每个纠错集类似一个独立的 RAID 系统,在全局设置纠错数(EC 值)后,会保留纠错集中的纠错数个硬盘作为纠错盘,其他硬盘作为数据盘。集群能够在每个纠错集不失去超过纠错数个硬盘的情况下保持数据的完整性。
MinIO | Erasure Code Calculator
在 2x34 的服务器配置中有如下方案:
- 纠错集大小 4,纠错数 2,最终存储空间效率 50%,允许一台服务器故障,允许最多 34 块硬盘故障(非任意)。
- 纠错集大小 4,纠错数 1,最终存储空间效率 75%,不允许服务器故障,允许最多 17 块硬盘故障(非任意)。
- 纠错集大小 2,纠错数 1,最终存储空间效率 50%,允许一台服务器故障,允许最多 34 块硬盘故障(非任意)。
测试环境
PVE 虚拟机两台:
- 4C8G。
- 挂载 4 块硬盘。
- 地址分别为
192.168.1.201/24
,192.168.1.202/24
。
初始化
创建虚拟机,安装操作系统(Ubuntu 24.04)。
为每台虚拟机分配数据盘:
在两台服务器上执行 fdisk -l
,可找到数据盘在 /dev/sdb
~ /dev/sde
。
安装
下载并安装 MinIO 和 MinIO Client(mc):
curl https://dl.min.io/server/minio/release/linux-amd64/minio \
--create-dirs \
-o /usr/local/bin/minio
curl https://dl.min.io/client/mc/release/linux-amd64/mc \
--create-dirs \
-o /usr/local/bin/mc
chmod +x /usr/local/bin/minio
chmod +x /usr/local/bin/mc
格式化数据盘至 XFS 并且为每个数据盘设置不同的标签(便于故障时替换)。
注意将一个服务器池中的硬盘挂载在拥有连续数字编号的一些目录下。
mkfs.xfs /dev/sdb -L DISK1
mkfs.xfs /dev/sdc -L DISK2
mkfs.xfs /dev/sdd -L DISK3
mkfs.xfs /dev/sde -L DISK4
mkdir /data/disk{1..4} -p
vim /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
LABEL=DISK1 /data/disk1 xfs defaults,noatime 0 2
LABEL=DISK2 /data/disk2 xfs defaults,noatime 0 2
LABEL=DISK3 /data/disk3 xfs defaults,noatime 0 2
LABEL=DISK4 /data/disk4 xfs defaults,noatime 0 2
mount -a
systemctl daemon-reload
创建服务启动用户并设置数据盘属主:
groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /data/disk{1..4}
创建服务器池时需要服务器在连续 IP 段,如不能满足需要修改 hosts,给他们分配连续的 DNS 记录,使用连续数字编号即可。
写入 MinIO 配置 vim /etc/default/minio
:
# 可加多项,每一项为一个 server pool
MINIO_VOLUMES="http://192.168.1.20{1...2}:9000/data/disk{1...4}/minio"
# 指定 MinIO Console 端口
MINIO_OPTS="--console-address:9001"
MINIO_ROOT_USER=macesuted
MINIO_ROOT_PASSWORD=password
# 应当设置为负载均衡器,此处指向了一个节点
MINIO_SERVER_URL="http://192.168.1.201:9000"
配置 systemctl vim /usr/lib/systemd/system/minio.service
:
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
ProtectProc=invisible
EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# MinIO RELEASE.2023-05-04T21-44-30Z adds support for Type=notify (https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=)
# This may improve systemctl setups where other services use `After=minio.server`
# Uncomment the line to enable the functionality
# Type=notify
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Specifies the maximum number of threads this process can create
TasksMax=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
# Built for ${project.name}-${project.version} (${project.name})
systemctl daemon-reload
systemctl start minio
systemctl enable minio
随后访问其中一个节点的管理地址,即可看到后台管理页面。
在 Metrics 页面,当前配置提示拥有四块硬盘用作校验。
负载均衡
通过负载均衡器对接各个节点的 API 端口(9000),得到的连接放回每台机器的 MINIO_SERVER_URL
。再使用负载均衡器对接各个节点的后台管理端口(9001),提供高可用的管理页面访问。
参考 haproxy 配置(个人并不是很会使用,可能有误):
frontend minio_front
bind :40010
mode http
option httplog
option http-server-close
option forwardfor
acl host_minio hdr(host)
use_backend minio_backend
backend minio_backend
option httpchk
mode http
balance roundrobin
http-check expect status 200
cookie SERVERID insert indirect nocache
server minio1 127.0.0.1:40011 check cookie minio1 verify none
server minio2 127.0.0.1:40012 check cookie minio2 verify none
frontend minio_cluster_front
bind :40000
use_backend minio_cluster
backend minio_cluster
option httpchk GET /minio/login
http-check expect string minio
balance roundrobin
server minio-c1 127.0.0.1:40001 check
server minio-c2 127.0.0.1:40002 check
运维测试
服务器宕机
在 PVE 控制台直接关机其中的一台虚拟机,可能经历数秒的无响应,随后负载均衡器转移流量至健康节点。可在管理页面看到服务器宕机情况,所有数据均未丢失,可正常读取。但是由于剩余数据盘不超过总数的一半,无法写入新的数据。
测试在健康结点中再强制下线一块硬盘,则存储桶数据不可读取,再重新上线新的空硬盘也无法让集群恢复健康。
若故障节点恢复,启动后服务器自动连接加入集群,集群恢复正常。
若故障节点不能够恢复,配置一台所有上述配置均与故障节点相同的服务器(包括 IP),启动 MinIO 服务器后可以直接接入集群,自动完成磁盘数据的恢复。
硬盘故障
将故障硬盘更换为新硬盘。按照上述初始化硬盘的步骤初始化硬盘,进行格式化,打标签,分配用户,挂载,四个步骤后 MinIO 会自动连接新的硬盘,并对其进行还原。
升级
旧方案
将新版本的 MinIO 二进制文件替换原二进制文件。
使用 mc 配置集群 alias 并重启:
mc alias set myminio <Endpoint URL> <Admin Username> <Admin Password>
mc admin server restart myminio
则所有集群服务器将同时重启,完成更新。
新方案
直接使用 mc 方法完成更新即可:
mc admin update myminio
扩容
新增两台完全相同的虚拟机,于 192.168.1.203
与 192.168.1.204
。
更改四台服务器的 /etc/default/minio
如下项:
MINIO_VOLUMES="http://192.168.1.20{1...2}:9000/data/disk{1...4}/minio http://192.168.1.20{3...4}:9000/data/disk{1...4}/minio"
同时重启所有服务器的 MinIO 即可。
Comments | NOTHING