面试题答案
一键面试主分片路由决策过程
- 索引创建时:在创建索引时,Elasticsearch 会根据用户指定的主分片数量(默认为5个),为每个主分片分配一个唯一的标识。这些主分片会被均匀分配到集群中的各个节点上。
- 数据写入时:当有新的数据写入时,Elasticsearch 首先根据文档的
_id
(如果未指定_id
,Elasticsearch 会自动生成一个),通过哈希算法计算出一个哈希值。这个哈希值会用来确定该文档应该被路由到哪个主分片上。
关键因素
- 主分片数量:主分片数量在索引创建时就已确定,并且后续无法轻易更改。它决定了数据在集群中的分布粒度。如果主分片数量过多,会增加管理开销;如果过少,可能导致数据分布不均,影响性能。
- 文档
_id
:文档的_id
是路由决策的重要依据。由于哈希算法的特性,相同_id
的文档总是会被路由到同一个主分片上,这保证了数据的一致性。 - 集群拓扑结构:集群中的节点数量和状态也会影响主分片的路由。如果某个节点故障,Elasticsearch 会自动重新分配主分片到其他健康节点上,以保证数据的可用性。
计算方式
- 哈希计算:Elasticsearch 使用
MurmurHash3
算法对文档的_id
进行哈希计算,得到一个哈希值。 - 取模运算:将哈希值对主分片数量进行取模运算,即
hash(_id) % number_of_primary_shards
。得到的结果就是该文档应该被路由到的主分片的编号。例如,如果主分片数量为5,哈希值对5取模后得到0,那么该文档就会被路由到编号为0的主分片上。