与向索引写入数据的时候必须是主分片来承担不同。搜索的时候,主分片和副本分片均可以承担,最终选用主分片还是副本分片是通过轮询的方式来进行选择的。
索引数据的搜索过程,依据有无路由值,分为两种:不带路由值的搜索请求和带路由值的搜索请求。
1、不带路由值的搜索请求
因为没有路由值(等同于没有指定要搜索的分片),所以也就无法确定到底要搜索索引中的哪个分片。这样的话,就要将索引的所有分片都搜索一边。又由于分片的主分片和副本分片都能提供搜索服务,那到底使用哪个来搜索呢?针对这个问题,ES采用的是轮询的策略来进行选择的。
下面我们通过一张图来简单说下不带路由值的搜索过程是怎么样的?
整个搜索过程分为四步:
- 「节点1」接收到一个不携带路由值的搜索请求,「节点1」成为本次搜索请求的协调节点。
- 由于没有搜索请求中没有路由值,所以需要搜索索引的所有分片(通过轮询从每个分片的主分片和副本分片二选一),假设本次选择要搜索的分片为P0、P1·、P2。由于P1在「节点3」上,所以需要将搜索请求从「节点1」转发至「节点3」(通过传输模块来完成这个动作)。
- 分别从P0、P1、P2三个分片上进行搜索,每个分片会将搜索结果中的前10条作为局部结果,返回给协调节点(节点1)来处理。
- 协调节点(「节点1」)将返回的局部结果进行汇总,然后根据请求的参数来进行排序,最后将前10条(默认)数据作为最终的结果返回。
2、带路由值的搜索请求
由于搜索请求中有路由值,我们就可以通过这个路由值来确定要搜索的分片。
下面还是通过一张图来简单说下带路由值的搜索过程是怎么样的?
整个搜索过程分为三步:
- 「节点1」接收到携带路由值的搜索请求,「节点1」成为本次搜索请求的协调节点。
- 根据携带的路由值,确定要搜索的分片,假设要搜索分片1,通过轮询从分片1的P1(主分片)和R1(副本分片)选择一个,假设选择了P1。由于P1是在「节点3」上,所以协调节点(「节点1」)要将搜索请求通过传输模块转发至「节点3」。
- 基于P1上的数据完成搜索,并将搜索结果排序后返回,默认会返回结果中的前10条数据。
3、参考文献
- 《Elasticsearch数据搜索与分析实战》——王深湛
上一篇:《聊一聊Elasticsearch的索引分片的恢复机制》
下一篇:《聊一聊Elasticsearch的索引(1)》