ZooKeeper學習之配置【7】ensemble配置

quorum這個概念深深嵌入了ZooKeeper的設計中,尤其是當處理請求和在replicate模式中進行選舉leader時尤爲相關。如果ZooKeeper的各個server的quorum起來(up)時,ensemble才能繼續(make progress)。

[b]Majority Rules[/b]
當一個ensemble有足夠的Zookeeper server時,便能夠開始處理請求,可以把這些server集合稱爲一個quorum。當然,永遠不會想要兩個不相交(disjoint)的server集合來處理請求,否則會發生腦裂(split brain)的情況。可通過要求所有的quorum至少擁有一個majority of servers來避免腦裂問題(注意:只有一半的server不能組成一個majority,必須擁有總數量一半以上的server才能獲得一個majority)。
當我們使用多臺server來建立ensemble時,默認使用了majority quorum。ZooKeeper自動進行檢測到配置文件中存在多個server,那麼決定應該運行replicate模式。

[b]配置Quorums[/b]
如果一個quorum是dissolve的,並在這個ensemble又有另一個quorum,那麼這兩個quorum必須至少有一個server是相交的(intersect)。Majority quorum明顯是滿足這個相交(intersection)條件的。通常,quorum不一定是majority的,ZooKeeper允許更靈活的配置quorum。一種實踐模式就是把server分成不相交的集合,並給這些server分配權重(weight)。爲了在這種模式中組成一個quorum,我們需要獲得各個group的大多數投票(a majority of votes),例如,比如我們有3個組,每個組有3臺server,每個server的權重是1。爲了組成一個quorum,我們需要4臺server:從一個組選2臺server,再從另一個組選2臺,通常歸結爲如下數學公式。如果有G個組,我們需要一個server的子集G',滿足|Gʹ | > |G|/2。另外,G'的每一個成員g,需要g的一個子集g',g'組成的server的權重和至少爲g的權重和的一半,例如Wʹ > W/2。

下面的配置創建了一個組:
group.x=n[:n]


創建了一個層次化的quorum結構。x是一個組的id,右邊的部分是對應的server id,以冒號分隔。注意各個組必須是不相交的,且組成ensemble的各個server必須出現在某一個組,只能出現1次。

下面是一個例子,9臺server組成了3個不同的組:
group.1=1:2:3
group.2=4:5:6
group.3=7:8:9


在這個例子中,所有的server都有相同的權重,爲了組成一個majority quorum,至少需要5臺server來組成一個quorum。

當進行跨數據中心部署這樣的配置有很多好處。例如,一個分組代表一個數據中心的所有節點,如果一個數據中心掛了,ZooKeeper不受影響。

一種部署方式可以避免在1個數據中心掛掉後,不影響整體服務,在兩個數據中心分別部署3臺server,另一個數據中心部署一臺server。如果任何一個data center不可用,另外2個可以組成一個quorum。只要有任意4臺server就可以組成quorum。但是存在2個缺點:

第一個缺點是server的數量在各個數據中心間不是均衡的。第二個是一旦一個數據中心不可用,之後如果再有其他數據中心的server掛掉就會影響整體可用性。如果只有2個數據中心可用,我們可以使用權重來表達優先級。如果我們給其中一個server賦予更高的權重,那麼在一個數據中心掛掉的情況下可以保證整體服務可用。例如有2個數據中心,每個有3臺server,分在一個組裏:
group.1=1:2:3:4:5:6


因爲所有的server默認有相同的權重,則quorum只要有4臺機器服務就可以起來。這意味着如果一個數據中心掛掉,就無法組成quorum了。

使用如下配置來給server設置權限:
weight.x=n


這是跟分組設置配套使用的,當組成quorum時,分配權重n,這是用來投票的。ZooKeeper的一些行爲需要進行投票,比如選舉leader和atomic broadcast協議。默認權重爲1。如果設置了分組但沒有設置權重,那麼所有的server的權重都爲1。

我們有一個數據中心,稱爲D1,想要在即使另一個數據中心掛掉時也能正常工作。我們給D1的server更大的權重,這樣可更容易的跟其他server組成quorum。

假設server 1,2,3在D1,下面給server 1更大的權重:
weight.1=2


這樣,我們一共有7票,只需要4票就可以組成一個quorum了。所以如果D1還存活着,即使其他數據掛掉也沒關係。

以上只是一部分例子,你可以更靈活的使用各種不同的權重和分組規劃來構建自己拓撲。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章