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%的吞吐量

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

相关推荐
GetcharZp44 分钟前
Weaviate从入门到实战:带你3步上手第一个AI应用!
人工智能·后端·搜索引擎
爷_1 小时前
用 Python 打造你的专属 IOC 容器
后端·python·架构
_码农121382 小时前
简单spring boot项目,之前练习的,现在好像没有达到效果
java·spring boot·后端
该用户已不存在2 小时前
人人都爱的开发工具,但不一定合适自己
前端·后端
码事漫谈3 小时前
AI代码审查大文档处理技术实践
后端
码事漫谈3 小时前
C++代码质量保障:静态与动态分析的CI/CD深度整合实践
后端
蓝易云3 小时前
Git stash命令的详细使用说明及案例分析。
前端·git·后端
Nejosi_念旧3 小时前
Go 函数选项模式
开发语言·后端·golang
回家路上绕了弯3 小时前
Java 并发编程常见问题及解决方案
java·后端
天天摸鱼的java工程师3 小时前
🧠 你是如何理解 Spring Boot 中的自动配置原理的?——一个 8 年 Java 老兵的分享
java·后端·面试