关于分片、查询偏好、路由三者在查询过程中的影响。
假设索引X包含4个分片,所有的分析基于这个前提进行讨论
GET /_search/?preference=_local&search_type=query_and_fetch
{
"query": {
"match_all": {}
}
}
整体流程:
http://x.x.x.x:9200/_cluster/state 获取routing_table。
获取查询索引所有分片信息 -> 根据路由筛选分片 -> 根据查询偏好筛选分片对应的es节点 -> 针对获取的分片及节点发送查询请求
详细分解流程:
1、client端发送请求到es集群的任意一个节点(transaction),该节点作为协调节点开始进行处理。
2、首先获取es集群中关于索引X的分片信息,得到分片1/2/3/4所在的节点。
3、如果查询请求中带有路由信息,那么会根据路由信息和步骤2中的分片信息获取所在分片。
如果查询请求中没有带有路由信息,那么就会获取步骤2中得到的所有分片信息。
4、针对每个分片获取该分片所在的es节点(譬如分片1包括1副本,那么分片1就分布在2个es节点上)
5、根据查询偏好(如_local)那么就在分片所在的多个es节点中按照本节点优先排在前面的方式进行查询
6、索引X包含4个分片,所以会发起4次查询请求(每个分片发送一个)。
7、在整个过程中路由和查询偏好决定了每个分片应该优先去哪个节点进行查询。