Minio分布式多节点多驱动器集群部署
官方文档地址:https://docs.min.io/docs/
集群部署文档地址:部署 MinIO:多节点多驱动器 — 适用于 Linux 的 MinIO 对象存储
节点规划
虚拟机名称 | 虚拟机IP | 主机名 | MAC地址 | 磁盘挂载 |
---|---|---|---|---|
centos7_01 | 192.168.0.123 | minio-01 | 00:50:56:3D:52:7C | /dev/sdb /mnt/data1 |
centos7_02 | 192.168.0.136 | minio-02 | 00:0C:29:5B:4E:8B | /dev/sdb /mnt/data1 |
centos7_03 | 192.168.0.141 | minio-03 | 00:0C:29:97:84:DD | /dev/sdb /mnt/data1 |
centos7_04 | 192.168.0.163 | minio-04 | 00:50:56:23:E6:53 | /dev/sdb /mnt/data1 |
先决条件
开放防火墙端口
-
每个节点应具有与部署中其他节点的双向网络访问权限。对于容器化或编排的基础设施,可能需要配置网络和路由组件(如入口或负载均衡器)。
-
某些操作系统可能需要设置防火墙规则。例如,以下命令显式打开运行
firewalld
的服务器的默认 MinIO 服务器 API 端口:9000
: -
部署中的所有 MinIO 服务器必须使用相同的监听端口,
所有机器都要执行
# MinIO 服务器 API 端口 firewall-cmd --zone=public --add-port=9000/tcp --permanent # MinIO 控制台端口 firewall-cmd --zone=public --add-port=9001/tcp --permanent # 务必重载防火墙 firewall-cmd --reload
设置主机名
登录到每台虚拟机,通过 hostnamectl
命令文件来设置主机名
在虚拟机 centos7_01
上,设置主机名为 minio-01
:
sudo hostnamectl set-hostname minio-01
对其他虚拟机也进行类似的操作:
sudo hostnamectl set-hostname minio-02 # 对于 centos7_02
sudo hostnamectl set-hostname minio-03 # 对于 centos7_03
sudo hostnamectl set-hostname minio-04 # 对于 centos7_04
验证主机名设置:
使用 hostname
命令检查主机名是否已正确设置:
hostname
更新域名映射文件
确保每个虚拟机能够通过主机名找到其他虚拟机,需要在每台虚拟机
上添加主机名和 IP 地址的映射,执行以下命令:
echo "192.168.0.123 minio-01" >> /etc/hosts
echo "192.168.0.136 minio-02" >> /etc/hosts
echo "192.168.0.141 minio-03" >> /etc/hosts
echo "192.168.0.163 minio-04" >> /etc/hosts
检查配置:在每台虚拟机上,使用 ping
命令检查主机名是否正确解析:
ping minio-01
ping minio-02
ping minio-03
ping minio-04
时间同步
sudo yum install ntp # 对于 CentOS/RHEL
sudo systemctl start ntpd # 启动 NTP 服务
sudo systemctl enable ntpd # 设置 NTP 服务开机启动
如果不设置可能在启动时报错:
Skewed authentication date/time:这个错误通常是由于参与 MinIO 集群的节点之间的系统时间不同步导致的。MinIO 使用请求时间戳来验证请求的有效性。如果时间不同步,MinIO 认为请求的时间是“偏移”的,从而拒绝该请求。
API: github.com/minio/minio/cmd.registerDistErasureRouters.(*Manager).Handler.func1
Time: 01:24:46 UTC 02/20/2025
RequestID: 1825C62382628C3B
RemoteHost: 192.168.0.141
Host: minio-04:9000
Error: auth 192.168.0.141:37916: Skewed authentication date/time (*fmt.wrapError)
5: internal/logger/logonce.go:118:logger.(*logOnceType).logOnceIf()
4: internal/logger/logonce.go:149:logger.LogOnceIf()
3: internal/grid/connection.go:59:grid.gridLogOnceIf()
2: internal/grid/manager.go:172:cmd.registerDistErasureRouters.(*Manager).Handler.func1()
1: net/http/server.go:2220:http.HandlerFunc.ServeHTTP()
存储要求
官方文档:存储要求
- 使用本地存储(DAS)
- 优先选择直连存储(DAS),避免使用网络存储(NAS、SAN、NFS)。
- 推荐使用闪存(NVMe、SSD)存储“热”数据。
- 文件系统格式
- 使用 XFS 格式化的驱动器,MinIO 官方推荐并测试 XFS。
- 不支持或不推荐使用 EXT4、BTRFS、ZFS 等其他文件系统。
- 驱动器类型一致性
- 每个存储池中的驱动器类型必须一致(如全部 NVMe 或全部 SSD)。
- 混合驱动器类型会导致性能问题,MinIO 会将所有驱动器视为性能最低的类型。
- 驱动器大小一致性
- 每个存储池中的驱动器容量必须一致。
- MinIO 会将所有驱动器的可用容量限制为池中最小的驱动器容量。
- 顺序驱动器挂载
- 使用顺序挂载路径(如
/mnt/drive-1
、/mnt/drive-2
等)。 - 支持 Go 扩展符号
{x...y}
表示顺序驱动器系列。
- 使用顺序挂载路径(如
- 重启后保持挂载
- 使用
/etc/fstab
(Linux)或等效工具确保驱动器在重启后保持挂载和映射一致。
- 使用
- 独占访问
- MinIO 需要对驱动器进行独占访问,其他进程或工具不应直接操作驱动器上的数据。
内存要求
- 内存预分配
- 从
RELEASE.2024-01-28T22-35-53Z
版本开始,MinIO 在启动时预分配 2GiB 系统内存。
- 从
- 最低内存要求
- 每个节点至少需要 32GiB 内存。
- 更多内存分配建议可参考 MinIO 官方文档。
增加虚拟机磁盘(所有机器都要执行)
(如果非虚拟机可不关注本节内容)
注意:在MinIO集群部署中,需要将其强制性安装在独占的磁盘分区,而不能在根目录下建立目录。例如,在 /opt/data1
等位置建立目录文件夹代替。如果试图在 /home/data
等目录下创建目录,可能会遇到如下错误提示:Error: Drive /home/data is part of root drive, will not be used (*errors.errorString)
。因此务必在系统已挂载的磁盘下建立 data
目录。
先停止 VM 主机,进入设置中添加新硬盘,直接默认下一步输入磁盘大小,选择将虚拟磁盘存储为单个文件,然后下一步即可
查看分区
# 显示所有使用和未使用的分区大小与簇信息
fdisk -l
# 显示所有使用和未使用的分区
lsblk
硬盘挂载
# 格式化磁盘
mkfs.ext4 -F /dev/sdb
# 创建一个挂载指向目录
mkdir /mnt/data1
# 挂载到指向的目录
mount /dev/sdb /mnt/data1
设置开机自动挂载
echo '/dev/sdb /mnt/data1 ext4 defaults 0 0' >> /etc/fstab
然后其他三台机器执行相同操作!
然后其他三台机器执行相同操作!
然后其他三台机器执行相同操作!
部署分布式 MinIO
依次给每台机器执行以下命令,执行下载minio并赋权的操作
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
每台机器启动测试
export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=miniostorage
nohup minio server --config-dir /etc/minio --address ":9000" --console-address ":9001" \
http://minio-01/mnt/data1 http://minio-02/mnt/data1 \
http://minio-03/mnt/data1 http://minio-04/mnt/data1 > minio_server.log 2>&1 &
访问登录页面
登录成功界面
监控页面
测试上传与预览
预览上传的文件
测试高可用
MinIO 配置限制
项 | 规格 |
---|---|
每个集群的最大服务器数量 | 无限制 |
最小服务器数量 | 1 |
当服务器数量为 1 时,每台服务器的最小磁盘数量 | 1(仅适用于 SNSD 部署,该配置不提供额外的可靠性或可用性) |
当服务器数量为 2 或更多时,每台服务器的最小磁盘数量 | 1 |
每台服务器的最大磁盘数量 | 无限制 |
读取限制(Read Quorum) | 一半节点 (N/2) |
写入限制(Write Quorum) | 一半节点+1 (N/2)+1 |
模拟单节点磁盘故障
通过关闭一个节点的minio服务器来验证数据的高可用性。比如,在 minio-01
上停止 MinIO 服务:
[root@minio-01 bin]# ps -ef|grep minio
root 13064 117867 0 10:28 pts/2 00:00:04 minio server --config-dir /etc/minio --address :9000 --console-address :9001 http://minio-01/mnt/data1 http://minio-02/mnt/data1 http://minio-03/mnt/data1 http://minio-04/mnt/data1
root 51956 117867 0 11:11 pts/2 00:00:00 grep --color=auto minio
[root@minio-01 bin]# kill -9 13064
-
读取
-
写入
模拟两节点磁盘故障
在 minio-02
上也停止 MinIO 服务:
[root@minio-02 bin]# ps -ef|grep minio
root 62535 1603 0 13:45 pts/0 00:00:02 minio server --config-dir /etc/minio --address :9000 --console-address :9001 http://minio-01/mnt/data1 http://minio-02/mnt/data1 http://minio-03/mnt/data1 http://minio-04/mnt/data1
root 76433 1603 0 14:00 pts/0 00:00:00 grep --color=auto minio
[root@minio-02 bin]# kill -9 62535
-
读取
此时的访问和下载功能仍能正常服务
纠删集是支持 MinIO 纠删码的多个磁盘组成的一个组。纠删码提供了高可用性、可靠性和冗余性,确保在 MinIO 部署中存储的数据的安全性。MinIO 将对象划分为多个数据块——称为分片(shards),并将它们均匀分布在纠删集中的每个磁盘上。即使某个磁盘发生故障,MinIO 也可以继续无缝地处理读取和写入请求。在最高冗余级别下,
尽管部署中最多丢失一半的磁盘,MinIO 仍然可以以最小的性能影响继续提供读取请求
。 -
写入
写入失败:Error: Resource requested is unwritable, please reduce your request rate
在 MinIO 中,写入定数(Write Quorum)通常要求
集群中超过一半的节点是健康的
。例如,如果有 4 个节点,写入定数通常是 3。也就是说,至少需要 3 个节点可用才能进行写入操作。如果有 2 个节点宕机,剩下的 2 个节点就无法满足写入写入定数,导致写入请求被拒绝
创建 MinIO 服务文件 (systemd)
对于手动安装(例如二进制安装),需要在 ==/usr/lib/systemd/system/==手动创建这个文件
minioservice_308">创建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})
创建用户和组
创建 minio-user
用户和组,并将 MinIO 使用的磁盘路径的所有权赋予该用户
groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown -R minio-user:minio-user /mnt/data1
创建服务环境文件
环境文件 /etc/default/minio 用于存储 MinIO 启动时所需的环境变量。以下是该文件的内容说明:
MINIO_VOLUMES="http://minio-01/mnt/data1 http://minio-02/mnt/data1 http://minio-03/mnt/data1 http://minio-04/mnt/data1"
MINIO_OPTS="--console-address :9001"
MINIO_ROOT_USER=minio
MINIO_ROOT_PASSWORD=miniostorage
然后通知 systemd
重新加载其配置文件
sudo systemctl daemon-reload
启动 MinIO 服务
执行以下命令启动 MinIO 服务:
sudo systemctl start minio.service
检查 MinIO 服务状态:
# 查看其状态
sudo systemctl status minio.service
# 查看相关日志
journalctl -f -u minio.service
这些命令将启动 MinIO 服务,并查看其状态和日志。MinIO 服务可能在启动初期显示一些非关键的警告,通常警告是暂时的,会在部署完全上线后自动解决。
设置 MinIO 在启动时自动启动
sudo systemctl enable minio.service
这将确保在主机重启时,MinIO 服务会自动启动。
Nginx 负载均衡
应用程序通常不应管理这些连接,因为对部署拓扑的任何更改都需要应用程序更新。 生产环境应部署负载均衡器或类似的网络控制平面组件来管理与 MinIO 部署的连接。 可以部署 NGINX 负载均衡器,以对部署中的可用节点执行“最少连接”或“循环”负载均衡。
负载均衡器将请求路由到部署中的任何节点。 接收节点处理此后的任何节点间请求。
主机名 | IP 地址 | MinIO数据访问端口 | MinIO控制台端口 |
---|---|---|---|
minio-01 | 192.168.0.123 | http://192.168.0.123:9000 | http://192.168.0.123:9001 |
minio-02 | 192.168.0.136 | http://192.168.0.136:9000 | http://192.168.0.136:9001 |
minio-03 | 192.168.0.141 | http://192.168.0.141:9000 | http://192.168.0.141:9001 |
minio-04 | 192.168.0.163 | http://192.168.0.163:9000 | http://192.168.0.163:9001 |
在另一台机器192.168.0.237新增nginx配置文件 /etc/nginx/conf.d/minio_proxy.conf
# MinIO 集群控制台
upstream console {
ip_hash;
server 192.168.0.123:9001;
server 192.168.0.136:9001;
server 192.168.0.141:9001;
server 192.168.0.163:9001;
}
# MinIO 管理端口
upstream minio {
ip_hash;
server 192.168.0.123:9000;
server 192.168.0.136:9000;
server 192.168.0.141:9000;
server 192.168.0.163:9000;
}
# 控制台访问配置(端口 9001)
server {
listen 9001;
server_name 192.168.0.73; # 设置为 Nginx 服务器的 IP 或域名
access_log /var/log/nginx/minio_console.access.log main;
error_log /var/log/nginx/minio_console.error.log debug;
location / {
proxy_pass http://console;
# 添加了 WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 数据访问配置(端口 9000)
server {
listen 9000;
server_name 192.168.0.73; # 设置为 Nginx 服务器的 IP 或域名
access_log /var/log/nginx/minio.access.log main;
error_log /var/log/nginx/minio.error.log debug;
location / {
proxy_pass http://minio;
# 添加了 WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
访问测试 http://192.168.0.237:9001/ minio/miniostorage