背景信息

  • 你有3台機器:172.16.91.43172.16.91.44172.16.91.45
  • 每台機器運行兩個 Redis 實例:一個 主節點 (6379),一個 從節點 (6380)
  • 密碼:Seeyon123456
  • Cluster 模式啓用(cluster-enabled yes
  • 缺失一些節點(目前集羣只有 3 主 + 1 從)

Redis集羣修復/重啓手冊

A. 停止集羣節點

一定要按順序停:先從節點,再主節點 在每台機器的 Redis 安裝目錄 /data/Seeyon/RedisServer/redis/bin 執行:

# 1. 停止所有從節點 (6380)
./redis-cli -h 172.16.91.43 -p 6380 -a Seeyon123456 shutdown
./redis-cli -h 172.16.91.44 -p 6380 -a Seeyon123456 shutdown
./redis-cli -h 172.16.91.45 -p 6380 -a Seeyon123456 shutdown

# 2. 停止所有主節點 (6379)
./redis-cli -h 172.16.91.43 -p 6379 -a Seeyon123456 shutdown
./redis-cli -h 172.16.91.44 -p 6379 -a Seeyon123456 shutdown
./redis-cli -h 172.16.91.45 -p 6379 -a Seeyon123456 shutdown

B. 刪除持久化數據文件

如果是 OA 緩存類業務,不需要保留舊數據,刪除各實例目錄中的 dump.rdb(以及 AOF):

rm -f /data/Seeyon/RedisServer/redis/node6379/dump.rdb
rm -f /data/Seeyon/RedisServer/redis/node6380/dump.rdb
# 若有 appendonly.aof:
rm -f /data/Seeyon/RedisServer/redis/node6379/appendonly.aof
rm -f /data/Seeyon/RedisServer/redis/node6380/appendonly.aof

C. 啓動主節點(Master)

依次啓動三台機器的主節點,確保它們握手成功:

# 機器 43
./redis-server /data/Seeyon/RedisServer/redis/node6379/redis.conf
# 機器 44
./redis-server /data/Seeyon/RedisServer/redis/node6379/redis.conf
# 機器 45
./redis-server /data/Seeyon/RedisServer/redis/node6379/redis.conf

D. 啓動從節點(Slave)

依次啓動三台機器的從節點:

# 機器 43
./redis-server /data/Seeyon/RedisServer/redis/node6380/redis.conf
# 機器 44
./redis-server /data/Seeyon/RedisServer/redis/node6380/redis.conf
# 機器 45
./redis-server /data/Seeyon/RedisServer/redis/node6380/redis.conf

E. 檢查集羣健康

./redis-cli -h 172.16.91.43 -p 6379 -a Seeyon123456 cluster info
./redis-cli -h 172.16.91.43 -p 6379 -a Seeyon123456 cluster nodes

健康標準:

  • cluster_state:ok
  • cluster_slots_failcluster_slots_pfail 都為 0
  • 每個 Master 有一個 Slave
  • Master 與 Slave 不在同一台機器

F. 如果從節點沒加入集羣

如果某個從節點啓動後沒有加入集羣:

  1. 找到它對應的 Master 的節點ID(用 cluster nodes 查)
  2. 在該從節點上執行:
./redis-cli -h <Slave_IP> -p <Slave_Port> -a Seeyon123456 cluster replicate <Master_Node_ID>

這樣它會綁定到對應的主節點。


G. 以後啓動順序注意事項

正確啓動順序:

  1. 先啓動所有 Master(機器 43→44→45)
  2. 再啓動所有 Slave(機器 43→44→45) 正確停止順序:
  3. 先停止所有 Slave
  4. 再停止所有 Master

H. 一鍵重啓腳本(可選,放在每台機的bin目錄)

保存成 /data/Seeyon/RedisServer/redis/bin/restart_cluster.sh

#!/bin/bash
PASS="Seeyon123456"
MASTERS=("172.16.91.43:6379" "172.16.91.44:6379" "172.16.91.45:6379")
SLAVES=("172.16.91.43:6380" "172.16.91.44:6380" "172.16.91.45:6380")

# 停 Slave
for node in "${SLAVES[@]}"; do
  ./redis-cli -a "$PASS" -h ${node%:*} -p ${node#*:} shutdown
done

# 停 Master
for node in "${MASTERS[@]}"; do
  ./redis-cli -a "$PASS" -h ${node%:*} -p ${node#*:} shutdown
done

# 刪數據
rm -f /data/Seeyon/RedisServer/redis/node6379/dump.rdb /data/Seeyon/RedisServer/redis/node6380/dump.rdb
rm -f /data/Seeyon/RedisServer/redis/node6379/appendonly.aof /data/Seeyon/RedisServer/redis/node6380/appendonly.aof

# 啓 Master
for node in "${MASTERS[@]}"; do
  ./redis-server /data/Seeyon/RedisServer/redis/node${node#*:}79/redis.conf
done

# 啓 Slave
for node in "${SLAVES[@]}"; do
  ./redis-server /data/Seeyon/RedisServer/redis/node${node#*:}80/redis.conf
done

# 檢查
./redis-cli -a "$PASS" -h 172.16.91.43 -p 6379 cluster info
./redis-cli -a "$PASS" -h 172.16.91.43 -p 6379 cluster nodes

執行:

chmod +x restart_cluster.sh
./restart_cluster.sh

最終效果:

  • 所有節點恢復運行
  • 所有主從關係正確且跨物理機
  • 集羣狀態 ok
  • 下次直接用腳本即可安全重啓