ES中Scatter-Gather查询模型

在多分片的Elasticsearch集群中,对搜索的查询大致分为如下两种。


一、在查询条件中包含了routing信息

即查询时可以根据routing信息直接定位到其中的一个分片进行查询,而不需要查询所有的分片,再经过协调节点二次排序。如图所示。

ES中Scatter-Gather查询模型



二、查询条件中不包含routing

在查询时就不知道要查询的数据具体在哪个片上,所以整个查询主要分为Scatter、Gather两个过程。

Scatter(分发):在请求到达协调节点后,协调节点把查询请求分发到每个分片上。

Gather(聚合):协调节点搜集在每个分片上完成的搜索结果,再将搜集的结果集进行重新排序,返回给用户请求的数据。如图所示。

ES中Scatter-Gather查询模型

通过对比上述两种查询流程,我们不难发现,使用routing查找的性能要好很多。

所以我们在设计Elasticsearch方案时要合理地利用routing来提升搜索性能。比如,在大型的本地分类网站中,可以考虑通过将城市id作为routing的条件,来作为分片的依据。

默认的公式如下:

shard_num = hash(routing) % number_of_primary_shards

routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。

routing 通过 hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到 余数 。这个分布在 0 到 number_of_primary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置。

根据城市id进行分片时,大型城市的分片上的数据过多,而小城市的分片上的数据太少,导致分片严重不均衡。这时就可以通过修改上述公式来保证分片的均匀,比如把多个小城市的数据合并到一个分片上,或者把大城市的数据分散到多个分片上。


分享到:


相關文章: