Linux多节点多硬盘部署MinIO:分布式MinIO集群部署指南搭建高可用架构实践

简介: 通过以上步骤,已成功基于已有的 MinIO 服务,扩展为一个 MinIO 集群。该集群具有高可用性和容错性,适合生产环境使用。如果有任何问题,请检查日志或参考MinIO 官方文档。作者联系方式vx:2743642415。

目录

MinIO Cluster On Linux

1. 准备虚拟机节点

2. 挂载数据目录到独立磁盘

2.1. 添加新磁盘

2.2. 检查系统中已识别的磁盘

2.3. 检查MinIO数据目录所在分区

2.4. 格式化新磁盘

2.5. 挂载数据目录到新磁盘

2.6. 修改数据目录的所有者/组/权限

2.7. 自动挂载数据目录

2.8. 检查数据目录是否已挂载

3. 启动前的检查

3.1. 检查各节点之间的网络连通性

3.2. 检查MinIO的配置文件

3.3. 修改MinIO服务配置

3.4. 重新加载服务配置

3.5. 检查防火墙是否关闭

4. 启动 MinIO 集群

5. 验证集群状态

6. 验证高可用性

7. 其他配置

7.1. 防火墙配置

7.2. 监控和日志

8. 总结


MinIO Cluster On Linux

通过MinIO在Linux上的安装与部署-CSDN博客我们可以得到一个单节点的MinIO服务,我们基于已有的服务,通过复制虚拟机的方式快速扩展为 MinIO 集群。以下是详细步骤:

1. 准备虚拟机节点

首先准备一台刚刚下载好minio安装包还未进行任何操作的的虚拟机进行克隆(操作详情请参考:Linux多节点网络配置_linux ifcfg-ens33 uuid-CSDN博客)

这里统一规划好主机名和配置文件

节点名称

IP地址

操作系统

数据目录

备注

Node201

192.168.33.201

CentOS_7_2009

/mnt/data

初始机

Node202

192.168.33.202

CentOS_7_2009

/mnt/data

高可用节点

Node203

192.168.33.203

CentOS_7_2009

/mnt/data

高可用节点

Node204

192.168.33.204

CentOS_7_2009

/mnt/data

高可用节点

Node205

192.168.33.205

CentOS_7_2009

--

Nginx集群转发点

Nginx代理MinIO集群参考:Nginx代理MinIO集群-CSDN博客

在初始机上统一编辑下列文件

编辑 /etc/hosts 文件,添加所有节点的 IP 和主机名映射

vim /etc/hosts
# 添加各个节点和主机名的映射
192.168.33.201 Node201
192.168.33.202 Node202
192.168.33.203 Node203
192.168.33.204 Node204

image.gif

编辑 /etc/default/minio 文件,更新 MINIO_VOLUMES 配置,指定所有节点的存储路径:

vim /etc/default/minio
# 更新MINIO_VOLUMES 配置
MINIO_ROOT_USER="minioadmin"
MINIO_ROOT_PASSWORD="minioadmin"
MINIO_VOLUMES="http://node201/mnt/data http://node202/mnt/data http://node203/mnt/data http://node204/mnt/data"
MINIO_OPTS="--address :9000 --console-address :9001"

image.gif

为每台虚拟机设置唯一的主机名

hostnamectl set-hostname Node201  # 在 Node201 上执行
hostnamectl set-hostname Node202  # 在 Node202 上执行
hostnamectl set-hostname Node203  # 在 Node203 上执行
hostnamectl set-hostname Node204  # 在 Node204 上执行

image.gif

2. 挂载数据目录到独立磁盘

MinIO 集群节点必须挂载到独立磁盘中,MinIO的纠删码模式要求每个节点的数据目录必须挂载到 独立的物理磁盘(或独立的虚拟磁盘卷),原因如下:

  1. 数据冗余:纠删码依赖跨节点和跨驱动器的数据分布,确保数据高可用性。
  2. 避免单点故障:若多个目录挂载到同一磁盘,磁盘故障会导致所有数据丢失,违背冗余设计。
  3. 性能优化:独立磁盘提供更高 I/O 吞吐量。

这里在准备好的虚拟机节点上一个一个操作,不能统一操作之后直接克隆,这样不符合MinIO的纠删码模式,从而导致启动不成功。

2.1. 添加新磁盘

如下图,根据提示可以添加一块新的磁盘

image.gif 编辑

2.2. 检查系统中已识别的磁盘

lsblk

image.gif

/dev/sda系统磁盘及其子分区属于系统根分区

/dev/sdb属于新添加的磁盘

image.gif 编辑

2.3. 检查MinIO数据目录所在分区

检查MinIO数据目录/mnt/data的所在的分区

df -h /mnt/data

image.gif

可以看到当前目录是属于系统根分区的

image.gif 编辑

2.4. 格式化新磁盘

创建分区

fdisk /dev/sdb

image.gif

在fdisk交互界面,输入以下命令:

  • n:创建新分区。
  • p:选择主分区。
  • 1:分区编号为 1。
  • Enter:使用默认的起始扇区。
  • Enter:使用默认的结束扇区。
  • w:保存并退出。

完成磁盘分区

image.gif 编辑

格式化分区为ext4系统

mkfs.ext4 /dev/sdb1

image.gif

image.gif 编辑

ext4 是 Linux 系统中广泛使用的一种文件系统,它具备高可靠性、高性能以及支持大文件和大分区等优点。

2.5. 挂载数据目录到新磁盘

挂载/mnt/data到新分区,查看挂载情况

#如果还未创建数据目录首先创建
mkdir /mnt/data
mount /dev/sdb1 /mnt/data
df -h /mnt/data

image.gif

可以看到/mnt/data已经挂载到新分区

image.gif 编辑

2.6. 修改数据目录的所有者/组/权限

默认情况下,挂载瞬间:当磁盘(如 /dev/sdb1)挂载到目录(如 /mnt/data)时,该目录的权限会立即被覆盖,变为磁盘文件系统根目录的权限(默认通常是 root:root

需要我们手动修改磁盘文件系统本身的权限,确保/mnt/data的权限是minio-user:minio-user 755,这样改动后我们的数据目录的权限就时持久的了。

# 查看挂载后的目录权限和所有者
ls -ld /mnt/data
mkdir -p /mnt/data
groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown -R minio-user:minio-user /mnt/data
chmod -R 755 /mnt/data
# 查看设置权限后的目录权限和所有者
ls -ld /mnt/data

image.gif

image.gif 编辑

2.7. 自动挂载数据目录

获取新分区/dev/sdb1的UUID

blkid /dev/sdb1

image.gif

image.gif 编辑

编辑/etc/fstab文件,在其末尾添加以下内容:

vim /etc/fstab
#将挂载目录所有者设为minio-user用户,将组设为minio-user组,权限为775文件为664
UUID=your-disk-uuid /mnt/data ext4 defaults 0 0

image.gif

2.8. 检查数据目录是否已挂载

df -h /mnt/data
#如果未挂载在新分区,那么手动挂载一下
mount /dev/sdb1 /mnt/data

image.gif

image.gif 编辑

3. 启动前的检查

3.1. 检查各节点之间的网络连通性

检查/etc/hosts文件,是否包含了所有节点的IP和主机名映射,相互ping通

cat /etc/hosts
#在各节点上相互ping测试连通性
ping node201
ping node202
ping node203
ping node204

image.gif

image.gif 编辑

3.2. 检查MinIO的配置文件

cat /etc/default/minio

image.gif

image.gif 编辑

3.3. 修改MinIO服务配置

参照下方官方的服务配置模版修改,最简单暴力的方式是直接删除文件再重新创建

rm /usr/lib/systemd/system/minio.service
vim /usr/lib/systemd/system/minio.service

image.gif

[Unit]
Description=MinIO
Documentation=https://minio.org.cn/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})

image.gif

3.4. 重新加载服务配置

检查完毕之后,在每个节点上重新加载配置,确保所有的配置生效

systemctl daemon-reload

image.gif

3.5. 检查防火墙是否关闭

如果出现下方无法访问节点之间的9000端口问题,那么就是防火墙阻挡了节点之间的端口访问,需要手动关闭

systemctl stop firewalld
systemctl disable firewalld

image.gif

image.gif 编辑

4. 启动 MinIO 集群

在每台虚拟机上重新启动 MinIO 服务:

systemctl stop minio
systemctl start minio
systemctl enable minio
#查看详细日志
journalctl -u minio -b

image.gif

5. 验证集群状态

访问 MinIO Web 控制台:

  • 打开浏览器,访问 http://<任意节点IP>:9000
  • 使用 minioadminminioadmin 登录。

检查集群健康状态:

  • 进入 Monitoring,检查集群健康状态。

image.gif 编辑

使用 MinIO 客户端(mc)验证集群:

  • 安装 mc
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

image.gif

  • 配置集群别名:
mc alias set minio2 http://192.168.132.129:9000 minioadmin minioadmin

image.gif

image.gif 编辑

  • 查看集群信息:
mc admin info minio2

image.gif

image.gif 编辑

6. 验证高可用性

这里将会使用mc测试MinIO集群的高可用性

  1. 安装mc
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
#验证是否安装成功
mc --version

image.gif

image.gif 编辑

  1. 为某个节点配置别名(方便管理多个集群,并显著提高安全性,不用每次都将用户名、密码、访问地址写在命令行中)
mc alias set minio1 http://192.168.132.128:9000 minioadmin minioadmin
mc alias set minio2 http://192.168.132.129:9000 minioadmin minioadmin
mc alias set minio3 http://192.168.132.130:9000 minioadmin minioadmin

image.gif

  1. 验证别名配置情况
mc admin info minio3

image.gif

image.gif 编辑

  1. 创建Bucket并上传文件

创建一个Bucket

mc mb minio1/test-bucket

image.gif

上传一个文件到test-bucket

echo "This is a test file111." > test-file111.txt
mc cp test-file111.txt minio1/test-bucket/

image.gif

image.gif 编辑

列出test-bucket中的文件

mc ls minio1/test-bucket

image.gif

image.gif 编辑

  1. 模拟节点故障

关闭某一节点(例如:minio2)

[root@minio2 ~]# sudo systemctl stop minio

image.gif

检测MinIO集群状态,并访问MinIO集群

mc admin info minio3
mc ls minio1/test-bucket

image.gif

image.gif 编辑

  1. 验证数据一致性

恢复节点

[root@minio2 ~]# sudo systemctl start minio

image.gif

下载之前上传的文件,验证内容是否正确

mc admin info minio3
mc cp minio1/test-bucket/test-file222.txt ./downloaded-file222.txt
cat downloaded-file222.txt

image.gif

image.gif 编辑

  1. 总结

通过以上步骤,已经成功测试了 MinIO 集群的高可用性。以下是一些关键点:

  • 高可用性:即使某个节点故障,MinIO 仍然可以通过其他节点提供服务。
  • 数据一致性:MinIO 会自动同步数据,确保所有节点上的数据一致。
  • 读写操作:在集群正常运行的情况下,可以正常上传、下载和列出文件。

7. 其他配置

7.1. 防火墙配置

如果启用了防火墙,开放 MinIO 的端口(默认 9000):

sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent
sudo firewall-cmd --reload

image.gif

7.2. 监控和日志

  • 查看 MinIO 日志:
sudo journalctl -u minio.service -f

image.gif

8. 总结

通过以上步骤,已成功基于已有的 MinIO 服务,扩展为一个 MinIO 集群。该集群具有高可用性和容错性,适合生产环境使用。如果有任何问题,请检查日志或参考 MinIO 官方文档

作者联系方式vx:2743642415

相关文章
|
5月前
|
存储 监控 安全
132_API部署:FastAPI与现代安全架构深度解析与LLM服务化最佳实践
在大语言模型(LLM)部署的最后一公里,API接口的设计与安全性直接决定了模型服务的可用性、稳定性与用户信任度。随着2025年LLM应用的爆炸式增长,如何构建高性能、高安全性的REST API成为开发者面临的核心挑战。FastAPI作为Python生态中最受青睐的Web框架之一,凭借其卓越的性能、强大的类型安全支持和完善的文档生成能力,已成为LLM服务化部署的首选方案。
|
12月前
|
资源调度 前端开发 算法
鸿蒙OS架构设计探秘:从分层设计到多端部署
本文深入探讨了鸿蒙OS的架构设计,从独特的“1+8+N”分层架构到模块化设计,再到智慧分发和多端部署能力。分层架构让系统更灵活,模块化设计通过Ability机制实现跨设备一致性,智慧分发优化资源调度,多端部署提升开发效率。作者结合实际代码示例,分享了开发中的实践经验,并指出生态建设是未来的关键挑战。作为国产操作系统的代表,鸿蒙的发展值得每一位开发者关注与支持。
|
10月前
|
消息中间件 数据可视化 Kafka
docker arm架构部署kafka要点
本内容介绍了基于 Docker 的容器化解决方案,包含以下部分: 1. **Docker 容器管理**:通过 Portainer 可视化管理工具实现对主节点和代理节点的统一管理。 2. **Kafka 可视化工具**:部署 Kafka-UI 以图形化方式监控和管理 Kafka 集群,支持动态配置功能, 3. **Kafka 安装与配置**:基于 Bitnami Kafka 镜像,提供完整的 Kafka 集群配置示例,涵盖 KRaft 模式、性能调优参数及数据持久化设置,适用于高可用生产环境。 以上方案适合 ARM64 架构,为用户提供了一站式的容器化管理和消息队列解决方案。
920 10
|
11月前
|
SQL 数据可视化 网络安全
YashanDB分布式可视化部署
本文介绍YashanDB的分布式部署流程,涵盖服务端安装、数据库基本信息与服务器配置、节点信息设置、建库参数调整、环境变量配置及安装结果检查等步骤。通过可视化Web界面操作,详细说明了各环节配置方法和注意事项,确保用户顺利完成数据库集群的搭建与初始化设置。适用于需要分布式数据库部署的场景,提供全面的操作指导。
YashanDB分布式可视化部署
|
存储 Java 文件存储
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
2478 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
运维 Kubernetes Java
Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
本文由仁励家网络科技(杭州)有限公司架构师赵云兴、葛志刚撰写,探讨了公司在优化HR SaaS解决方案时遇到的系统资源浪费和运维成本高的问题。通过引入Koupleless框架,成功将模块体积从500M缩减至5M以下,部署时间从6分钟缩短至3分钟,并大幅节省服务器资源。文章详细介绍了Koupleless的部署方案及优化措施,感谢Koupleless团队的专业支持,使人力家实现了多应用合并部署,降低了运维成本。
Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
|
运维 Kubernetes Java
Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
通过引入Koupleless框架,解决了多应用部署中资源浪费和运维成本高的问题,实现了模块瘦身、快速部署及流量控制优化,大幅降低了服务器资源占用和发布耗时,提升了系统稳定性和运维效率。最终,人力家成功实现了多应用的轻量集中部署,显著减少了运维成本。
 Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
723 5