版本信息最后核对:2026-10-25
计划内切换应先冻结写入、等待复制追平并记录偏移,才可能把目标定为零丢失;故障转移发生在主节点不可用时,必须接受未复制写入的丢失,优先选择偏移最靠前的副本。自动故障转移时,Sentinel 依赖 Sentinel 多数派与 quorum,Cluster 依赖分片主节点多数派与槽位覆盖,两者判断条件不能混用;手工触发切换并不等于自动获得这些协调语义。
redis-cli -h <node> -p <port> INFO replication
redis-cli -h <node> -p <port> CLUSTER INFO
redis-cli -h <node> -p <port> CLUSTER NODES
redis-cli -h <sentinel> -p <sentinel-port> SENTINEL masters
redis-cli -h <sentinel> -p <sentinel-port> SENTINEL get-master-addr-by-name <master-name>
记录主节点 ID、副本地址、master_link_status、master_last_io_seconds_ago 和复制偏移。Cluster 还要记录槽位覆盖、每个主节点的槽区间、集群状态与 fail/pfail 标记。
master_repl_offset、connected_slaves 和复制积压,在副本查看 slave_repl_offset、slave_read_only 和最后通信时间:redis-cli -h <master> -p <port> INFO replication
redis-cli -h <master> -p <port> INFO persistence
Redis 复制是异步的,主节点写入成功不等于副本已确认,要评估“已写入主节点、尚未传播到副本”的窗口。WAIT 只对当前连接此前的写入生效,不能提供事务式强一致。同时记录 RDB 最近保存时间、AOF 状态和磁盘余量,确认副本有可用持久化文件。
检查脑裂防护。Sentinel 侧查看 quorum、down-after-milliseconds、failover-timeout、parallel-syncs,确认多数派健康。主从侧检查 min-replicas-to-write 与 min-replicas-max-lag 是否成对配置,它们不能替代网络隔离。Cluster 侧检查 cluster-node-timeout、cluster-require-full-coverage 和节点连通性,失去多数派时不要强行制造第二个主节点。
盘点客户端和发现方式。列出使用 Sentinel 感知客户端、Cluster 槽位感知客户端、直连地址、VIP、DNS、代理或连接池的应用,确认客户端能订阅 +switch-master、处理 MOVED 和 ASK,重连超时合理。直连旧主节点且不会自动发现拓扑的客户端是双写和报错的主要来源,必须在窗口前改造或停止。
准备隔离手段。故障转移前必须能迅速让旧主节点停止写入,例如撤销网络访问、摘除 VIP、关闭端口或停止进程。只设只读不够,已有连接和管理脚本仍可能写入;要同时排空连接池,确认没有绕过代理的写入方。
备份与回滚材料。切换前对每个主节点做可验证的快照或 AOF 备份,保留配置、Sentinel 状态、Cluster 节点信息和当前偏移。旧主节点重新加入时会被配置为副本并按权威数据同步,未传播的写入可能被丢弃,必要时先留快照供核对。
约定窗口、RPO/RTO 和验收标准。暂停批量写入、定时任务和数据迁移;通知业务方成功标准,例如关键 key 可读写、计数器不回退、会话仍有效。故障转移还要明确谁有权决定提升、谁负责隔离旧主节点、数据丢失如何说明。
记录主从和 Sentinel 状态,保存关键 key 的数量、类型、值和 TTL 样本。不要在生产使用 KEYS,优先用 INFO keyspace、DBSIZE 和有限模式的 SCAN:
redis-cli -h <master> -p <port> INFO all > /backup/redis-info-before.txt
redis-cli -h <master> -p <port> INFO keyspace > /backup/redis-keyspace-before.txt
redis-cli -h <master> -p <port> --scan --pattern 'order:*' | head -50 > /backup/redis-key-sample.txt
Cluster 要对每个主节点分别记录槽位、键数量和偏移。无法完全冻结写入时,至少把写入降到可控水平,并在验收时区分正常业务变化与切换丢失。
Sentinel 管理的集群优先通过 Sentinel 触发切换,而不是先在副本上手工执行 REPLICAOF NO ONE。但 SENTINEL FAILOVER 是把主节点当作失联来强制切换,不会替你暂停旧主写入或等待副本追平;计划内切换要先由应用侧冻结写入(或至少暂停非关键写入)、确认目标副本偏移已追平,并准备切断旧主的客户端入口,然后再触发:
# 只有在写入已冻结、副本偏移已追平后才执行;触发前后都要隔离旧主
redis-cli -h <sentinel> -p <sentinel-port> SENTINEL FAILOVER <master-name>
redis-cli -h <sentinel> -p <sentinel-port> SENTINEL get-master-addr-by-name <master-name>
持续观察 Sentinel 日志中的 +switch-master、+promoted-slave 事件和新主节点状态。切换期间写入可能短暂失败,应用应能重试;只读设置不能阻止旧主继续接收已有连接,必须同时撤销入口、VIP 或网络访问。状态未收敛时不要重复发起切换,否则会造成多次提升和反复全量同步。
计划内替换主节点,优先在目标副本上执行 CLUSTER FAILOVER。默认模式会协调主节点暂停写入、副本追平后切换;FORCE 用于主节点不可达但仍有多数派的场景,可能丢失未同步写入;TAKEOVER 不经其他主节点同意,只用于接受脑裂和数据丢失的灾难恢复,不能当作常规手段:
redis-cli -h <replica> -p <port> CLUSTER FAILOVER
redis-cli -h <node> -p <port> CLUSTER INFO
redis-cli -h <node> -p <port> CLUSTER SHARDS
确认 cluster_state:ok、槽位全部覆盖、目标副本持有原槽位、旧主节点变成副本且复制正常。若切换卡住,先检查节点连通性、多数派、槽位迁移和日志,不要连续重试或直接使用 TAKEOVER。
主节点已不可用时,先隔离旧主节点,再从副本中选择偏移最靠前、持久化健康、网络和磁盘正常的一台。纯主从部署可以手工提升:
redis-cli -h <replica> -p <port> REPLICAOF NO ONE
redis-cli -h <replica> -p <port> INFO replication
redis-cli -h <other-replica> -p <port> REPLICAOF <new-master> <port>
确认 role:master 且可以写入后,把其他副本指向新主节点。旧主节点必须保持隔离,确认没有需要保留的未同步写入后,才能作为副本重新加入;重新加入通常触发全量同步,分叉数据会被覆盖。
Sentinel 部署不要绕过 Sentinel 手工提升,否则它可能仍认为旧主节点是主。应使用 SENTINEL FAILOVER 或让 Sentinel 自动完成;Sentinel 失去多数派时先恢复网络和 quorum。Cluster 失去主节点多数派时无法安全选主,应优先恢复网络,不要在少数派上强行提升。
Sentinel 客户端应在收到 +switch-master 后重建连接池,Cluster 客户端应刷新槽位并正确处理 MOVED。更新 DNS、VIP、负载均衡或代理时提前降低 TTL;切换后滚动重启或排空连接池,确认没有进程仍持有旧主节点连接。先放少量流量做金丝雀,再逐步扩大。
redis-cli -h <new-master> -p <port> CLIENT LIST
redis-cli -h <new-master> -p <port> INFO clients
redis-cli -h <new-master> -p <port> INFO commandstats
CLIENT LIST 用于确认连接来源和数量,不建议在高峰长期开启 MONITOR。发现明确卡住的连接时按客户端 ID 精确清理,不要无差别杀掉全部连接。观察错误率、延迟、重连次数和慢查询,确认客户端没有在旧主节点和新主节点之间反复切换。
把旧主节点重建为副本,等待同步完成,确认偏移追平、master_link_status:up、副本可读。Sentinel 部署确认配置已收敛;Cluster 部署确认旧节点以副本身份加入、槽位归属正确。恢复批处理和定时任务,更新文档与告警,并制作新备份。
role:master,写入、读取和删除正常;副本 master_link_status:up,偏移持续接近新主节点。sdown/odown 抖动,日志没有反复切换;Cluster 的 cluster_state:ok、槽位全覆盖、每个主节点都有健康副本。MOVED、READONLY 或连接超时。新主节点无法写入或提升失败。 立即隔离该节点,从剩余副本中选择偏移最靠前的一台重新提升;不要把旧主节点直接放回写入池。记录已切换的客户端和可能丢失的写入,业务侧暂停非关键写操作。
出现脑裂。 两侧都能写入时,先停止一侧,比较复制偏移、键数量、关键 key 内容和业务日志,确定唯一权威数据源;另一侧必须重建或从备份恢复,不能手工合并猜测。旧主节点重新接纳时可能全量同步并丢弃分叉写入,要在同步前保存快照并评估损失。
Sentinel 失去多数派或反复切换。 暂停自动故障转移操作,检查 Sentinel 之间的网络、时钟、配置和 quorum,确认没有两个 Sentinel 集合管理同一主节点。恢复多数派后再让 Sentinel 收敛,不要通过手工删除配置来“修复”状态。
Cluster 失去多数派。 不要用 TAKEOVER 绕过多数派,除非已接受脑裂和数据丢失并由决策人批准。优先恢复节点间网络、重启故障节点、确认槽位和节点 ID;恢复后检查是否有分叉写入需要业务核对。
客户端仍连旧主节点。 保持旧主节点只读或隔离,检查 DNS TTL、VIP、代理、连接池和直连配置,逐步重启或排空应用。不要为了恢复应用而放开旧主节点写入,否则会把切换变成双写事故。
需要回滚。 计划内切换且旧主节点已追平时,可以按对称步骤切回:冻结写入、确认追平、触发提升、切换入口、重建新主节点为副本。故障转移后的回滚要更保守,先确认数据一致、没有双写,再把回滚当成一次新变更重新评审,并保留双方快照、量化写入差异。
合上页面,先回答,再展开对照。
CLUSTER FAILOVER 分别在什么条件下才能安全执行?SENTINEL FAILOVER 不会协调暂停写入,安全执行前必须由外部冻结写入、确认目标副本追平,并准备隔离旧主;Sentinel 之间仍要连通且 quorum 配置合理,不能把手工切换当成自动共识。Cluster 的默认 CLUSTER FAILOVER 要求主节点仍可达且集群有足够多数派,FORCE 和 TAKEOVER 只适用于明确接受数据丢失或脑裂风险的场景。
小程序版
微信扫码,随时查命令