标准答案
- 心跳失败只能证明当前路径不可达,不能证明对方已经停止;过早接管会产生两个领导者。
- 锁服务、业务服务和资源存储可能观察到不同的网络视图,单一客户端判断无法覆盖全链路。
- 使用租约、仲裁、fencing token 和存储层版本拒绝旧写入,必要时让不确定的一方主动停止服务。
- 恢复后要核对双方产生的操作、冲突和数据对账,而不是只重启旧节点。
题目解析
心跳超时只能证明当前通信路径没有收到消息,不能证明对端进程已经停止。网络分区时双方可能都认为自己有资格工作,这就是脑裂风险。
锁服务、应用和业务存储可能处于不同的网络视图,单独在锁服务层做判断无法保护最终写入。租约、仲裁和 fencing 必须落到资源接受写入的边界。
网络恢复后不能直接把双方状态按到达顺序合并。应保留操作证据,按版本、业务不变量和对账规则判断冲突,必要时暂停自动合并。
常见误区
- 误区:把心跳超时当作对端已死。改正:将其视为通信不确定,使用租约、仲裁和 fencing 限制接管风险。
- 误区:只在锁服务层做 fencing。改正:数据库、文件或下游资源也要校验令牌或版本,拒绝旧写入。
- 误区:网络恢复后直接合并状态。改正:先对账和识别冲突,再按业务规则补偿,不能按消息到达顺序覆盖。