面试题答案
一键面试预防脑裂问题措施
- 多数表决机制:
- 在分布式系统中,设定一个法定人数(quorum)。例如,对于有5个节点的集群,法定人数可以设为3。只有当超过这个法定人数的节点同意选举某个领导时,该领导选举才被视为有效。这样可以避免因网络分区导致的部分节点各自选出不同领导的情况。
- 每次领导选举时,候选节点向其他节点发送选举请求,收到超过法定人数的赞成票后才能成为领导。
- 租约(Lease)机制:
- 领导节点持有一个租约,租约有一定的有效期。在租约到期前,领导需要不断续约。
- 其他节点只有在领导的租约过期后,才会重新发起领导选举。这确保了在正常情况下,不会同时出现多个认为自己是领导的节点。例如,租约有效期可以设置为10秒,领导节点每隔5秒向其他节点发送续约消息。
处理脑裂问题措施
- 优先级策略:
- 为每个节点分配一个唯一的优先级。在领导选举过程中,如果出现网络分区导致多个分区各自选出领导,系统可以通过比较这些“领导”节点的优先级来确定最终的领导。例如,ID号小的节点优先级高,当网络恢复后,优先级高的节点领导整个集群,低优先级节点自动降级为普通节点。
- 数据一致性恢复:
- 当检测到脑裂并确定唯一领导后,需要对不同分区的数据进行一致性恢复。可以采用日志复制(如Raft协议中的日志复制机制),以领导节点的数据日志为基准,将其他分区的数据更新到与领导节点一致。
网络分区检测方式
- 心跳检测:
- 节点之间定期发送心跳消息,例如每隔1秒发送一次。如果一个节点在一定时间(如3秒)内没有收到某个邻居节点的心跳消息,则认为可能出现了网络分区。
- 心跳消息可以携带一些简单的状态信息,如节点当前的角色(领导、普通节点等)和最近一次数据更新的时间戳。
- 故障探测器(Failure Detector):
- 采用分布式故障探测器算法,如基于流言协议(Gossip Protocol)的故障探测器。节点间通过随机地与其他节点交换状态信息,当某个节点长时间没有被其他节点“提及”时,就被认为可能出现故障或处于网络分区中。
网络分区处理方式
- 等待网络恢复:
- 当检测到网络分区后,在一定时间内(如5分钟),系统保持当前状态,各分区内的节点继续执行本地操作,但不进行可能导致数据不一致的关键操作(如写入新数据到共享存储)。等待网络恢复后,按照上述处理脑裂问题的方式进行处理。
- 主动合并:
- 当网络分区时间超过一定阈值(如5分钟),系统启动主动合并流程。可以由一个特定的协调节点(例如优先级最高的节点所在分区的节点)发起合并操作,向其他分区的节点发送合并请求,协商数据一致性和领导选举结果。