由于某些節(jié)點的失效,部分節(jié)點的網絡連接會斷開,并形成一個與原集群一樣名字的集群,這種情況稱為集群腦裂(split-brain)現象。這個問題非常危險,因為兩個新形成的集群會同時索引和修改集群的數據。
避免腦裂現象,用到的一個參數是:discovery.zen.minimum_master_nodes。這個參數決定了要選舉一個Master需要多少個節(jié)點(最少候選節(jié)點數)。默認值是1。根據一般經驗這個一般設置成 N/2 + 1,N是集群中節(jié)點的數量,例如一個有3個節(jié)點的集群,minimum_master_nodes 應該被設置成 3/2 + 1 = 2(向下取整)。
用到的另外一個參數是:discovery.zen.ping.timeout,等待ping響應的超時時間,默認值是3秒。如果網絡緩慢或擁塞,建議略微調大這個值。這個參數不僅僅適應更高的網絡延遲,也適用于在一個由于超負荷而響應緩慢的節(jié)點的情況。
如果您剛開始使用elasticsearch,建議搭建擁有3個節(jié)點的集群,這種方式可以把discovery.zen.minimum_master_nodes設置成2,這樣就限制了發(fā)生腦裂現象的可能,且保持著高度的可用性:如果你設置了副本,在丟失一個節(jié)點的情況下,集群仍可運行。
其實問題依然存在,ES的issue空間也在討論一個特例情況《#2488》:即使 minimum_master_nodes 設置了一個正確的值,腦裂也有可能發(fā)生。
在您的集群里面盡快識別這個問題非常重要。一個比較容易的方法是定時獲取每一個節(jié)點/_nodes響應,它返回了集群中所有節(jié)點的狀態(tài)報告,如果兩個節(jié)點返回的集群狀態(tài)不一樣,就是一個腦裂情況發(fā)生的警示信號。
對于一個具有全功能的ES節(jié)點,必須要有一個活動的Master節(jié)點。ES1.4.0.Beta1后,新增了一項沒有Master時阻塞集群操作設置:discovery.zen.no_master_block。
當集群中沒有活動的Master節(jié)點后,該設置指定了哪些操作(read、write)需要被拒絕(即阻塞執(zhí)行)。有兩個設置值:all和write,默認為wirte。
這項配置不會對基本api(例如集群狀態(tài)、節(jié)點信息和狀態(tài)API)產生影響,這些節(jié)點在任何節(jié)點上執(zhí)行都不會被阻塞。
腦裂問題依然是一個比較難以解決的問題,最終解決方案也是妥協的結果。這個問題也是分布式系統(tǒng)都會面臨的問題。一下子想到了前幾天看到的CAP理論,難道只有CP或者AP?
總體感覺ES還很年輕,但因為它的開箱即用、天生集群、自動容錯、擴展性強等優(yōu)點,還是選擇它來做全文檢索。
http://xingxiudong.com/2015/01/05/resolve-elasticsearch-split-brain/