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