154 lines
3.9 KiB
Bash
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从)"
|