OpenEuler系统服务器Docker部署MinIO分布式集群全流程记录
前情陈述:
拿到一个新需求,要部署一套minio的集群。首先考虑的是用Docker部署,原因是:方便。
一共有四台服务器,先分别执行以下命令获取服务器配置:
首先查看系统信息:
命令:cat /etc/os-release
结果:
NAME="openEuler"
VERSION="22.03 (LTS-SP4)"
ID="openEuler"
VERSION_ID="22.03"
PRETTY_NAME="openEuler 22.03 (LTS-SP4)"
ANSI_COLOR="0;31"
再查看服务器配置:
CPU信息:
命令:lscpu
显示 CPU 架构、核心数、线程数、型号等概要信息。
示例:lscpu | grep -E "Model name|Core(s)|Socket(s)"
内存信息:
命令:free -h
快速查看内存总量、已用/空闲内存及缓存(-h
自动转换为 GB/MB)。
输出关键项:total
(总量)、available
(可用内存)。
硬盘信息:
命令:df -h
查看文件系统磁盘使用率(含 Use%
列)
得到的结果如下:
服务器名称 | CPU物理核心数 | 总内存 | 总硬盘(系统盘) | 内存使用率 | 硬盘使用率(根分区) |
---|---|---|---|---|---|
JuziLinkMinioPrd01 | 4核 | 7.3 GiB | ≈110 GB | 1.6 GiB (22%) | 6% |
JuziLinkMinioPrd02 | 4核 | 7.3 GiB | ≈110 GB | 1.6 GiB (22%) | 7% |
JuziLinkMinioPrd03 | 4核 | 7.3 GiB | ≈110 GB | 1.3 GiB (18%) | 6% |
JuziLinkMinioPrd04 | 4核 | 7.3 GiB | ≈110 GB | 1.1 GiB (15%) | 7% |
对应IP:
10.10.93.132
10.10.93.133
10.10.93.134
10.10.93.135
OpenEuler 系统适配说明
- 内核版本:openEuler 22.03 LTS-SP4 默认内核版本为 5.10+,满足 MinIO 要求(≥4.0),无需升级内核
- 包管理器:使用
dnf
替代yum
(命令兼容) - 防火墙:使用
firewalld
(默认已安装) - 内核模块:确保
overlay
和br_netfilter
模块加载
完整部署流程
优化方案:使用阿里云镜像部署(所有节点执行)
1. 安装 Docker(使用阿里云镜像源)
# 加载必需内核模块
sudo modprobe overlay
sudo modprobe br_netfilter
# 安装依赖
sudo dnf install -y device-mapper-persistent-data lvm2 iptables libseccomp
# 添加阿里云 Docker CE 镜像源
sudo tee /etc/yum.repos.d/docker-ce.repo <<'EOF'
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/8/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
# 安装 Docker
sudo dnf install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机启动
sudo systemctl start docker
sudo systemctl enable docker
2. 配置阿里云镜像加速器
# 创建 Docker 配置目录
sudo mkdir -p /etc/docker
# 配置阿里云镜像加速器和数据目录
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.cn-beijing.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
完整 MinIO 集群部署流程
将所有 MinIO 数据映射到宿主机的 /data/minio
目录下。以下是完整的方案:
1. 创建数据目录(所有节点)
# 创建主数据目录
sudo mkdir -p /data/minio/{disk1,disk2,disk3,disk4}
# 设置所有权和权限
sudo chown -R 1000:1000 /data/minio
sudo chmod -R 775 /data/minio
2. 更新启动脚本
镜像文件同样放置在:/data/minio
目录下。
创建 /opt/minio/start-minio.sh
:
#!/bin/bash
# 设置节点ID(根据IP最后一位)
IP_LAST_OCTET=$(hostname -I | awk '{print $1}' | cut -d. -f4)
NODE_ID=$((IP_LAST_OCTET - 131)) # 132->1, 133->2, 134->3, 135->4
# 停止并删除现有容器
docker stop minio-node${NODE_ID} >/dev/null 2>&1 || true
docker rm minio-node${NODE_ID} >/dev/null 2>&1 || true
# 创建必要的目录(如果不存在)
mkdir -p /opt/minio/logs
chown 1000:1000 /opt/minio/logs
chmod 775 /opt/minio/logs
# 镜像处理逻辑 - 使用您指定的路径 /data/minio/minio-image.tar
if [ -f "/data/minio/minio-image.tar" ]; then
echo "从本地文件加载MinIO镜像..."
docker load -i /data/minio/minio-image.tar
# 确保加载后镜像名称正确
if ! docker image inspect minio/minio:RELEASE.2024-08-26T15-33-07Z &> /dev/null; then
echo "重新标记镜像为 minio/minio:RELEASE.2024-08-26T15-33-07Z..."
IMAGE_ID=$(docker images -q --filter "dangling=true" | head -1)
docker tag ${IMAGE_ID} minio/minio:RELEASE.2024-08-26T15-33-07Z
fi
else
echo "尝试从镜像仓库拉取MinIO镜像..."
# 尝试多个镜像源
if docker pull registry.cn-beijing.aliyuncs.com/minio/minio:RELEASE.2024-08-26T15-33-07Z; then
echo "使用阿里云镜像源成功拉取"
docker tag registry.cn-beijing.aliyuncs.com/minio/minio:RELEASE.2024-08-26T15-33-07Z minio/minio:RELEASE.2024-08-26T15-33-07Z
elif docker pull docker.mirrors.ustc.edu.cn/minio/minio:RELEASE.2024-08-26T15-33-07Z; then
echo "使用中科大镜像源成功拉取"
docker tag docker.mirrors.ustc.edu.cn/minio/minio:RELEASE.2024-08-26T15-33-07Z minio/minio:RELEASE.2024-08-26T15-33-07Z
elif docker pull hub-mirror.c.163.com/minio/minio:RELEASE.2024-08-26T15-33-07Z; then
echo "使用网易镜像源成功拉取"
docker tag hub-mirror.c.163.com/minio/minio:RELEASE.2024-08-26T15-33-07Z minio/minio:RELEASE.2024-08-26T15-33-07Z
else
echo "错误:无法从任何镜像源拉取MinIO镜像。"
echo "请使用以下方法之一:"
echo "1. 将镜像文件 minio-image.tar 放到 /data/minio/ 目录"
echo "2. 手动执行: docker pull minio/minio:RELEASE.2024-08-26T15-33-07Z"
exit 1
fi
fi
# 启动MinIO容器
echo "启动MinIO节点 ${NODE_ID}..."
docker run -d \
--name minio-node${NODE_ID} \
--hostname minio-node${NODE_ID} \
--network host \
--restart unless-stopped \
-e MINIO_ROOT_USER=admin \
-e MINIO_ROOT_PASSWORD=123ABC \
-e MINIO_UPDATE=off \
-v /data/minio/disk1:/data1 \
-v /data/minio/disk2:/data2 \
-v /data/minio/disk3:/data3 \
-v /data/minio/disk4:/data4 \
-v /opt/minio/logs:/home/minio/.minio.sys/logs \
minio/minio:RELEASE.2024-08-26T15-33-07Z \
server \
http://10.10.93.132/data1 \
http://10.10.93.132/data2 \
http://10.10.93.132/data3 \
http://10.10.93.132/data4 \
http://10.10.93.133/data1 \
http://10.10.93.133/data2 \
http://10.10.93.133/data3 \
http://10.10.93.133/data4 \
http://10.10.93.134/data1 \
http://10.10.93.134/data2 \
http://10.10.93.134/data3 \
http://10.10.93.134/data4 \
http://10.10.93.135/data1 \
http://10.10.93.135/data2 \
http://10.10.93.135/data3 \
http://10.10.93.135/data4 \
--console-address ":9001"
# 等待容器启动
sleep 5
# 添加 mc 别名配置
echo "配置 mc 管理别名..."
docker exec minio-node${NODE_ID} mc alias set minio http://localhost:9000 admin 123ABC >/dev/null
echo "MinIO节点 ${NODE_ID} 启动成功!"
echo "容器状态:"
docker ps -a | grep minio-node${NODE_ID}
echo "日志路径: /opt/minio/logs"
echo "数据路径: /data/minio"
echo "镜像文件路径: /data/minio/minio-image.tar"
上面的脚本如果是在Windows环境下创建的会有问题,检测命令:
# 检查文件格式
file /opt/minio/start-minio.sh
# 应该显示: Bourne-Again shell script, ASCII text executable
# 检查行尾字符
cat -v /opt/minio/start-minio.sh | head -1
# 应该显示: #!/bin/bash (没有^M)
否则执行会报错,解决方案:在Linux环境下创建或者使用dos2unix工具进行修复。
赋予执行权限:
chmod +x /opt/minio/start-minio.sh
重新启动所有节点:
# 重新启动所有节点(按顺序)
nodes=(132 133 134 135)
for node in "${nodes[@]}"; do
ssh root@10.10.93.$node "/opt/minio/start-minio.sh"
sleep 10
done
3. 目录结构说明
/data/minio/
├── disk1/ # 对应容器内的 /data1
├── disk2/ # 对应容器内的 /data2
├── disk3/ # 对应容器内的 /data3
├── disk4/ # 对应容器内的 /data4
└── logs/ # 日志目录(通过/opt/minio/logs映射)
4. 准备 MinIO 镜像(推荐)
在一台可以访问外网的机器上:
公司项目生产环境的minio版本是:RELEASE.2024-08-26T15-33-07Z
,所以这里保持一致。
这一步,本来是想用阿里云镜像源的。但是需要阿里云账号进行配置,获取对应的令牌才行,比较麻烦。我直接在自己腾讯云的服务器上拉取了。我国内的服务器做了配置,用另一台洛杉矶的服务器代理了Docker中央仓库。
#拉取指定版本的minio的docker镜像
docker pull minio/minio:RELEASE.2024-08-26T15-33-07Z
# 指定输出文件名(minio-image.tar)及其对应的待导出的镜像名称和标签
docker save -o minio-image.tar minio/minio:RELEASE.2024-08-26T15-33-07Z
将 minio-image.tar
上传到每台集群服务器的 /data/minio/
目录
本次是使用JumpServer堡垒机内置的Web SFTP进行上传的。
在每台服务器上加载镜像:
# 以 132 节点为例,登录服务器后执行
docker load -i /data/minio/minio-image.tar
# 验证镜像是否加载成功
docker images | grep minio
此时,每台服务器都已具备本地 minio 镜像,后续启动脚本会优先从本地加载,无需再拉取外网镜像。
5. 启动集群(按顺序执行)
四台服务器支持内网互访,在任意一台服务器上依次执行以下命令即可:
# 启动132节点
ssh root@10.10.93.132 "/opt/minio/start-minio.sh"
# 等待30秒
sleep 30
# 启动133节点
ssh root@10.10.93.133 "/opt/minio/start-minio.sh"
# 等待30秒
sleep 30
# 启动134节点
ssh root@10.10.93.134 "/opt/minio/start-minio.sh"
# 等待30秒
sleep 30
# 启动135节点
ssh root@10.10.93.135 "/opt/minio/start-minio.sh"
6. 验证部署
# 检查所有节点状态
for ip in 132 133 134 135; do
echo "检查节点 10.10.93.$ip:"
ssh root@10.10.93.$ip "docker ps | grep minio"
ssh root@10.10.93.$ip "ls -l /data/minio"
echo ""
done
# 查看集群日志(在132节点执行)
ssh root@10.10.93.132 "docker logs minio-node1"
# 检查集群状态
ssh root@10.10.93.132 "docker exec minio-node1 mc admin info minio"
7. 防火墙配置(所有节点)
sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --permanent --add-port=9001/tcp
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.93.0/24" port port="9000-9001" protocol="tcp" accept'
sudo firewall-cmd --reload
8. 访问控制台
- URL: :9001
- 用户名: admin
- 密码: 123ABC
关键变化
数据目录映射:
-v /data/minio/disk1:/data1 \ -v /data/minio/disk2:/data2 \ -v /data/minio/disk3:/data3 \ -v /data/minio/disk4:/data4 \
所有数据现在都存储在统一的
/data/minio
目录下目录结构清晰:
- 每个磁盘有自己的子目录(disk1-disk4)
- 日志目录保持独立在
/opt/minio/logs
资源隔离:
- 系统盘(/)与应用数据(/data)分离
- 便于备份和管理
权限设置:
sudo chown -R 1000:1000 /data/minio sudo chmod -R 775 /data/minio
确保 MinIO 容器有足够的权限访问数据,将所有 MinIO 相关数据集中存储在
/data/minio
目录下,便于管理和维护。