1. 程式人生 > >ElasticSearch最佳入門實踐(二十八)剖析document資料路由原理

ElasticSearch最佳入門實踐(二十八)剖析document資料路由原理

1、document路由到shard上是什麼意思?

我們這段,一個index的資料會被分為多片,每個片都在一個shard中,所以說,一個document存在於一個shard中
當客戶端建立的時候,es此時就需要決定說,這個document存在於那個shard上。
這個過程就稱之為 document routing ,資料路由。

2、路由演算法:shard = hash(routing) % number_of_primary_shards

舉個例子,一個index有3個primary shard,P0,P1,P2
每次增刪改查一個document的時候,都會帶過來一個routing number,預設就是這個document的_id(可能是手動指定,也可能是自動生成)
routing = _id,假設_id=1
會將這個routing值,傳入一個hash函式中,產出一個routing值的hash值,hash(routing) = 21
然後將hash函式產出的值對這個index的primary shard的數量求餘數,21 % 3 = 0
就決定了,這個document就放在P0上。

決定一個document在哪個shard上,最重要的一個值就是routing值,預設是_id,也可以手動指定,相同的routing值,每次過來,從hash函式中,產出的hash值一定是相同的

無論hash值是幾,無論是什麼數字,對number_of_primary_shards求餘數,結果一定是在0~(number_of_primary_shards-1)之間這個範圍內的。0,1,2。

3、_id or custom routing value

預設的routing就是_id
也可以在傳送請求的時候,手動指定一個routing value,比如說put /index/type/id?routing=user_id
手動指定routing value是很有用的,可以保證說,某一類document一定被路由到一個shard上去,那麼在後續進行應用級別的負載均衡,以及提升批量讀取的效能的時候,是很有幫助的

4、primary shard數量不可變的謎底

原先有3個shard ,PO、P1、P2。現在想新增一個 P3
我現在要獲取 get/index/type/1
根據路由公式
routing = _id,假設_id=1
會將這個routing值,傳入一個hash函式中,產出一個routing值的hash值,hash(routing) = 21
然後將hash函式產出的值對這個index的primary shard的數量求餘數,21 % 4 = 1
這個時候根據公式算出來的結果會跑到 P1 shard上去
結果發現沒有找到。就會導致資料丟失