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
关键改进说明
-
动态集群配置
- 通过
--nodes
参数自动生成存储路径列表(示例值:10.1.27.22:2,10.1.27.23:1,10.1.27.24:1
) - 自动处理不同节点数据目录数量差异
- 通过
-
目录结构标准化
bash/data/dataos/modo/minio-res/ ├── bin/ # MinIO二进制文件 ├── data/ # 所有数据目录 │ ├── data/ # 主数据目录 │ └── data1/ # 附加数据目录(仅需在对应节点创建) └── start-minio.sh # 统一启动脚本
-
端口管理
- 服务端口:19090(API访问)
- 控制台端口:19091(Web管理界面)
-
自动部署流程
- 自动下载MinIO二进制文件
- 自动创建所需目录结构
- 生成带动态路径的启动脚本
验证命令
- 检查集群状态
bash
$BIN_DIR/mc alias set myminio http://$SELF_IP:$MINIO_PORT $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD
$BIN_DIR/mc admin info myminio
- 查看日志
bash
tail -f $INSTALL_DIR/minio.log
注意事项
-
防火墙配置
确保所有节点的以下端口开放:
ini# 节点间通信 firewall-cmd --permanent --add-port=19090/tcp # 控制台访问 firewall-cmd --permanent --add-port=19091/tcp firewall-cmd --reload
-
数据目录权限
确保所有数据目录具有写入权限:
bashchmod -R 775 $DATA_ROOT
-
纠删码配置
当前配置(4个驱动器)支持以下冗余模式:
- 默认模式:N/2 数据恢复能力(允许同时故障2个驱动器)
- 自定义设置:通过环境变量
MINIO_STORAGE_CLASS_RRS
和MINIO_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
关键改进说明
-
动态目录生成
- 根据
--minio-ips
参数自动创建所需数量的数据目录 - 自动生成形如
/data/minio/data1
、/data/minio/data2
的目录结构
- 根据
-
智能端点发现
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
-
系统服务集成
- 自动创建Systemd服务
- 支持服务自启动和状态管理
bash# 服务管理命令 systemctl status minio # 查看状态 systemctl restart minio # 重启服务 journalctl -u minio -f # 查看日志
-
权限管理
- 自动设置数据目录权限(750)
- 推荐使用专用用户运行服务(需额外配置)
集群验证命令
- 检查集群状态
bash
mc alias set myminio http://$SELF_IP:$MINIO_PORT $MINIO_USER $MINIO_PASSWORD
mc admin info myminio
- 查看纠删码配置
arduino
mc admin config get myminio storage_class
注意事项
-
防火墙配置
cssfirewall-cmd --permanent --add-port={9000,9001}/tcp firewall-cmd --reload
-
硬件要求
- 推荐使用相同配置的节点
- 所有节点时间必须同步(建议配置NTP)
-
数据持久化
- 建议将数据目录挂载独立磁盘
- 使用XFS文件系统以获得最佳性能
-
扩展建议
- 最少4个存储目录保证高可用
- 每增加2个节点可提升约50%的吞吐量
该方案通过标准化参数输入和自动化配置,显著提升了部署效率和配置一致性,特别适合大规模对象存储集群的部署管理。