[elasticsearch] 關於 Split Brain / cluster split 成兩個 clusters

Intro

使用 Elasticsearch時,會先設定 Cluster Name。cluster name 就是用來判斷 cluster 裡面的 node 怎麼做 discover 與 怎麼 auto-join 這些 nodes。

這裡必須再說明一下,關於 elasticsearch 的 discovery modules。 discovery module 負責來發現集群內節點,還有負責選出哪個節點是 master 。
Elasticsearch 是的 Peer to Peer p2p baseed system,意味著每個nodes間,直接與另外的 node 做溝通。(每個node會建立起單向的連線,並且再各自間建立起至少13條連線 連線內容容後再敘 ) 主要的API (index,delete,search ) 並不會與 master node做連線。
Master node 的主要工作,就是

  • 維護 cluster 的 state
  • 決定nodes 是否可以加入cluster 內
  • 分配 shard

不過,當state改變時,其他nodes怎麼獲知的就取決於discovery 的實際實作。
所以,在 production 的 cluster ,setting 內的 " cluster.name" 是強烈建議要修改的。預設值是 “elasticsearch"。

Split Brain Problem

split brian 的根本問題在 nodes 不可用(node unavailable),一般而也可能是 out of memorey (constant GC), 過高的 threads或者是網路的問題。
所以,特定節點連不到,或者是該節點當好是master node,就會發生 split 成兩個 cluster的問題。

Elasticsearch 官方目前已經在改進 consensus/election algorithm 來避免發生 split  brain 的情況。

“discovery.zen.publish_timeout" 預設值是 30 秒,當每個節點接受到 master的請求時,他會回復並且更新自己的狀態到 master節點上。當 timeout了,會繼續去執行queue裡面的 node list。

目前比較典型的解決方案,可以設置 “discovery.zen.minimum_master_nodes" 。設定 master 的最小數目,建議在超過兩個節點時,可以設置較高的值,推薦的數字為 n/2+1。( n 是 nodes 數)。 另外一方面,也可以設置 indices.recovery.max_bytes_per_sec default 20mb/s 去調降 cluster 內的網路流量。

在production的環境中,加上 dedicated master node ,更可以有效的避免,split brain 的問題。

一般來說,還是要找出,為什麼 loading 集中的問題點,才能徹底解決這個問題。(例如,requested node 在同一個時間內,要處理過多的requests。除了可以調整 thread pool 來觀察,也可以觀察 每個nodes 的memory 與 cpu 用量。)

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

w

連結到 %s