面试题答案
一键面试- 路由算法基础:
- Elasticsearch使用一致性哈希算法来路由文档到具体的分片。每个文档在索引时,会根据其
_id
(如果没有指定_id
,Elasticsearch会自动生成一个)通过哈希函数计算出一个哈希值。这个哈希值会决定文档应该被路由到哪个分片。 - 公式大致为:
shard = hash(_id) % number_of_primary_shards
。例如,如果有5个主分片,文档_id
计算出的哈希值为10,那么shard = 10 % 5 = 0
,文档就会被路由到主分片0。
- Elasticsearch使用一致性哈希算法来路由文档到具体的分片。每个文档在索引时,会根据其
- 集群状态与分片分配:
- 在集群环境下,Elasticsearch的集群状态信息(存储在master节点)包含了索引的分片分配信息,即哪些分片在哪些节点上。当一个节点接收到索引API请求时,它首先会检查集群状态。
- 如果请求的节点不是主节点,它会将请求转发给主节点。主节点负责协调文档的索引操作。主节点根据集群状态中索引的分片分配信息,确定文档应该被路由到的具体分片所在的节点。
- 副本分片处理:
- 一旦文档成功写入主分片,主节点会将这个操作转发到该分片的所有副本分片所在的节点。副本分片会复制主分片的更改,以保证数据的冗余和高可用性。
- 这个过程中,副本分片的写入确认机制可以配置,比如可以设置为所有副本分片都确认写入成功后才返回成功响应给客户端(
consistency=all
),也可以设置为部分副本分片确认成功就返回(consistency=quorum
,默认)。
- 动态调整与重新路由:
- 当集群发生变化,如节点加入或离开时,Elasticsearch会自动重新平衡分片。主节点会根据新的集群状态重新计算分片的分配,并将部分分片迁移到新的节点上。
- 对于已经索引的文档,由于是基于
_id
的哈希值路由到分片,即使分片发生迁移,只要主分片数量不变,文档依然可以通过相同的路由算法找到对应的新位置的分片。