簡單理解
Zookeeper的集群有一個法則赌朋,整個集群的數(shù)量要過半存活凰狞,集群就是穩(wěn)定的。在這法則之外沛慢,官方文檔中還提供了Group和Weight的配置赡若。Zookeeper的Group配置的意思就是對整個大的zk集群進行分組.
例如,我們有1团甲、2逾冬、3、4躺苦、5身腻、6、7七個節(jié)點匹厘。我們做如下配置:
group.1=1:2:3
group.2=4:5:6
group.2=7
將七臺機器分為三個組嘀趟,這時,只要三個組中的兩個是穩(wěn)定的愈诚,整個集群的狀態(tài)就是穩(wěn)定的她按。即有2n+1個組,只要有n+1個組是穩(wěn)定狀態(tài)炕柔,整個集群就是穩(wěn)定的酌泰。也就是過半原則。
Zookeeper的Weight配置要和Group配置一起使用汗唱。官方文檔中介紹Weight時提到此值影響集群節(jié)點Leader的選取宫莱,經(jīng)過實際測試和翻閱zk的投票源碼,Weight等于0的節(jié)點不參與投票哩罪,沒有被選舉權(quán)授霸。而不影響投票的權(quán)重. 源碼片段如下:
protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch,long curId, long curZxid, long curEpoch){
if (self.getQuorumVerifier().getWeight(newId) == 0){
return false;
}
return ((newEpoch > curEpoch) ||
(newEpoch == curEpoch && newZxid > curZxid) ||
(newZxid == curZxid && newId > curId));
}
Weight可以調(diào)節(jié)一個組內(nèi)單個節(jié)點的權(quán)重巡验,默認每個節(jié)點的權(quán)重是1(如果配置是0不參與leader的選舉).每個組有一個法定數(shù)的概念,法定人數(shù)等于組內(nèi)所有節(jié)點的權(quán)重之和.此時判斷一個組是否穩(wěn)定碘耳,是要判斷存活的節(jié)點權(quán)重之和是否大于該組法定數(shù)的權(quán)重.
接上面的例子显设,我們做如下配置:
weight.1=3
weight.2=1
weight.3=1
weight.4=1
weight.5=1
weight.6=1
weight.7=1
此時Group1的法定數(shù)是:3+1+1=5,只要節(jié)點權(quán)重之和過半該組就是穩(wěn)定的辛辨。也就是說捕捂,該組中,節(jié)點1(權(quán)重是3)只要存活,該組就是穩(wěn)定的. 經(jīng)過以上配置,停掉節(jié)點2斗搞,3指攒,4,5僻焚,6整個集群仍然是穩(wěn)定的. 此時Group1和Group3是穩(wěn)定狀態(tài).