面试题答案
一键面试脑裂问题产生原因
- 网络分区:Elasticsearch 集群节点间通过网络进行通信。当网络出现分区情况,例如部分节点间网络连接中断,集群会被分割成多个子网段。不同子网段内的节点都认为自己是集群的“主”部分,从而各自选举出不同的主节点,导致脑裂。
- 节点响应延迟:某些节点由于硬件性能问题、负载过高或 GC 频繁等,导致响应延迟。在选举主节点的过程中,其他节点等待响应超时,会认为该节点已失效,进而开始新的选举。而延迟的节点恢复正常后,可能会与新选举出的主节点形成脑裂。
可能导致的后果
- 数据不一致:不同“脑”中的节点可能会独立进行索引、删除等操作。例如,一个“脑”中的节点删除了某个文档,而另一个“脑”中的节点却可能还在对该文档进行更新操作,最终导致数据不一致。
- 索引操作异常:由于多个“主节点”的存在,索引操作可能会在不同“脑”中并行执行,导致索引结构损坏,影响查询性能和数据完整性。
- 集群状态混乱:集群状态信息在不同“脑”中不一致,可能导致新节点加入集群时出现异常,或者已存在节点无法正常与其他节点同步状态信息。
ElasticSearch预防和处理脑裂问题的机制
- 选举机制(底层原理):Elasticsearch 使用基于 Bully 算法的选举机制。节点通过比较节点 ID、版本号等信息来选举主节点。具有最高版本号和最高节点 ID 的节点会被选举为主节点。当网络分区或节点响应延迟等问题出现时,该机制可以在一定程度上保证只有一个主节点最终生效。只有满足法定人数(quorum)的节点集合才能选举出主节点,这有助于防止脑裂。
- 配置参数:
- discovery.zen.minimum_master_nodes:这个参数定义了选举主节点时需要的最少主节点数(法定人数)。计算公式为
(master_eligible_nodes / 2) + 1
。例如,有 5 个主节点候选节点,那么discovery.zen.minimum_master_nodes
应设置为 3。当节点集合达不到这个法定人数时,无法选举出主节点,从而避免脑裂。如果网络分区导致两个子网段,子网段 1 有 2 个节点,子网段 2 有 3 个节点,子网段 1 由于达不到法定人数 3,无法选举主节点,子网段 2 可以正常选举主节点,避免了脑裂。 - gateway.expected_nodes:指定集群中期望的节点数。如果实际节点数与该值相差较大,可能触发集群的一些自我保护机制,减少脑裂风险。但该参数自 Elasticsearch 7.0 后已被弃用,由
discovery.zen.minimum_master_nodes
替代其部分功能。 - discovery.zen.ping_timeout:定义节点间 Ping 操作的超时时间。如果节点在这个时间内没有收到其他节点的响应,会认为该节点无响应。适当调整这个参数,可以避免因短暂的网络延迟导致误判节点失效而引发脑裂。例如,在网络不稳定但延迟时间相对固定的环境中,可以适当调大该值。
- discovery.zen.minimum_master_nodes:这个参数定义了选举主节点时需要的最少主节点数(法定人数)。计算公式为