您好,登錄后才能下訂單哦!
如何防止elasticsearch的腦裂問題,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
讓我們看一個有兩個節(jié)點的elasticsearch集群的簡單情況。集群維護一個單個索引并有一個分片和一個復制節(jié)點。節(jié)點1在啟動時被選舉為主節(jié)點并保存主分片(在下面的schema里標記為0P),而節(jié)點2保存復制分片(0R)
現(xiàn)在,如果在兩個節(jié)點之間的通訊中斷了,會發(fā)生什么?由于網絡問題或只是因為其中一個節(jié)點無響應(例如stop-the-world垃圾回收),這是有可能發(fā)生的。
兩個節(jié)點都相信對方已經掛了。節(jié)點1不需要做什么,因為它本來就被選舉為主節(jié)點。但是節(jié)點2會自動選舉它自己為主節(jié)點,因為它相信集群的一部分沒有主節(jié)點了。在elasticsearch集群,是有主節(jié)點來決定將分片平均的分布到節(jié)點上的。節(jié)點2保存的是復制分片,但它相信主節(jié)點不可用了。所以它會自動提升復制節(jié)點為主節(jié)點。
現(xiàn)在我們的集群在一個不一致的狀態(tài)了。打在節(jié)點1上的索引請求會將索引數(shù)據分配在主節(jié)點,同時打在節(jié)點2的請求會將索引數(shù)據放在分片上。在這種情況下,分片的兩份數(shù)據分開了,如果不做一個全量的重索引很難對它們進行重排序。在更壞的情況下,一個對集群無感知的索引客戶端(例如,使用REST接口的),這個問題非常透明難以發(fā)現(xiàn),無論哪個節(jié)點被命中索引請求仍然在每次都會成功完成。問題只有在搜索數(shù)據時才會被隱約發(fā)現(xiàn):取決于搜索請求命中了哪個節(jié)點,結果都會不同。
elasticsearch的默認配置很好。但是elasticsearch項目組不可能知道你的特定場景里的所有細節(jié)。這就是為什么某些配置參數(shù)需要改成適合你的需求的原因。這篇博文里所有提到的參數(shù)都可以在你elasticsearch安裝地址的config目錄中的elasticsearch.yml中更改。
要預防腦裂問題,我們需要看的一個參數(shù)就是 discovery.zen.minimum_master_nodes。這個參數(shù)決定了在選主過程中需要 有多少個節(jié)點通信。缺省配置是1.一個基本的原則是這里需要設置成 N/2+1, N是集群中節(jié)點的數(shù)量。例如在一個三節(jié)點的集群中, minimum_master_nodes應該被設為 3/2 + 1 = 2(四舍五入)。
讓我們想象下之前的情況下如果我們把 discovery.zen.minimum_master_nodes 設置成 2(2/2 + 1)。當兩個節(jié)點的通信失敗了,節(jié)點1會失去它的主狀態(tài),同時節(jié)點2也不會被選舉為主。沒有一個節(jié)點會接受索引或搜索的請求,讓所有的客戶端馬上發(fā)現(xiàn)這個問題。而且沒有一個分片會處于不一致的狀態(tài)。
我們可以調的另一個參數(shù)是 discovery.zen.ping.timeout。它的默認值是3秒并且它用來決定一個節(jié)點在假設集群中的另一個節(jié)點響應失敗的情況時等待多久。在一個慢速網絡中將這個值調的大一點是個不錯的主意。這個參數(shù)不止適用于高網絡延遲,還能在一個節(jié)點超載響應很慢時起作用。
如果你覺得(或直覺上)在一個兩節(jié)點的集群中把minimum_master_nodes參數(shù)設成2是錯的,那就對了。在這種情況下如果一個節(jié)點掛了,那整個集群就都掛了。盡管這杜絕了腦裂的可能性,但這使elasticsearch另一個好特性 - 用復制分片來構建高可用性 失效了。
如果你剛開始使用elasticsearch,建議配置一個3節(jié)點集群。這樣你可以設置minimum_master_nodes為2,減少了腦裂的可能性,但仍然保持了高可用的優(yōu)點:你可以承受一個節(jié)點失效但集群還是正常運行的。
但如果已經運行了一個兩節(jié)點elasticsearch集群怎么辦?可以選擇為了保持高可用而忍受腦裂的可能性,或者選擇為了防止腦裂而選擇高可用性。為了避免這種妥協(xié),最好的選擇是給集群添加一個節(jié)點。這聽起來很極端,但并不是。對于每一個elasticsearch節(jié)點你可以設置 node.data 參數(shù)來選擇這個節(jié)點是否需要保存數(shù)據。缺省值是“true”,意思是默認每個elasticsearch節(jié)點同時也會作為一個數(shù)據節(jié)點。
在一個兩節(jié)點集群,你可以添加一個新節(jié)點并把 node.data 參數(shù)設置為“false”。這樣這個節(jié)點不會保存任何分片,但它仍然可以被選為主(默認行為)。因為這個節(jié)點是一個無數(shù)據節(jié)點,所以它可以放在一臺便宜服務器上?,F(xiàn)在你就有了一個三節(jié)點的集群,可以安全的把minimum_master_nodes設置為2,避免腦裂而且仍然可以丟失一個節(jié)點并且不會丟失數(shù)據。
腦裂問題很難被徹底解決。在elasticsearch的問題列表里仍然有關于這個的問題, 描述了在一個極端情況下正確設置了minimum_master_nodes的參數(shù)時仍然產生了腦裂問題。elasticsearch項目組正在致力于開發(fā)一個選主算法的更好的實現(xiàn),但如果你已經在運行elasticsearch集群了那么你需要知道這個潛在的問題。
如何盡快發(fā)現(xiàn)這個很重要。一個比較簡單的檢測問題的方式是,做一個對/_nodes下每個節(jié)點終端響應的定期檢查。這個終端返回一個所有集群節(jié)點狀態(tài)的短報告。如果有兩個節(jié)點報告了不同的集群列表,那么這是一個產生腦裂狀況的明顯標志。
關于如何防止elasticsearch的腦裂問題問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業(yè)資訊頻道了解更多相關知識。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。