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