MinIO 分布式高可用部署

1. 概述

MinIO 是一个高性能、Kubernetes 原生的对象存储系统,兼容 Amazon S3 API。分布式部署模式下,MinIO 利用纠删码(Erasure Coding)技术将数据分片存储于多个节点、多块磁盘上,实现数据的高可用和自愈能力。即使丢失半数磁盘(N/2),数据仍可读取;写入需要至少 N/2+1 个磁盘在线。

2. 部署环境规划

2.1 硬件与节点要求

  • 节点数量:至少 4 个节点(建议 4-16 节点,偶数个节点利于纠删码配置)。

  • 磁盘数量:每个节点至少 2 块独立数据盘(生产环境建议 SSD/NVMe),所有节点的磁盘总数应为偶数(便于数据块与校验块对等分布)。

  • 网络:节点间 10GbE 以上网络,低延迟。

  • 操作系统:Linux(CentOS 7+/Ubuntu 18.04+),内核 4.x+。

2.2 软件版本

  • MinIO Server:RELEASE.2025-09-07T16-13-09Z(示例版本)

  • MinIO Client (mc):最新版

  • Nginx:1.20+

  • Keepalived:2.0+(用于负载均衡器高可用)

2.3 网络与主机名规划

假设 4 个存储节点:

 
节点名IP 地址数据盘挂载点
ubuntu02 192.168.0.62 /mnt/miniodata01, /mnt/miniodata02
ubuntu03 192.168.0.63 /mnt/miniodata01, /mnt/miniodata02
ubuntu04 192.168.0.64 /mnt/miniodata01, /mnt/miniodata02
ubuntu05 192.168.0.65 /mnt/miniodata01, /mnt/miniodata02

负载均衡器节点(2 台):

 
节点名IP 地址角色
ubuntu06 192.168.0.66 Nginx + Keepalived (MASTER)
ubuntu07 192.168.0.67 Nginx + Keepalived (BACKUP)

VIP(虚拟 IP):192.168.0.60

3. 基础环境配置(所有存储节点执行)

3.1 设置主机名与 hosts 解析

# 每台分别设置主机名,例如 ubuntu02
hostnamectl set-hostname ubuntu02

# 编辑 /etc/hosts,添加所有存储节点和负载均衡器的映射
cat >> /etc/hosts <<EOF
192.168.0.62 ubuntu02
192.168.0.63 ubuntu03
192.168.0.64 ubuntu04
192.168.0.65 ubuntu05
192.168.0.66 ubuntu06
192.168.0.67 ubuntu07
EOF

3.2 时间同步(NTP)

# Ubuntu
apt install -y chrony
systemctl enable --now chronyd
timedatectl status

# CentOS
yum install -y chrony
systemctl enable --now chronyd
chronyc sources -v

3.3 磁盘准备

若使用 LVM 管理磁盘:

pvcreate /dev/sdb 
vgextend ubuntu-vg /dev/sdb 

lvcreate -n miniodata1 -L 5G ubuntu-vg 
lvcreate -n miniodata2 -L 5G ubuntu-vg 

mkfs.ext4 /dev/ubuntu-vg/miniodata1 
mkfs.ext4 /dev/ubuntu-vg/miniodata2
mkdir /mnt/miniodata01 /mnt/miniodata02
vi /etc/fstab /dev/ubuntu-vg/miniodata1 /mnt/miniodata01 ext4 defaults 0 1 /dev/ubuntu-vg/miniodata2 /mnt/miniodata02 ext4 defaults 0 1 systemctl daemon-reload mount -a

4. MinIO 软件安装与配置(所有存储节点执行)

4.1 下载 MinIO 二进制

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mv minio /usr/local/bin/

4.2 创建专用用户

groupadd -r minio-user
useradd -M -r -g minio-user -s /sbin/nologin minio-user

4.3 创建数据目录并授权

chown -R minio-user:minio-user /mnt/miniodata01 /mnt/miniodata02

4.4 配置环境变量文件 /etc/default/minio

cat > /etc/default/minio <<EOF
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=you_passwd
MINIO_VOLUMES="http://ubuntu02/mnt/miniodata01 http://ubuntu02/mnt/miniodata02 http://ubuntu03/mnt/miniodata01 http://ubuntu03/mnt/miniodata02 http://ubuntu04/mnt/miniodata01 http://ubuntu04/mnt/miniodata02 http://ubuntu05/mnt/miniodata01 http://ubuntu05/mnt/miniodata02"
MINIO_OPTS="--address :9000 --console-address :9001"
EOF

注意:MINIO_VOLUMES 中的主机名必须与 /etc/hosts 解析一致,所有节点配置需完全相同。也可以将主机名换成IP

4.5 创建 systemd 服务文件 /etc/systemd/system/minio.service

[Unit]
Description=MinIO
Documentation=https://docs.min.io
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 "ERROR: MINIO_VOLUMES is not set" >&2; exit 1; fi'
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS
Restart=always
RestartSec=5
LimitNOFILE=65536
LimitNPROC=65536
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

4.6 启动 MinIO 服务

systemctl daemon-reload
systemctl enable minio --now
systemctl status minio
journalctl -u minio -f

5. 验证集群状态

5.1 使用 mc 客户端

在任意节点安装 mc:

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

# 配置别名,如在ubuntu02操作
mc alias set myminio http://ubuntu02:9000 admin feiTTYDV6YY

# 查看集群信息
mc admin info myminio

5.2 Web 控制台访问

浏览器打开任一节点 http://<node-ip>:9001,使用 admin/you_passwd登录。

6. 与 Kubernetes 集成(外部服务接入)

若 Kubernetes 集群需要使用外部 MinIO,通过 Service + Endpoints 方式接入。

6.1 创建 YAML 文件 external-minio.yaml

apiVersion: v1
kind: Service
metadata:
  name: external-minio
  namespace: default
spec:
  ports:
  - protocol: TCP
    port: 9000
    targetPort: 9000
---
apiVersion: v1
kind: Endpoints
metadata:
  name: external-minio
  namespace: default
subsets:
  - addresses:
      - ip: 192.168.0.62
      - ip: 192.168.0.63
      - ip: 192.168.0.64
      - ip: 192.168.0.65
    ports:
      - port: 9000
---
apiVersion: v1
kind: Secret
metadata:
  name: minio-secret
type: Opaque
data:
  access-key: YWRtaW4=          # base64 of 'admin'
  secret-key: ZmApVFGZRFY2WVc=  # base64 of 'you_passwd'

6.2 应用配置

kubectl apply -f external-minio.yaml

K8s 内部应用可通过 external-minio.default.svc.cluster.local:9000 访问 MinIO。

7. 配置 Nginx 负载均衡与高可用

7.1 Nginx 安装(两台负载均衡器)

# Ubuntu
apt install -y nginx

# CentOS
yum install -y nginx

7.2 Nginx 配置

创建 /etc/nginx/conf.d/minio-proxy.conf,内容如下:

upstream minio_api {
    least_conn;
    server ubuntu02:9000 max_fails=3 fail_timeout=30s;
    server ubuntu03:9000 max_fails=3 fail_timeout=30s;
    server ubuntu04:9000 max_fails=3 fail_timeout=30s;
    server ubuntu05:9000 max_fails=3 fail_timeout=30s;
}

upstream minio_console {
    ip_hash;
    server ubuntu02:9001 max_fails=3 fail_timeout=30s;
    server ubuntu03:9001 max_fails=3 fail_timeout=30s;
    server ubuntu04:9001 max_fails=3 fail_timeout=30s;
    server ubuntu05:9001 max_fails=3 fail_timeout=30s;
}

server {
    listen 9000;
    server_name _;
    client_max_body_size 0;
    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        proxy_pass http://minio_api;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        proxy_read_timeout 300;
    }
}

server {
    listen 9001;
    server_name _;
    client_max_body_size 0;
    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        proxy_pass http://minio_console;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        proxy_read_timeout 300;
    }
}

7.3 检查并重载 Nginx

nginx -t
systemctl reload nginx   # 或 systemctl restart nginx

7.4 Keepalived 安装与配置(实现 VIP 高可用)

两台负载均衡器安装 keepalived:

# Ubuntu
apt install -y keepalived

# CentOS
yum install -y keepalived

主节点(ubuntu06)配置 /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state MASTER
    interface eth0          # 根据实际网卡修改
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.0.60/24 dev eth0
    }
}

备节点(ubuntu07)配置

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.0.60/24 dev eth0
    }
}

启动 keepalived:

systemctl enable keepalived --now

验证 VIP 是否已绑定:

ip addr show eth0

7.5 最终访问入口

S3 API:http://192.168.0.60:9000

Web 控制台:http://192.168.0.60:9001

8. 日常管理与监控

8.1 常用 mc 命令

# 查看集群信息
mc admin info myminio

# 创建 bucket
mc mb myminio/mybucket

# 设置 bucket 公开读
mc anonymous set download myminio/mybucket

# 列出所有 bucket
mc ls myminio

# 上传文件
mc cp localfile myminio/mybucket/

# 生成临时下载链接(有效期7天)
mc share download myminio/mybucket/object

# 添加用户
mc admin user add myminio newuser newpassword

# 为用户添加读写策略
mc admin policy attach myminio readwrite --user=newuser

8.2 日志查看

journalctl -u minio -f

8.4 定期健康检查

建议编写脚本定时执行 mc admin info,发现离线节点及时告警。

posted @ 2026-03-15 22:25  teiperfly  阅读(0)  评论(0)    收藏  举报