面试题答案
一键面试- 检测故障节点:
- Elasticsearch通过内部的节点发现机制(如Zen Discovery或基于云的发现)来检测节点故障。节点定期向集群中的其他节点发送心跳包,如果一段时间内没有收到某个节点的心跳,就会判定该节点故障。
- 决策机制:
- 重新分配决策:
- 分片副本可用性:Elasticsearch首先会查看故障节点上主分片的副本分片所在位置。如果有足够的副本分片(副本数量满足
replicas
设置且副本健康),则可以将其中一个副本提升为主分片。例如,若一个索引有1个主分片和1个副本分片,主分片在故障节点上,另一个副本分片在其他健康节点上,那么这个副本分片可提升为主分片。 - 分配过滤:集群会考虑
cluster.routing.allocation
相关设置,如cluster.routing.allocation.awareness.attributes
,它用于定义某些属性(如机架、数据中心等),确保分片均匀分配在不同属性的节点上,避免新的主分片和副本分片都分配到同一类型节点,以防止出现单点故障。例如,如果设置了机架感知,不会将新的主分片和副本分片都分配到同一机架的节点上。
- 分片副本可用性:Elasticsearch首先会查看故障节点上主分片的副本分片所在位置。如果有足够的副本分片(副本数量满足
- 平衡决策:
- 集群负载均衡:在重新分配分片时,Elasticsearch会考虑整个集群的负载情况。它会尽量将分片分配到负载较低的节点上,以保证集群整体性能。负载指标包括CPU使用率、内存使用率、磁盘I/O等。例如,如果节点A的CPU使用率长期在80%以上,而节点B的CPU使用率在30%,则更倾向于将分片分配到节点B。
- 分片数量均衡:还会考虑每个节点上的分片数量。目标是使各个节点上的分片数量相对均衡,避免某个节点承载过多分片。例如,若节点C有100个分片,节点D只有20个分片,在重新分配时会优先考虑将分片分配到节点D。
- 重新分配决策:
- 数据迁移方式:
- 提升副本为主分片:如果有可用的副本分片,会将其提升为主分片。这个过程相对快速,因为副本分片的数据与主分片基本一致(在故障前)。例如,当副本分片被提升为主分片后,它开始接收新的写入请求,并维护索引的一致性。
- 重新复制:对于没有副本的主分片或者需要补充副本数量的情况,Elasticsearch会从现有的主分片(如果有)或其他副本分片复制数据到新分配的节点上。数据复制是通过内部的传输机制进行的,它会逐段复制数据,同时保证数据的一致性。例如,在复制过程中会使用版本号等机制来确保复制的数据与源数据一致,避免数据丢失或损坏。新的副本分片在完成复制后,会与主分片保持同步,接收主分片的更新请求以维持数据一致性。