1、document數(shù)據(jù)路由原理
(1)document路由到shard上是什么意思?
一個(gè)index的數(shù)據(jù)會(huì)被分為多片,每片都在一個(gè)shard中。所以說(shuō),一個(gè)document,只能存在于一個(gè)shard中。
當(dāng)客戶端創(chuàng)建document的時(shí)候,es此時(shí)就需要決定說(shuō),這個(gè)document是放在這個(gè)index的哪個(gè)shard上。
這個(gè)過(guò)程,就稱之為document routing,數(shù)據(jù)路由。
(2)路由算法:shard = hash(routing) % number_of_primary_shards
number_of_primary_shards:primary shard的數(shù)量。
- 舉個(gè)例子,一個(gè)index有3個(gè)primary shard,P0,P1,P2。
每次增刪改查一個(gè)document的時(shí)候,都會(huì)帶過(guò)來(lái)一個(gè)routing number,默認(rèn)就是這個(gè)document的_id(可能是手動(dòng)指定,也可能是自動(dòng)生成)
routing = _id,假設(shè)_id=1
然后會(huì)將這個(gè)routing值,傳入一個(gè)hash函數(shù)中,產(chǎn)出一個(gè)routing值的hash值,hash(routing) = 21
然后將hash函數(shù)產(chǎn)出的值對(duì)這個(gè)index的primary shard的數(shù)量求余數(shù),21 % 3 = 0
就決定了,這個(gè)document就放在P0上。
決定一個(gè)document在哪個(gè)shard上,最重要的一個(gè)值就是routing值,默認(rèn)是_id,也可以手動(dòng)指定,相同的routing值,每次過(guò)來(lái),從hash函數(shù)中,產(chǎn)出的hash值一定是相同的
無(wú)論hash值是幾,無(wú)論是什么數(shù)字,對(duì)number_of_primary_shards求余數(shù),結(jié)果一定是在0~number_of_primary_shards-1之間這個(gè)范圍內(nèi)的。0,1,2。
(3)_id or custom routing value
- 默認(rèn)的routing就是_id,也可以在發(fā)送請(qǐng)求的時(shí)候,手動(dòng)指定一個(gè)routing value,比如說(shuō)put /index/type/id?routing=user_id
手動(dòng)指定routing value是很有用的,可以保證說(shuō),某一類document一定被路由到一個(gè)shard上去,那么在后續(xù)進(jìn)行應(yīng)用級(jí)別的負(fù)載均衡,以及提升批量讀取的性能的時(shí)候,是很有幫助的
(4)primary shard數(shù)量不可變的謎底

2、_document增刪改內(nèi)部原理圖解
(1)客戶端選擇一個(gè)node發(fā)送請(qǐng)求過(guò)去,這個(gè)node就是coordinating node(協(xié)調(diào)節(jié)點(diǎn))
(2)coordinating node,對(duì)document進(jìn)行路由,將請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)的node(有primary shard)
(3)實(shí)際的node上的primary shard處理請(qǐng)求,然后將數(shù)據(jù)同步到replica node
(4)coordinating node,如果發(fā)現(xiàn)primary node和所有replica node都搞定之后,就返回響應(yīng)結(jié)果給客戶端

3、_document查詢內(nèi)部原理
1、客戶端發(fā)送請(qǐng)求到任意一個(gè)node,成為coordinate node
2、coordinate node對(duì)document進(jìn)行路由,將請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)的node,此時(shí)會(huì)使用round-robin隨機(jī)輪詢算法,在primary shard以及其所有replica中隨機(jī)選擇一個(gè),讓讀請(qǐng)求負(fù)載均衡
3、接收請(qǐng)求的node返回document給coordinate node
4、coordinate node返回document給客戶端
5、特殊情況:document如果還在建立索引過(guò)程中,可能只有primary shard有,任何一個(gè)replica shard都沒(méi)有,此時(shí)可能會(huì)導(dǎo)致無(wú)法讀取到document,但是document完成索引建立之后,primary shard和replica shard就都有了
