面试题答案
一键面试故障检测
- 节点间心跳机制:Elasticsearch 集群中的节点通过定期发送心跳(ping)消息来互相监控状态。每个节点会周期性地向其他节点发送 ping 请求,并期望在一定时间内收到响应。如果在设定的时间(如
discovery.zen.ping_timeout
配置项指定的时间,默认 3 秒)内未收到某个节点的响应,该节点会被标记为疑似故障。 - 集群状态监控:主节点负责维护整个集群的状态信息,包括节点列表、分片分配等。主节点也会通过心跳来监控所有节点的状态。如果主节点在一定时间内未收到某个节点的心跳,它会更新集群状态,将该节点标记为可能故障。
隔离
- 移除故障节点信息:一旦主节点确认某个节点故障(经过多次心跳失败确认),它会在集群状态中移除该故障节点的信息。这包括从节点列表中删除该节点的记录,以及更新涉及该节点的分片分配信息。
- 数据分片重新分配:由于故障节点上可能承载着数据分片,主节点会根据集群当前的状态(如其他节点的负载、剩余空间等),重新分配这些分片到其他健康的节点上。这一过程会触发数据的复制和迁移,以确保数据的可用性和冗余性。
重新选举
- 选举资格检查:当主节点故障时,集群需要重新选举产生新的主节点。首先,候选主节点(通过
node.master: true
配置的节点)会检查自身是否符合选举条件。这些条件包括节点的版本兼容性、是否具有完整的集群状态信息等。 - 选举过程:
- 符合条件的候选主节点会发起选举请求,向其他候选主节点发送投票请求。
- 每个候选主节点在收到投票请求后,会根据一定的规则(如节点 ID 的字典序、节点的权重等,具体由选举算法决定)决定是否投票给该请求节点。
- 当某个候选主节点获得超过半数(
discovery.zen.minimum_master_nodes
配置项,建议设置为(master_eligible_nodes / 2) + 1
)的投票时,它将成为新的主节点。
- 集群状态恢复:新的主节点当选后,它会从其他节点收集最新的集群状态信息,以确保自己拥有完整且一致的状态。然后,主节点会向所有节点广播新的集群状态,使整个集群恢复正常运行,并继续监控节点状态,处理可能出现的故障。