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

news/2025/2/22 6:08:20

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

  • Minio分布式多节点多驱动器集群部署
    • 节点规划
    • 先决条件
      • 开放防火墙端口
      • 设置主机名
      • 更新域名映射文件
      • 时间同步
      • 存储要求
      • 内存要求
    • 增加虚拟机磁盘(所有机器都要执行)
    • 部署分布式 MinIO
    • 测试上传与预览
    • 测试高可用
      • MinIO 配置限制
      • 模拟单节点磁盘故障
      • 模拟两节点磁盘故障
    • 创建 MinIO 服务文件 (systemd)
      • 创建minio.service文件
      • 创建用户和组
      • 创建服务环境文件
    • 启动 MinIO 服务
    • Nginx 负载均衡
  • 参考链接

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

官方文档地址:https://docs.min.io/docs/

集群部署文档地址:部署 MinIO:多节点多驱动器 — 适用于 Linux 的 MinIO 对象存储

节点规划

虚拟机名称虚拟机IP主机名MAC地址磁盘挂载
centos7_01192.168.0.123minio-0100:50:56:3D:52:7C/dev/sdb /mnt/data1
centos7_02192.168.0.136minio-0200:0C:29:5B:4E:8B/dev/sdb /mnt/data1
centos7_03192.168.0.141minio-0300:0C:29:97:84:DD/dev/sdb /mnt/data1
centos7_04192.168.0.163minio-0400: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/==手动创建这个文件

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

image-20250221100450070

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

主机名IP 地址MinIO数据访问端口MinIO控制台端口
minio-01192.168.0.123http://192.168.0.123:9000http://192.168.0.123:9001
minio-02192.168.0.136http://192.168.0.136:9000http://192.168.0.136:9001
minio-03192.168.0.141http://192.168.0.141:9000http://192.168.0.141:9001
minio-04192.168.0.163http://192.168.0.163:9000http://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博客

http://www.niftyadmin.cn/n/5861740.html

相关文章

网络空间安全(1)web应用程序的发展历程

前言 Web应用程序的发展历程是一部技术创新与社会变革交织的长卷,从简单的文档共享系统到如今复杂、交互式、数据驱动的平台,经历了多个重要阶段。 一、起源与初期发展(1989-1995年) Web的诞生: 1989年,欧洲…

深蕾科技智能多媒体SoC产品助力“DataEye剧查查之夜”微短剧盛会

深蕾科技助力微短剧盛会 深圳湾“DataEye剧查查之夜”微短剧盛会,于2025年2月20日18:00点,在深圳湾盛大开启。作为第十四届中国国际新媒体短片节的重要组成部分,“剧查查之夜”汇聚了微短剧行业的顶尖力量,吸引了众多大咖齐聚一堂…

ip属地是电话号码吗怎么改

在数字化时代,IP属地作为网络身份的一部分,对于许多互联网用户来说并不陌生。然而,关于IP属地的具体含义以及如何更改它,却常常让一些用户感到困惑。特别是当提到IP属地与电话号码之间的关系时,更是容易让人产生误解。…

超多目标优化:基于导航变量的多目标粒子群优化算法(NMOPSO)的无人机三维路径规划,MATLAB代码

一、基于导航变量的多目标粒子群优化算法(NMOPSO)介绍 基于导航变量的多目标粒子群优化算法(Navigation variable-based multi-objective particle swarm optimization,NMOPSO)是2025年提出的一种用于无人机路径规划的…

【第三节】C++设计模式(创建型模式)-单例模式

目录 一、模式价值与核心思想 二、现代化实现方案 2.1 核心差异对比表 2.2 典型代码实现 2.3 工程场景选择指南 2.4 关键问题深度解析 2.5 现代C最佳实践 2.6 总结 三、模式演进与替代方案 四、最佳实践建议 一、模式价值与核心思想 单例模式(Singleton P…

【Gin-Web】Bluebell社区项目梳理1:注册业务、登录业务流程及代码

本文目录 一、Web的CLD分层架构、二、注册业务流程三、登录业务流程四、Token认证模式基于Cookie和Seesion的认证模式 五、分布式ID生成与雪花算法 一、Web的CLD分层架构、 一般Web项目可以看作是CLD架构,也就是图中所示,ControllerLogicDAO层&#xff…

图数据库Neo4j面试内容整理-建模实践

在 Neo4j 中进行图数据建模(Graph Modeling)是设计和构建高效图数据库系统的关键。图数据库与关系型数据库不同,图数据建模强调的是如何通过节点、关系、标签和属性来表示和组织数据之间的复杂联系。因此,图数据库的建模过程不仅需要理解数据本身,还需要考虑查询的效率和扩…

ncDLRES:一种基于动态LSTM和ResNet的非编码RNA家族预测新方法

现有的计算方法主要分为两类:第一类是通过学习序列或二级结构的特征来预测ncRNAs家族,另一类是通过同源序列之间的比对来预测ncRNAs家族。在第一类中,一些方法通过学习预测的二级结构特征来预测ncRNAs家族。二级结构预测的不准确性可能会导致…