面试题答案
一键面试网络分区导致异常的原因
- 脑裂问题:当网络分区发生时,集群可能会被分割成多个部分。不同部分中的节点可能都认为自己是集群的一部分,并尝试进行Master选举。这就可能导致多个节点自认为是Master,从而出现“脑裂”现象。例如,一个原本由5个节点组成的集群,由于网络分区分成了两个子网,一个子网中有3个节点,另一个子网中有2个节点。这两个子网中的节点都可能各自进行Master选举,产生两个“Master”,使得集群状态不一致,数据同步等操作出现混乱。
- 节点失联判断不准确:ElasticSearch通过节点间的心跳检测来判断节点是否存活。在网络分区情况下,由于网络延迟或中断,部分节点可能无法及时收到其他节点的心跳信息,从而错误地认为对方节点已失联。例如,网络分区导致部分节点之间的网络延迟从正常的几毫秒增加到数秒甚至更长,这就可能使节点在等待心跳超时后,将原本正常运行的节点判定为失联,进而触发不必要的Master选举,引发异常。
常见应对策略 - 法定人数设置
- 原理:通过设置一个法定人数(quorum),只有当参与选举的节点数量达到这个法定人数时,选举才能生效。在ElasticSearch中,法定人数的计算公式通常为
(master eligible nodes / 2) + 1
。例如,有5个具备成为Master资格的节点,那么法定人数就是(5 / 2) + 1 = 3
。这样可以避免在网络分区时,小的子网由于节点数不足法定人数而无法选出Master,从而防止脑裂问题。 - 配置方式:在
elasticsearch.yml
配置文件中,可以通过discovery.zen.minimum_master_nodes
参数来设置法定人数。比如要设置法定人数为3,可以在配置文件中添加discovery.zen.minimum_master_nodes: 3
。在集群启动和运行过程中,ElasticSearch会根据这个配置来进行Master选举,只有当满足法定人数的节点参与选举并达成共识时,才会产生有效的Master节点,从而降低因网络分区导致异常的风险。