面试题答案
一键面试基本原理
- 节点通信与心跳检测:Elasticsearch 集群中的节点通过内部的通信机制互相发送心跳包。每个节点会定期向其他节点发送心跳消息,默认情况下,节点每秒发送一次心跳。这些心跳消息包含了节点的基本状态信息,如节点的角色(master 候选、数据节点等)、版本号等。
- 故障感知:当一个节点在一定时间内(默认是 30 秒,这个时间可以通过
discovery.zen.fd.ping_timeout
配置)没有收到来自另一个节点的心跳消息时,就会认为该节点可能发生了故障。这个故障检测机制基于节点间的双向心跳,即每个节点不仅要发送心跳,也要接收其他节点的心跳。 - Master 选举触发:如果疑似故障的节点是 master 节点,那么其他 master 候选节点(具备
master_eligible
角色的节点)会开始准备进行新一轮的 master 选举。在选举过程中,节点会交换选票,每个 master 候选节点会将选票投给它认为最合适的节点。通常,具有最高版本号、最高节点 ID 等综合因素最优的节点会赢得选举,成为新的 master 节点。 - 集群状态更新:一旦新的 master 节点选举出来,它会负责更新整个集群的状态信息。新的 master 节点会向集群中的所有节点广播新的集群状态,包括哪些节点是活动的、哪些分片应该分配到哪些节点上等信息。节点接收到新的集群状态后,会根据这些信息调整自己的状态和行为,例如重新分配分片等操作,以确保集群恢复到正常的工作状态。
核心组件
- 节点:
- Master 候选节点:具备成为 master 节点资格的节点,在 master 故障检测到后,参与 master 选举过程。它们通过内部通信机制交换选票,最终确定新的 master 节点。
- 数据节点:负责存储和处理数据分片。虽然不直接参与 master 选举,但在 master 节点发生故障并选举出新 master 后,数据节点会接收新 master 广播的集群状态更新,并根据新的状态进行数据分片的调整,如重新分配分片等操作。
- 通信模块:负责节点之间的心跳消息发送和接收,以及选举过程中的选票交换等通信工作。它基于内部的传输协议(如 TCP),确保节点间通信的可靠性和高效性。
- 选举模块:运行在 master 候选节点上,负责处理选举相关的逻辑。包括选票的收集、比较,以及确定最终的新 master 节点。选举算法通常基于 Zen Discovery 机制,通过比较节点的版本号、节点 ID 等因素来决定哪个节点成为新的 master。
- 集群状态管理模块:主要由 master 节点负责。当新的 master 节点选举产生后,该模块负责生成新的集群状态,并将其广播给集群中的所有节点。同时,在日常运行中,也负责监控集群状态的变化,如节点的加入、离开等,并及时更新集群状态。