ES:document增刪改內部原理揭祕
1、路由演算法:shard = hash(routing) % number_of_primary_shards
這裡是引用決定一個document在哪個shard上,最重要的一個值就是routing值,預設是_id,也可以手動指定,相同的routing值,每次過來,從hash函式中,產出的hash值一定是相同的
無論hash值是幾,無論是什麼數字,對number_of_primary_shards求餘數,結果一定是在0~number_of_primary_shards-1之間這個範圍內的。
預設的routing就是_id
手動指定routing value是很有用的,可以保證說,某一類document一定被路由到一個shard上去,那麼在後續進行應用級別的負載均衡,以及提升批量讀取的效能的時候,是很有幫助的。
2、增刪改內部原理
(1)客戶端選擇一個node傳送請求過去,這個node就是coordinating node(協調節點)
(2)coordinating node,對document進行路由,將請求轉發給對應的node(有primary shard)
(3)實際的node上的primary shard處理請求,然後將資料同步到replica node
(4)coordinating node,如果發現primary node和所有replica node都搞定之後,就返回響應結果給客戶端
3、寫一致性原理以及quorum機制
(1)我們在傳送任何一個增刪改操作的時候,比如說put /index/type/id,都可以帶上一個consistency引數,指明我們想要的寫一致性是什麼?
put /index/type/id?consistency=quorum
one:要求我們這個寫操作,只要有一個primary shard是active活躍可用的,就可以執行
all:要求我們這個寫操作,必須所有的primary shard和replica shard都是活躍的,才可以執行這個寫操作
quorum:預設的值,要求所有的shard中,必須是大部分的shard都是活躍的,可用的,才可以執行這個寫操作
(2)quorum機制,寫之前必須確保大多數shard都可用,int( (primary + number_of_replicas) / 2 ) + 1,當number_of_replicas>1時才生效
quroum = int( (primary + number_of_replicas) / 2 ) + 1
(3)如果節點數少於quorum數量,可能導致quorum不齊全,進而導致無法執行任何寫操作
1個primary shard,replica=3,quorum=((1+3)/2)= 3,要求1個primary shard + 3個replica shard =4 個shard,其中必須3個shard是要求active狀態的,如果這個時候就兩臺機器,會出現什麼情況那?
es提供了一種特殊的處理場景,就是說當number_of_replicas>1時才生效,
一個primary shard,replica=1,此時就2個shard ((1 + 1)/ 2) + 1 = 2,要求必須有2個shard是活躍的,但是可能就1個node,此時就1個shard是活躍的,如果你不特殊處理的話,導致我們的單節點叢集就無法工作。
(4)quorum不齊全時,wait,預設1分鐘,timeout,100,30s
等待期間,期望活躍的shard數量可以增加,最後實在不行,就會timeout
加一個timeout引數,比如說
put /index/type/id?timeout=30
,這個就是說自己去設定quorum不齊全的時候,es的timeout時長,可以縮短,也可以增長