Skip to content

Redis集群节点故障与恢复详解

🔄 主节点宕机后恢复的完整过程

1. 主节点宕机检测

bash
# 集群检测到主节点不可用
>>> Node 127.0.0.1:7001 is unreachable
>>> Cluster state changed: fail

2. 自动故障转移

bash
# 从节点自动升级为主节点
>>> Failover election won: promoting slave 127.0.0.1:7004 to master
>>> Configuring 127.0.0.1:7004 as master for slots 0-5460

3. 原主节点重新上线

bash
# 宕机的主节点重新启动
redis-server /path/to/redis.conf

# 节点自动重新加入集群
>>> Node 127.0.0.1:7001 rejoined the cluster

4. 角色转换过程

bash
# 重新加入后,原主节点变为新主节点的从节点
127.0.0.1:7001> cluster nodes
# 输出显示:
# 127.0.0.1:7004 master - 负责槽位 0-5460
# 127.0.0.1:7001 slave 127.0.0.1:7004 - 变为从节点

5. 数据同步

bash
# 新从节点开始同步数据
>>> 127.0.0.1:7001 starting replication from 127.0.0.1:7004
>>> SYNC with master, discarding 150 bytes of pre-sync data
>>> MASTER <-> REPLICA sync: receiving 2048 bytes from master

⚠️ 其他可能的故障场景

场景1:多个主节点同时宕机

bash
# 情况:2个主节点同时故障
>>> 127.0.0.1:7001 and 127.0.0.1:7002 are unreachable

# 影响:
# - 如果超过半数主节点宕机,集群将不可用
# - 客户端收到 CLUSTERDOWN 错误
# - 需要人工干预恢复

场景2:主节点和其从节点同时宕机

bash
# 情况:主节点7001和其从节点7004同时故障
>>> No available slaves for master 127.0.0.1:7001

# 影响:
# - 该主节点负责的槽位数据不可访问
# - 集群部分功能受损
# - 需要从备份恢复或等待节点重启

场景3:网络分区(脑裂)

bash
# 情况:集群被网络分割成两个部分
Part A: 7001(master), 7004(slave), 7002(master)
Part B: 7003(master), 7005(slave), 7006(slave)

# 可能发生:
# - 两个分区都认为自己是有效集群
# - 数据写入冲突
# - 网络恢复后需要解决数据一致性

场景4:从节点宕机

bash
# 情况:从节点7004宕机
>>> Slave 127.0.0.1:7004 is unreachable

# 影响:
# - 主节点7001失去备份
# - 集群仍然可用,但冗余性降低
# - 自动重连后重新同步数据

场景5:节点数据不一致

bash
# 情况:节点重启后数据版本冲突
>>> Node 127.0.0.1:7001 has inconsistent config epoch
>>> Cluster state changed: fail

# 解决:需要手动修复
redis-cli --cluster fix 127.0.0.1:7001

🛠️ 故障恢复命令

检查集群状态

bash
# 查看集群健康状态
redis-cli --cluster check 127.0.0.1:7001

# 查看节点信息
redis-cli -c -p 7001 cluster nodes

# 查看集群信息
redis-cli -c -p 7001 cluster info

手动故障转移

bash
# 在从节点上执行手动故障转移
redis-cli -p 7004 cluster failover

# 强制故障转移(即使主节点可用)
redis-cli -p 7004 cluster failover force

修复集群状态

bash
# 修复集群配置
redis-cli --cluster fix 127.0.0.1:7001

# 重新分片恢复
redis-cli --cluster reshard 127.0.0.1:7001

📊 故障影响分析表

故障场景集群状态数据可用性自动恢复需要人工干预
单主节点宕机部分降级部分影响✅ 是❌ 否
多主节点宕机可能不可用严重影响❌ 否✅ 是
主从同时宕机部分不可用数据丢失❌ 否✅ 是
网络分区分裂不一致⚠️ 部分✅ 是
从节点宕机正常完全可用✅ 是❌ 否

🔧 预防措施

配置优化

bash
# 合理设置超时时间
cluster-node-timeout 15000

# 启用持久化
appendonly yes
appendfsync everysec

# 监控配置
# 设置适当的副本数
--cluster-replicas 1

监控告警

bash
# 定期检查集群状态
redis-cli --cluster check 127.0.0.1:7001

# 监控关键指标
- 节点连接状态
- 内存使用情况
- 复制延迟
- 集群状态

💡 最佳实践建议

  1. 至少配置1个从节点确保高可用
  2. 定期备份集群数据
  3. 监控集群健康状态
  4. 测试故障恢复流程
  5. 使用支持集群的客户端

通过理解这些故障场景和恢复机制,可以更好地设计和维护Redis集群,确保业务的连续性和数据的安全性。

/src/technology/dateblog/2025/10/20251029-redis%E9%9B%86%E7%BE%A4%E8%8A%82%E7%82%B9%E6%95%85%E9%9A%9C%E4%B8%8E%E6%81%A2%E5%A4%8D%E8%AF%A6%E8%A7%A3.html