本文目录导读:

我来提供几个不同场景下的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安装完成"
使用说明
- 保存脚本: 将脚本保存为
.sh文件 - 设置权限:
chmod +x script.sh - 运行:
./script.sh
注意事项
- 确保所有节点间网络互通
- 配置好主机名解析(/etc/hosts)
- 关闭防火墙或配置相应规则
- 每个brick使用独立磁盘分区
- 生产环境建议使用RAID或分布式复制卷
这些脚本涵盖了GlusterFS的自动部署、配置和监控,可以根据实际环境调整参数。