标准答案

  1. 心跳失败只能证明当前路径不可达,不能证明对方已经停止;过早接管会产生两个领导者。
  2. 锁服务、业务服务和资源存储可能观察到不同的网络视图,单一客户端判断无法覆盖全链路。
  3. 使用租约、仲裁、fencing token 和存储层版本拒绝旧写入,必要时让不确定的一方主动停止服务。
  4. 恢复后要核对双方产生的操作、冲突和数据对账,而不是只重启旧节点。

题目解析

心跳超时只能证明当前通信路径没有收到消息,不能证明对端进程已经停止。网络分区时双方可能都认为自己有资格工作,这就是脑裂风险。

锁服务、应用和业务存储可能处于不同的网络视图,单独在锁服务层做判断无法保护最终写入。租约、仲裁和 fencing 必须落到资源接受写入的边界。

网络恢复后不能直接把双方状态按到达顺序合并。应保留操作证据,按版本、业务不变量和对账规则判断冲突,必要时暂停自动合并。

常见误区

  • 误区:把心跳超时当作对端已死。改正:将其视为通信不确定,使用租约、仲裁和 fencing 限制接管风险。
  • 误区:只在锁服务层做 fencing。改正:数据库、文件或下游资源也要校验令牌或版本,拒绝旧写入。
  • 误区:网络恢复后直接合并状态。改正:先对账和识别冲突,再按业务规则补偿,不能按消息到达顺序覆盖。

作者信息