Files
Cloud-book/数据库/Redis_2025/cluster_scale_out.sh
2025-08-27 17:10:05 +08:00

154 lines
3.9 KiB
Bash

#!/bin/bash
echo "=== Redis 集群扩容操作 ==="
# 配置参数
EXISTING_NODE="127.0.0.1:7001"
NEW_MASTER="127.0.0.1:7007"
NEW_SLAVE="127.0.0.1:7008"
BASE_DIR="/tmp/redis_cluster"
# 1. 准备新节点
echo "1. 准备新节点配置..."
# 创建新节点目录
mkdir -p ${BASE_DIR}/node-${NEW_MASTER#*:}
mkdir -p ${BASE_DIR}/node-${NEW_SLAVE#*:}
# 生成新主节点配置
cat > ${BASE_DIR}/node-${NEW_MASTER#*:}/redis.conf << EOF
port ${NEW_MASTER#*:}
bind 127.0.0.1
dir ${BASE_DIR}/node-${NEW_MASTER#*:}
logfile ${BASE_DIR}/node-${NEW_MASTER#*:}/redis-${NEW_MASTER#*:}.log
pidfile ${BASE_DIR}/node-${NEW_MASTER#*:}/redis-${NEW_MASTER#*:}.pid
daemonize yes
cluster-enabled yes
cluster-config-file ${BASE_DIR}/node-${NEW_MASTER#*:}/nodes-${NEW_MASTER#*:}.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfilename "appendonly-7007.aof"
appendfsync everysec
maxmemory 256mb
maxmemory-policy allkeys-lru
tcp-keepalive 300
databases 1
EOF
# 生成新从节点配置
cat > ${BASE_DIR}/node-${NEW_SLAVE#*:}/redis.conf << EOF
port ${NEW_SLAVE#*:}
bind 127.0.0.1
dir ${BASE_DIR}/node-${NEW_SLAVE#*:}
logfile ${BASE_DIR}/node-${NEW_SLAVE#*:}/redis-${NEW_SLAVE#*:}.log
pidfile ${BASE_DIR}/node-${NEW_SLAVE#*:}/redis-${NEW_SLAVE#*:}.pid
daemonize yes
cluster-enabled yes
cluster-config-file ${BASE_DIR}/node-${NEW_SLAVE#*:}/nodes-${NEW_SLAVE#*:}.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
save ""
appendonly no
maxmemory 256mb
maxmemory-policy allkeys-lru
tcp-keepalive 300
databases 1
EOF
# 2. 启动新节点
echo "2. 启动新节点..."
redis-server ${BASE_DIR}/node-${NEW_MASTER#*:}/redis.conf
redis-server ${BASE_DIR}/node-${NEW_SLAVE#*:}/redis.conf
sleep 3
# 验证新节点启动
for port in ${NEW_MASTER#*:} ${NEW_SLAVE#*:}; do
if redis-cli -p $port ping > /dev/null 2>&1; then
echo "✅ 新节点 $port 启动成功"
else
echo "❌ 新节点 $port 启动失败"
exit 1
fi
done
# 3. 添加新主节点到集群
echo "3. 添加新主节点到集群..."
echo "使用 redis-cli 添加新主节点:"
redis-cli --cluster add-node ${NEW_MASTER} ${EXISTING_NODE}
# 等待节点加入
sleep 5
# 验证节点加入
echo "验证新主节点加入:"
redis-cli -h ${EXISTING_NODE%:*} -p ${EXISTING_NODE#*:} CLUSTER NODES | grep ${NEW_MASTER%:*}:${NEW_MASTER#*:}
# 4. 重新分配槽位
echo "4. 重新分配槽位..."
# 获取新主节点ID
NEW_MASTER_ID=$(redis-cli -h ${NEW_MASTER%:*} -p ${NEW_MASTER#*:} CLUSTER MYID)
echo "新主节点ID: $NEW_MASTER_ID"
# 计算要迁移的槽位数量(假设平均分配)
CURRENT_MASTERS=3
NEW_MASTERS=4
SLOTS_PER_MASTER=$((16384 / NEW_MASTERS))
SLOTS_TO_MIGRATE=$((16384 / NEW_MASTERS))
echo "每个主节点应分配槽位数: $SLOTS_PER_MASTER"
echo "需要迁移的槽位数: $SLOTS_TO_MIGRATE"
# 使用 redis-cli 重新分片
echo "执行重新分片..."
redis-cli --cluster reshard ${EXISTING_NODE} \
--cluster-from all \
--cluster-to $NEW_MASTER_ID \
--cluster-slots $SLOTS_TO_MIGRATE \
--cluster-yes
sleep 5
# 5. 添加新从节点
echo "5. 添加新从节点..."
redis-cli --cluster add-node ${NEW_SLAVE} ${EXISTING_NODE} --cluster-slave --cluster-master-id ${NEW_MASTER_ID}
# 等待从节点加入
sleep 5
# 6. 验证扩容结果
echo "集群节点信息:"
redis-cli -h ${EXISTING_NODE%:*} -p ${EXISTING_NODE#*:} CLUSTER NODES
echo
echo "集群状态信息:"
redis-cli -h ${EXISTING_NODE%:*} -p ${EXISTING_NODE#*:} CLUSTER INFO
echo
echo "槽位分配验证:"
redis-cli -h ${EXISTING_NODE%:*} -p ${EXISTING_NODE#*:} CLUSTER SLOTS | grep -A 2 -B 2 ${NEW_MASTER%:*}
# 7. 测试新节点 - 写入数据至新主节点并验证
echo
echo "=== 集群扩容完成 ==="
echo "新主节点: $NEW_MASTER (ID: $NEW_MASTER_ID)"
echo "新从节点: $NEW_SLAVE"
echo "集群现有节点数: 8 (4主4从)"