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物理核心数总内存总硬盘(系统盘)内存使用率硬盘使用率(根分区)
JuziLinkMinioPrd014核7.3 GiB≈110 GB1.6 GiB (22%)6%
JuziLinkMinioPrd024核7.3 GiB≈110 GB1.6 GiB (22%)7%
JuziLinkMinioPrd034核7.3 GiB≈110 GB1.3 GiB (18%)6%
JuziLinkMinioPrd044核7.3 GiB≈110 GB1.1 GiB (15%)7%

对应IP:

10.10.93.132
10.10.93.133
10.10.93.134
10.10.93.135

OpenEuler 系统适配说明

  1. 内核版本:openEuler 22.03 LTS-SP4 默认内核版本为 5.10+,满足 MinIO 要求(≥4.0),无需升级内核
  2. 包管理器:使用 dnf 替代 yum(命令兼容)
  3. 防火墙:使用 firewalld(默认已安装)
  4. 内核模块:确保 overlaybr_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

关键变化

  1. 数据目录映射

    -v /data/minio/disk1:/data1 \
    -v /data/minio/disk2:/data2 \
    -v /data/minio/disk3:/data3 \
    -v /data/minio/disk4:/data4 \

    所有数据现在都存储在统一的 /data/minio 目录下

  2. 目录结构清晰

    • 每个磁盘有自己的子目录(disk1-disk4)
    • 日志目录保持独立在 /opt/minio/logs
  3. 资源隔离

    • 系统盘(/)与应用数据(/data)分离
    • 便于备份和管理
  4. 权限设置

    sudo chown -R 1000:1000 /data/minio
    sudo chmod -R 775 /data/minio

    确保 MinIO 容器有足够的权限访问数据,将所有 MinIO 相关数据集中存储在 /data/minio 目录下,便于管理和维护。

最后修改:2025 年 07 月 15 日
给我一点小钱钱也很高兴啦!o(* ̄▽ ̄*)ブ