自动配置GlusterFS存储的脚本

wen 实用脚本 5

本文目录导读:

自动配置GlusterFS存储的脚本

  1. 双节点复制卷配置脚本
  2. 分布式卷配置脚本
  3. 监控脚本
  4. 一键安装配置脚本
  5. 使用说明
  6. 注意事项

我来提供几个不同场景下的GlusterFS自动化配置脚本。

双节点复制卷配置脚本

#!/bin/bash
# glusterfs-auto-setup.sh
# 自动配置GlusterFS复制卷
set -euo pipefail
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}
# 检查root权限
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "请以root用户运行此脚本"
        exit 1
    fi
}
# 配置参数
NODE1=""
NODE2=""
BRICK_PATH="/data/brick1"
VOLUME_NAME="gv0"
REPLICA_COUNT=2
# 验证IP/主机名
validate_node() {
    local node=$1
    if ! ping -c 1 -W 1 "$node" &> /dev/null; then
        log_warn "节点 $node 无法ping通,请确认网络连接"
        return 1
    fi
    return 0
}
# 初始化节点
init_node() {
    local node=$1
    log_info "初始化节点 $node..."
    # 创建挂载目录
    ssh "$node" "mkdir -p $BRICK_PATH"
    # 格式化并挂载磁盘(示例:使用/dev/sdb)
    # 根据实际情况调整
    if ssh "$node" "[ -b /dev/sdb ]" 2>/dev/null; then
        ssh "$node" "
            mkfs.xfs -f /dev/sdb 2>/dev/null || true
            mount /dev/sdb $BRICK_PATH 2>/dev/null || true
            echo '/dev/sdb $BRICK_PATH xfs defaults 0 0' >> /etc/fstab
        "
        log_info "磁盘已挂载到 $BRICK_PATH"
    else
        log_warn "未找到额外的磁盘,使用现有目录"
    fi
}
# 配置防火墙
configure_firewall() {
    local node=$1
    log_info "配置 $node 防火墙规则..."
    ssh "$node" "
        # GlusterFS 端口
        firewall-cmd --zone=public --add-port=24007-24008/tcp --permanent
        firewall-cmd --zone=public --add-port=49152-49251/tcp --permanent
        firewall-cmd --zone=public --add-port=111/tcp --permanent
        firewall-cmd --reload
        firewall-cmd --list-all
    " 2>/dev/null || log_warn "防火墙配置失败,请手动配置"
}
# 安装GlusterFS
install_glusterfs() {
    local node=$1
    log_info "在 $node 安装GlusterFS..."
    ssh "$node" "
        # CentOS/RHEL
        yum install -y centos-release-gluster 2>/dev/null || true
        yum install -y glusterfs-server glusterfs glusterfs-fuse
        # 启动服务
        systemctl start glusterd
        systemctl enable glusterd
        systemctl status glusterd
    "
}
# 配置集群
setup_cluster() {
    log_info "配置GlusterFS集群..."
    # 在第一个节点上探测其他节点
    gluster peer probe "$NODE2"
    sleep 5
    # 检查节点状态
    gluster peer status
}
# 创建卷
create_volume() {
    log_info "创建复制卷 $VOLUME_NAME..."
    # 移除已存在的卷
    gluster volume delete "$VOLUME_NAME" force 2>/dev/null || true
    # 创建复制卷
    gluster volume create "$VOLUME_NAME" \
        replica "$REPLICA_COUNT" \
        transport tcp \
        "$NODE1:$BRICK_PATH" \
        "$NODE2:$BRICK_PATH" \
        force
    # 启动卷
    gluster volume start "$VOLUME_NAME"
    # 配置卷选项
    gluster volume set "$VOLUME_NAME" performance.cache-size 256MB
    gluster volume set "$VOLUME_NAME" performance.io-thread-count 32
    gluster volume set "$VOLUME_NAME" network.ping-timeout 10
}
# 挂载卷
mount_volume() {
    local mount_point="/mnt/glusterfs"
    log_info "挂载卷到 $mount_point..."
    mkdir -p "$mount_point"
    # 安装客户端
    yum install -y glusterfs-fuse 2>/dev/null || true
    # 挂载
    mount -t glusterfs "$NODE1:/$VOLUME_NAME" "$mount_point"
    # 添加到fstab
    if ! grep -q "$VOLUME_NAME" /etc/fstab; then
        echo "$NODE1:/$VOLUME_NAME $mount_point glusterfs defaults,_netdev 0 0" >> /etc/fstab
    fi
}
# 验证配置
verify_setup() {
    log_info "验证配置..."
    echo "=== 节点状态 ==="
    gluster peer status
    echo -e "\n=== 卷信息 ==="
    gluster volume info "$VOLUME_NAME"
    echo -e "\n=== 卷状态 ==="
    gluster volume status "$VOLUME_NAME"
}
# 主函数
main() {
    clear
    echo "========================================="
    echo "  GlusterFS 自动配置脚本"
    echo "========================================="
    check_root
    # 获取输入
    read -p "请输入第一个节点IP/主机名: " NODE1
    read -p "请输入第二个节点IP/主机名: " NODE2
    read -p "Brick路径 (默认: /data/brick1): " input_path
    BRICK_PATH=${input_path:-/data/brick1}
    read -p "卷名称 (默认: gv0): " input_vol
    VOLUME_NAME=${input_vol:-gv0}
    # 验证节点
    echo -e "\n验证节点连接..."
    validate_node "$NODE1" || exit 1
    validate_node "$NODE2" || exit 1
    # 配置所有节点
    for node in "$NODE1" "$NODE2"; do
        echo -e "\n${YELLOW}配置节点: $node${NC}"
        install_glusterfs "$node"
        configure_firewall "$node"
        init_node "$node"
    done
    # 本节点配置
    echo -e "\n${YELLOW}配置本地节点${NC}"
    systemctl start glusterd
    systemctl enable glusterd
    # 设置集群
    setup_cluster
    # 创建卷
    create_volume
    # 挂载
    mount_volume
    # 验证
    verify_setup
    log_info "配置完成!"
    echo -e "\n可用命令:"
    echo "  gluster peer status     - 查看节点状态"
    echo "  gluster volume info     - 查看卷信息" 
    echo "  gluster volume status   - 查看卷状态"
    echo "  df -h /mnt/glusterfs    - 查看挂载状态"
}
# 执行主函数
main "$@"

分布式卷配置脚本

#!/bin/bash
# glusterfs-distributed.sh
# 分布式卷配置
# 配置参数
NODES=("node1" "node2" "node3" "node4")
VOLUME_NAME="dist-vol"
BRICK_PATH="/data/brick"
DIST_COUNT=4
# 创建分布式卷
create_distributed_volume() {
    local brick_list=""
    for node in "${NODES[@]}"; do
        brick_list+=" $node:$BRICK_PATH"
    done
    # 创建卷
    gluster volume create "$VOLUME_NAME" \
        transport tcp \
        $brick_list force
    # 配置卷
    gluster volume set "$VOLUME_NAME" performance.cache-size 512MB
    gluster volume start "$VOLUME_NAME"
}
# 添加新节点
add_node() {
    local new_node=$1
    local new_brick="$new_node:$BRICK_PATH"
    # 探测新节点
    gluster peer probe "$new_node"
    # 添加brick
    gluster volume add-brick "$VOLUME_NAME" \
        replica 2 \
        "$new_brick" force
    # 重新平衡
    gluster volume rebalance "$VOLUME_NAME" start
}

监控脚本

#!/bin/bash
# glusterfs-monitor.sh
# GlusterFS状态监控
monitor_gluster() {
    local email="admin@example.com"
    local log_file="/var/log/gluster-monitor.log"
    # 检查节点状态
    local peer_status=$(gluster peer status 2>&1)
    if [[ $? -ne 0 ]]; then
        echo "节点异常: $peer_status" | mail -s "GlusterFS Alert" "$email"
    fi
    # 检查卷状态
    for vol in $(gluster volume list 2>/dev/null); do
        local vol_status=$(gluster volume status "$vol" 2>&1)
        if echo "$vol_status" | grep -q "Offline"; then
            echo "卷 $vol 离线" | mail -s "GlusterFS Alert" "$email"
        fi
    done
    # 记录日志
    echo "[$(date)] 状态检查完成" >> "$log_file"
}
# 每5分钟运行一次
while true; do
    monitor_gluster
    sleep 300
done

一键安装配置脚本

#!/bin/bash
# glusterfs-oneclick.sh
# 一键安装配置
# 支持的发行版
detect_os() {
    if [ -f /etc/redhat-release ]; then
        echo "centos"
    elif [ -f /etc/debian_version ]; then
        echo "ubuntu"
    else
        echo "unknown"
    fi
}
install_dependencies() {
    local os=$1
    case $os in
        centos|rhel)
            yum install -y wget curl tar
            ;;
        ubuntu|debian)
            apt-get update
            apt-get install -y wget curl tar software-properties-common
            ;;
    esac
}
install_gluster() {
    local os=$1
    case $os in
        centos|rhel)
            yum install -y epel-release
            yum install -y glusterfs-server
            ;;
        ubuntu|debian)
            add-apt-repository -y ppa:gluster/glusterfs-9
            apt-get update
            apt-get install -y glusterfs-server
            ;;
    esac
    systemctl start glusterd
    systemctl enable glusterd
}
# 主流程
OS=$(detect_os)
install_dependencies "$OS"
install_gluster "$OS"
echo "GlusterFS安装完成"

使用说明

  1. 保存脚本: 将脚本保存为 .sh 文件
  2. 设置权限: chmod +x script.sh
  3. 运行: ./script.sh

注意事项

  • 确保所有节点间网络互通
  • 配置好主机名解析(/etc/hosts)
  • 关闭防火墙或配置相应规则
  • 每个brick使用独立磁盘分区
  • 生产环境建议使用RAID或分布式复制卷

这些脚本涵盖了GlusterFS的自动部署、配置和监控,可以根据实际环境调整参数。

抱歉,评论功能暂时关闭!