關于分片、查詢偏好、路由三者在查詢過程中的影響。
假設索引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、在整個過程中路由和查詢偏好決定了每個分片應該優先去哪個節點進行查詢。