下面直接點,先描述一下一個增刪改請求打過來Elasticsearch內部作了什麼。
如圖
(1)對於客戶端首先會選擇一個節點node發送請求過去,這個節點node就是協調節點coordinating node
(2)協調節點coordinating node會對docuemnt數據進行路由,將請求轉發給對應的node(含有primary shard)
(3)實際上node的primary shard會處理請求,而後將數據同步到對應的含有replica shard的node
(4)協調節點coordinating node若是發現含有primary shard的node和全部的含有replica shard的node都搞定以後,就會返回響應結果給客戶端node
下面手工畫圖展現一下上面的過程:
假設咱們有2個節點,5個primary shard replica=1
網絡
一、客戶端發送增刪改請求給協調節點node2
二、協調節點node2將請求路由到含有primary shard的node1
三、node1處理請求,並同步數據到對應的含有replica shard的node2
四、協調節點node2若是發現含有primary shard的node1以及全部含有replica shard的node2都搞定了,就會返回響應結果給客戶端ide
consistency
默認狀況下,主分片須要法定數量或大部分的分片副本(其中分片副本能夠是主分片或副本分片)在嘗試寫入操做以前可用。這是爲了防止將數據寫入網絡分區的 「wrong side」。法定人數定義以下:spa
int((primary + number_of_replicas)/ 2)+ 1
容許的值consistency是one(僅主要分片),all (主要和全部副本),或默認quorum或大多數分片副本。code
請注意,它number_of_replicas是索引設置中指定的副本數,而不是當前活動的副本數。若是您已指定索引應具備三個副本,則仲裁將以下所示:blog
int( (primary + 3 replicas) / 2 ) + 1 = 4
可是,若是僅啓動兩個節點,則將沒有足夠的活動分片副原本知足仲裁,而且您將沒法索引或刪除任何文檔。索引
timeout
若是可用的分片副本不足,會發生什麼?Elasticsearch等待,但願會出現更多的分片。默認狀況下,它將等待最多1分鐘。若是須要,可使用timeout參數讓它更快地停止:100是100毫秒,30s是30秒。
注意
默認狀況下,新索引具備一個副本,這意味着應該須要兩個活動分片副本以知足須要的quorum。可是,這些默認設置會阻止咱們對單節點羣集執行任何有用的操做。爲避免此問題,僅當number_of_replicas大於1時才強制要求仲裁。圖片
移除consistency這個參數以後,用wait_for_active_shards這個參數替代了。
緣由就是,consistency檢查是在Put以前作的。然而,雖然檢查的時候,shard知足quorum,可是真正從primary shard寫到replica以前,仍會出現shard掛掉,但Update Api會返回succeed。所以,這個檢查並不能保證replica成功寫入,甚至這個primary shard是否能成功寫入也未必能保證。ip
爲了提升對系統寫入的彈性,使用wait_for_active_shards,能夠將索引操做配置爲在繼續操做以前等待必定數量的活動分片副本。若是必需數量的活動分片副本不可用,則寫入操做必須等待並重試,直到必需的分片副本已啓動或發生超時。默認狀況下,寫入操做僅等待主分片在繼續(即wait_for_active_shards=1)以前處於活動狀態。
注意,此設置大大下降了寫入操做不寫入所需數量的分片副本的可能性,但它並未徹底消除這種可能性,由於此檢查在寫入操做開始以前發生。一旦寫入操做正在進行,複製在任何數量的分片副本上仍然可能失敗,但仍然能夠在主分片上成功。在_shards寫操做的響應部分揭示了其複製成功/失敗碎片的份數。路由
PUT /test_index/_doc/20?wait_for_active_shards=1 { "test_field":"test consistency" } { "_index" : "test_index", "_type" : "_doc", "_id" : "20", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 10, "_primary_term" : 2 } "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }