Minio分布式多节点多驱动器集群部署

发布于:2025-02-25 ⋅ 阅读:(18) ⋅ 点赞:(0)

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
    

    image-20250220090823020

设置主机名

登录到每台虚拟机,通过 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

image-20250219172208552

检查配置:在每台虚拟机上,使用 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()

存储要求

官方文档:存储要求

  1. 使用本地存储(DAS)
    • 优先选择直连存储(DAS),避免使用网络存储(NAS、SAN、NFS)。
    • 推荐使用闪存(NVMe、SSD)存储“热”数据。
  2. 文件系统格式
    • 使用 XFS 格式化的驱动器,MinIO 官方推荐并测试 XFS。
    • 不支持或不推荐使用 EXT4、BTRFS、ZFS 等其他文件系统。
  3. 驱动器类型一致性
    • 每个存储池中的驱动器类型必须一致(如全部 NVMe 或全部 SSD)。
    • 混合驱动器类型会导致性能问题,MinIO 会将所有驱动器视为性能最低的类型。
  4. 驱动器大小一致性
    • 每个存储池中的驱动器容量必须一致。
    • MinIO 会将所有驱动器的可用容量限制为池中最小的驱动器容量。
  5. 顺序驱动器挂载
    • 使用顺序挂载路径(如 /mnt/drive-1/mnt/drive-2 等)。
    • 支持 Go 扩展符号 {x...y} 表示顺序驱动器系列。
  6. 重启后保持挂载
    • 使用 /etc/fstab(Linux)或等效工具确保驱动器在重启后保持挂载和映射一致。
  7. 独占访问
    • MinIO 需要对驱动器进行独占访问,其他进程或工具不应直接操作驱动器上的数据。

内存要求

  1. 内存预分配
    • RELEASE.2024-01-28T22-35-53Z 版本开始,MinIO 在启动时预分配 2GiB 系统内存。
  2. 最低内存要求
    • 每个节点至少需要 32GiB 内存。
    • 更多内存分配建议可参考 MinIO 官方文档

增加虚拟机磁盘(所有机器都要执行)

(如果非虚拟机可不关注本节内容)

注意:在MinIO集群部署中,需要将其强制性安装在独占的磁盘分区,而不能在根目录下建立目录。例如,在 /opt/data1 等位置建立目录文件夹代替。如果试图在 /home/data 等目录下创建目录,可能会遇到如下错误提示:Error: Drive /home/data is part of root drive, will not be used (*errors.errorString)。因此务必在系统已挂载的磁盘下建立 data 目录。

先停止 VM 主机,进入设置中添加新硬盘,直接默认下一步输入磁盘大小,选择将虚拟磁盘存储为单个文件,然后下一步即可

QQ_1739957843505

QQ_1739957928720

image-20250219173954462

image-20250219174111321

查看分区

# 显示所有使用和未使用的分区大小与簇信息
fdisk -l 
# 显示所有使用和未使用的分区
lsblk

image-20250219174403356

硬盘挂载

# 格式化磁盘
mkfs.ext4 -F /dev/sdb  
# 创建一个挂载指向目录
mkdir /mnt/data1  
# 挂载到指向的目录
mount /dev/sdb /mnt/data1  

image-20250219174628504

设置开机自动挂载

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 &

访问登录页面

image-20250220103641941

登录成功界面

image-20250220103748110

监控页面

image-20250220110402480

测试上传与预览

image-20250220105858604

image-20250220110020242

预览上传的文件

image-20250220110512879

测试高可用

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
  • 读取

    image-20250220111851879

  • 写入

    image-20250220134747191

模拟两节点磁盘故障

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 仍然可以以最小的性能影响继续提供读取请求

    image-20250220112124168

  • 写入

    写入失败:Error: Resource requested is unwritable, please reduce your request rate

    在 MinIO 中,写入定数(Write Quorum)通常要求集群中超过一半的节点是健康的。例如,如果有 4 个节点,写入定数通常是 3。也就是说,至少需要 3 个节点可用才能进行写入操作。如果有 2 个节点宕机,剩下的 2 个节点就无法满足写入写入定数,导致写入请求被拒绝

    image-20250220112308119

创建 MinIO 服务文件 (systemd)

对于手动安装(例如二进制安装),需要在 ==/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})

创建用户和组

创建 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 负载均衡器,以对部署中的可用节点执行“最少连接”或“循环”负载均衡。

image-20250221100450070

负载均衡器将请求路由到部署中的任何节点。 接收节点处理此后的任何节点间请求。

主机名 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

image-20250221103450885

image-20250221110216826

参考链接

  1. 部署 MinIO:多节点多驱动器 — 适用于 Linux 的 MinIO 对象存储
  2. ubuntu部署minio集群_ubuntu minio-CSDN博客
  3. 【解决】使用Nginx给minio做代理转发 进入管理界面查看桶一直显示loading问题_nginx 代理 minio websocket-CSDN博客