索引過程圖解
- api向集群發送索引請求,集群會使用負載均衡節點來處理該請求,如果沒有單獨的負載均衡點,master節點會充當負載均衡點的角色。
- 負載均衡節點根據routing參數來計算要將該索引存儲到哪個primary shard上,然后將數據給到對應的shard。
- 對應的shard拿到數據后進行索引寫入,寫入成功后,將數據給到自己的replica shard。
- 當replica shard也將數據成功寫入后,返回成功的結果到負載均衡節點。
- 此時負載均衡節點才認為數據寫入成功,將成功索引的結果返回給請求的api
routing(路由)參數
1、routing參數的指定和計算原理
每個document存放在哪個shard上是由routing參數決定的,那這個參數的值是什么,ElasticSearch又是怎么通過該參數來確定存放在哪個shard上呢?
- routing參數的默認值為_id,也可以進行手動指定routing參數,可以是值,也可以是某個字段:
PUT /index/type/id?routing=user_id
{
"user_id":"M9472323048",
"name":"zhangsan",
"age":54
}
- ElasticSearch有個哈希算法,通過 Hash(routing) % number_of_shards算得存儲到哪個shard上面去,比如上面的語句,假設Hash("M9472323048") = 23,該index含有3個shard,則存儲到 23 % 3 = 2,即P2上面。shard編號取值為0 number_of_shards - 1。
2、手動指定routing和自動routing的區別
routing的值默認為_id字段,_id可以保證在集群中唯一,但是有時候需要手動指定routing來優化后續的查詢過程。因為routing確定,那就可以指定用哪個routing進行查詢,縮減了目標結果集,減少了ElasticSearch集群的壓力。
使用自動routing:
優點: 簡單,可以很均衡的分配每個shard中的文檔數量,做到負載均衡
缺點: 當查詢一下復雜的數據時,需要到多個shard中查找,查詢偏慢
使用手動routing:
優點: 查詢時指定當初入庫的routing進行查詢,鎖定shard,直達目標,查詢速度快
缺點: 麻煩,要保證存儲的均衡比較復雜






