minio集群安装(3节点模拟4节点)

MinIO集群安装脚本 (install_minio_cluster.sh)

bash 复制代码
#!/bin/bash
set -e

# 参数解析
while [[ $# -gt 0 ]]; do
    case "$1" in
        --self-ip)
            SELF_IP="$2"
            shift 2
            ;;
        --data-dirs)
            IFS=',' read -ra DATA_DIRS <<< "$2"
            shift 2
            ;;
        --nodes)
            IFS=',' read -ra CLUSTER_NODES <<< "$2"
            shift 2
            ;;
        *)
            echo "未知参数: $1"
            exit 1
            ;;
    esac
done

# 参数校验
if [[ -z "$SELF_IP" || ${#DATA_DIRS[@]} -eq 0 || ${#CLUSTER_NODES[@]} -eq 0 ]]; then
    echo "用法:$0 --self-ip <本机IP> --data-dirs <数据目录列表> --nodes <集群节点配置>"
    echo "示例:"
    echo "./install_minio_cluster.sh --self-ip 10.1.27.22 --data-dirs data,data1 --nodes 10.1.27.22:2,10.1.27.23:1,10.1.27.24:1"
    exit 1
fi

# 基础配置
MINIO_ROOT_USER="modo"
MINIO_ROOT_PASSWORD="Modo@123"
MINIO_PORT=19090
CONSOLE_PORT=19091
INSTALL_DIR="/data/dataos/modo/minio-res"
BIN_DIR="$INSTALL_DIR/bin"
DATA_ROOT="$INSTALL_DIR/data"

# 创建目录结构
mkdir -p {$BIN_DIR,$DATA_ROOT}

# 下载并安装minio
if [[ ! -f "$BIN_DIR/minio" ]]; then
    wget https://dl.min.io/server/minio/release/linux-amd64/minio -O $BIN_DIR/minio
    chmod +x $BIN_DIR/minio
fi

# 生成存储路径列表
declare -a storage_paths
for node in "${CLUSTER_NODES[@]}"; do
    IFS=':' read node_ip dir_count <<< "$node"
    for ((i=1; i<=$dir_count; i++)); do
        storage_paths+=("http://$node_ip$DATA_ROOT/data$([ $i -gt 1 ] && echo $i || echo '')")
    done
done

# 生成本地数据目录
for dir in "${DATA_DIRS[@]}"; do
    mkdir -p "$DATA_ROOT/$dir"
done

# 生成启动脚本
cat > $INSTALL_DIR/start-minio.sh <<EOF
#!/bin/bash
export MINIO_ROOT_USER=$MINIO_ROOT_USER
export MINIO_ROOT_PASSWORD=$MINIO_ROOT_PASSWORD
nohup $BIN_DIR/minio server \
  --address "$SELF_IP:$MINIO_PORT" \
  --console-address "$SELF_IP:$CONSOLE_PORT" \
  ${storage_paths[@]} > $INSTALL_DIR/minio.log 2>&1 &
EOF

chmod +x $INSTALL_DIR/start-minio.sh

echo "MinIO节点部署完成"
echo "├─管理地址: http://$SELF_IP:$CONSOLE_PORT"
echo "├─API地址: http://$SELF_IP:$MINIO_PORT"
echo "└─启动命令: $INSTALL_DIR/start-minio.sh"

部署说明

1. 节点部署示例

lua 复制代码
# 节点10.1.27.22(部署2个数据目录)
./install_minio_cluster.sh \
  --self-ip 10.1.27.22 \
  --data-dirs data,data1 \
  --nodes 10.1.27.22:2,10.1.27.23:1,10.1.27.24:1

# 节点10.1.27.23(部署1个数据目录)
./install_minio_cluster.sh \
  --self-ip 10.1.27.23 \
  --data-dirs data \
  --nodes 10.1.27.22:2,10.1.27.23:1,10.1.27.24:1

# 节点10.1.27.24(部署1个数据目录)
./install_minio_cluster.sh \
  --self-ip 10.1.27.24 \
  --data-dirs data \
  --nodes 10.1.27.22:2,10.1.27.23:1,10.1.27.24:1

2. 启动集群

bash 复制代码
# 所有节点执行
$INSTALL_DIR/start-minio.sh

关键改进说明

  1. 动态集群配置

    • 通过--nodes参数自动生成存储路径列表(示例值:10.1.27.22:2,10.1.27.23:1,10.1.27.24:1
    • 自动处理不同节点数据目录数量差异
  2. 目录结构标准化

    bash 复制代码
    /data/dataos/modo/minio-res/
    ├── bin/            # MinIO二进制文件
    ├── data/           # 所有数据目录
    │   ├── data/       # 主数据目录
    │   └── data1/      # 附加数据目录(仅需在对应节点创建)
    └── start-minio.sh  # 统一启动脚本
  3. 端口管理

    • 服务端口:19090(API访问)
    • 控制台端口:19091(Web管理界面)
  4. 自动部署流程

    • 自动下载MinIO二进制文件
    • 自动创建所需目录结构
    • 生成带动态路径的启动脚本

验证命令

  1. 检查集群状态
bash 复制代码
$BIN_DIR/mc alias set myminio http://$SELF_IP:$MINIO_PORT $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD
$BIN_DIR/mc admin info myminio
  1. 查看日志
bash 复制代码
tail -f $INSTALL_DIR/minio.log

注意事项

  1. 防火墙配置

    确保所有节点的以下端口开放:

    ini 复制代码
    # 节点间通信
    firewall-cmd --permanent --add-port=19090/tcp
    # 控制台访问
    firewall-cmd --permanent --add-port=19091/tcp
    firewall-cmd --reload
  2. 数据目录权限

    确保所有数据目录具有写入权限:

    bash 复制代码
    chmod -R 775 $DATA_ROOT
  3. 纠删码配置

    当前配置(4个驱动器)支持以下冗余模式:

    • 默认模式:N/2 数据恢复能力(允许同时故障2个驱动器)
    • 自定义设置:通过环境变量MINIO_STORAGE_CLASS_RRSMINIO_STORAGE_CLASS_STANDARD调整

增强版MinIO集群部署脚本

bash 复制代码
#!/bin/bash
set -eo pipefail

# 参数解析
declare -A NODE_CONFIG
while [[ $# -gt 0 ]]; do
    case "$1" in
        --self-ip)
            SELF_IP="$2"
            shift 2
            ;;
        --minio-ips)
            IFS=',' read -ra NODE_LIST <<< "$2"
            for node in "${NODE_LIST[@]}"; do
                IFS=':' read -r ip dir_count <<< "$node"
                NODE_CONFIG["$ip"]=${dir_count:-1}  # 默认每个节点1个目录
            done
            shift 2
            ;;
        --data-root)
            DATA_ROOT="$2"
            shift 2
            ;;
        *)
            echo "未知参数: $1"
            exit 1
            ;;
    esac
done

# 参数验证
if [[ -z "$SELF_IP" || ${#NODE_CONFIG[@]} -eq 0 || -z "$DATA_ROOT" ]]; then
    echo "用法:$0 --self-ip <本机IP> --minio-ips <IP列表> --data-root <数据根目录>"
    echo "示例:"
    echo "./deploy_minio.sh --self-ip 10.1.27.22 \"
    echo "  --minio-ips 10.1.27.22:2,10.1.27.23:1,10.1.27.24:1 \"
    echo "  --data-root /data/minio-storage"
    exit 1
fi

# 基础配置
MINIO_USER="minioadmin"
MINIO_PASSWORD="minioadmin"
MINIO_PORT=9000
CONSOLE_PORT=9001
BIN_DIR="/usr/local/bin"

# 安装MinIO
if ! command -v minio &>/dev/null; then
    curl -sLO https://dl.min.io/server/minio/release/linux-amd64/minio
    chmod +x minio
    sudo mv minio $BIN_DIR/
fi

# 创建数据目录
mkdir -p $DATA_ROOT
for ((i=1; i<=${NODE_CONFIG[$SELF_IP]}; i++)); do
    dir_path="$DATA_ROOT/data${i}"
    mkdir -p "$dir_path"
    chmod -R 750 "$dir_path"
done

# 生成集群端点
declare -a ENDPOINTS
for ip in "${!NODE_CONFIG[@]}"; do
    dir_count=${NODE_CONFIG[$ip]}
    for ((i=1; i<=dir_count; i++)); do
        ENDPOINTS+=("http://$ip$DATA_ROOT/data${i}")
    done
done

# 生成启动脚本
cat > /etc/minio/start-minio.sh <<EOF
#!/bin/bash
export MINIO_ROOT_USER=$MINIO_USER
export MINIO_ROOT_PASSWORD=$MINIO_PASSWORD

nohup minio server \
  --address $SELF_IP:$MINIO_PORT \
  --console-address $SELF_IP:$CONSOLE_PORT \
  ${ENDPOINTS[@]} > /var/log/minio.log 2>&1 &
EOF

chmod +x /etc/minio/start-minio.sh

# 生成Systemd服务
cat > /etc/systemd/system/minio.service <<EOF
[Unit]
Description=MinIO Object Storage
After=network.target

[Service]
Type=simple
ExecStart=/etc/minio/start-minio.sh
Restart=always
RestartSec=30s

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
systemctl daemon-reload
systemctl enable --now minio

# 输出状态
echo "MinIO节点部署成功!"
echo "├─节点IP: $SELF_IP"
echo "├─数据目录: $DATA_ROOT/data[1-${NODE_CONFIG[$SELF_IP]}]"
echo "├─API端点: http://$SELF_IP:$MINIO_PORT"
echo "└─控制台地址: http://$SELF_IP:$CONSOLE_PORT"

部署说明

1. 参数说明

参数 说明
--self-ip 当前节点IP地址
--minio-ips 集群节点配置(格式:IP:目录数,IP:目录数),未指定目录数默认为1
--data-root 数据存储根目录(自动创建子目录)

2. 执行示例

在10.1.27.22节点执行:

lua 复制代码
sudo ./deploy_minio.sh \
  --self-ip 10.1.27.22 \
  --minio-ips 10.1.27.22:2,10.1.27.23:1,10.1.27.24:1 \
  --data-root /data/minio

在10.1.27.23节点执行:

lua 复制代码
sudo ./deploy_minio.sh \
  --self-ip 10.1.27.23 \
  --minio-ips 10.1.27.22:2,10.1.27.23:1,10.1.27.24:1 \
  --data-root /data/minio

在10.1.27.24节点执行:

lua 复制代码
sudo ./deploy_minio.sh \
  --self-ip 10.1.27.24 \
  --minio-ips 10.1.27.22:2,10.1.27.23:1,10.1.27.24:1 \
  --data-root /data/minio

关键改进说明

  1. 动态目录生成

    • 根据--minio-ips参数自动创建所需数量的数据目录
    • 自动生成形如/data/minio/data1/data/minio/data2的目录结构
  2. 智能端点发现

    ruby 复制代码
    # 示例输入
    --minio-ips 10.1.27.22:2,10.1.27.23:1,10.1.27.24:1
    
    # 自动生成端点列表
    http://10.1.27.22/data/minio/data1
    http://10.1.27.22/data/minio/data2
    http://10.1.27.23/data/minio/data1
    http://10.1.27.24/data/minio/data1
  3. 系统服务集成

    • 自动创建Systemd服务
    • 支持服务自启动和状态管理
    bash 复制代码
    # 服务管理命令
    systemctl status minio   # 查看状态
    systemctl restart minio  # 重启服务
    journalctl -u minio -f   # 查看日志
  4. 权限管理

    • 自动设置数据目录权限(750)
    • 推荐使用专用用户运行服务(需额外配置)

集群验证命令

  1. 检查集群状态
bash 复制代码
mc alias set myminio http://$SELF_IP:$MINIO_PORT $MINIO_USER $MINIO_PASSWORD
mc admin info myminio
  1. 查看纠删码配置
arduino 复制代码
mc admin config get myminio storage_class

注意事项

  1. 防火墙配置

    css 复制代码
    firewall-cmd --permanent --add-port={9000,9001}/tcp
    firewall-cmd --reload
  2. 硬件要求

    • 推荐使用相同配置的节点
    • 所有节点时间必须同步(建议配置NTP)
  3. 数据持久化

    • 建议将数据目录挂载独立磁盘
    • 使用XFS文件系统以获得最佳性能
  4. 扩展建议

    • 最少4个存储目录保证高可用
    • 每增加2个节点可提升约50%的吞吐量

该方案通过标准化参数输入和自动化配置,显著提升了部署效率和配置一致性,特别适合大规模对象存储集群的部署管理。

相关推荐
zopple3 小时前
常见的 Spring 项目目录结构
java·后端·spring
cjy0001115 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
小江的记录本6 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34166 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
程序员cxuan6 小时前
人麻了,谁把我 ssh 干没了
人工智能·后端·程序员
wuyikeer8 小时前
Spring Framework 中文官方文档
java·后端·spring
Victor3568 小时前
MongoDB(61)如何避免大文档带来的性能问题?
后端
Victor3568 小时前
MongoDB(62)如何避免锁定问题?
后端
wuyikeer9 小时前
Spring BOOT 启动参数
java·spring boot·后端
子木HAPPY阳VIP9 小时前
Ubuntu 22.04 VMware 设置固定IP配置
人工智能·后端·目标检测·机器学习·目标跟踪