單機(jī)模式的zk進(jìn)程雖然便于開(kāi)發(fā)與測(cè)試瓦宜,但并不適合在生產(chǎn)環(huán)境使用蔚万。在生產(chǎn)環(huán)境下,我們需要使用集群模式來(lái)對(duì)zk進(jìn)行部署临庇。
注意
在集群模式下反璃,建議至少部署3個(gè)zk進(jìn)程,或者部署奇數(shù)個(gè)zk進(jìn)程假夺。如果只部署2個(gè)zk進(jìn)程淮蜈,當(dāng)其中一個(gè)zk進(jìn)程掛掉后,剩下的一個(gè)進(jìn)程并不能構(gòu)成一個(gè)quorum的大多數(shù)侄泽。
因此,部署2個(gè)進(jìn)程甚至比單機(jī)模式更不可靠蜻韭,因?yàn)?個(gè)進(jìn)程其中一個(gè)不可用的可能性比一個(gè)進(jìn)程不可用的可能性還大悼尾。
zookeeper最主要的應(yīng)用場(chǎng)景是集群柿扣,下面介紹如何在一個(gè)集群上部署一個(gè)zookeeper。只要集群上的大多數(shù)zookeeper服務(wù)啟動(dòng)了闺魏,那么總的zookeeper服務(wù)便是可用的未状。
另外,最好使用奇數(shù)臺(tái)服務(wù)器析桥。如歌zookeeper擁有5臺(tái)服務(wù)器司草,那么在最多2臺(tái)服務(wù)器出現(xiàn)故障后,整個(gè)服務(wù)還可以正常使用泡仗。
所謂的zookeeper容錯(cuò)是指埋虹,當(dāng)宕掉幾個(gè)zookeeper服務(wù)器之后,剩下的個(gè)數(shù)必須大于宕掉的個(gè)數(shù)娩怎,也就是剩下的服務(wù)數(shù)必須大于n/2搔课,zookeeper才可以繼續(xù)使用,無(wú)論奇偶數(shù)都可以選舉leader截亦。5臺(tái)機(jī)器最多宕掉2臺(tái)爬泥,還可以繼續(xù)使用,因?yàn)槭O?臺(tái)大于5/2崩瓤。說(shuō)為什么最好為奇數(shù)個(gè)袍啡,是在以最大容錯(cuò)服務(wù)器個(gè)數(shù)的條件下,會(huì)節(jié)省資源却桶,比如境输,最大容錯(cuò)為2的情況下,對(duì)應(yīng)的zookeeper服務(wù)數(shù)肾扰,奇數(shù)為5畴嘶,而偶數(shù)為6,也就是6個(gè)zookeeper服務(wù)的情況下最多能宕掉2個(gè)服務(wù)集晚,所以從節(jié)約資源的角度看窗悯,沒(méi)必要部署6(偶數(shù))個(gè)zookeeper服務(wù)。
zookeeper有這樣一個(gè)特性:集群中只要有過(guò)半的機(jī)器是正常工作的偷拔,那么整個(gè)集群對(duì)外就是可用的蒋院。也就是說(shuō)如果有2個(gè)zookeeper,那么只要有1個(gè)死了zookeeper就不能用了莲绰,因?yàn)?沒(méi)有過(guò)半欺旧,所以2個(gè)zookeeper的死亡容忍度為0;同理蛤签,要是有3個(gè)zookeeper辞友,一個(gè)死了,還剩下2個(gè)正常的,過(guò)半了称龙,所以3個(gè)zookeeper的容忍度為1留拾;同理你多列舉幾個(gè):2->0;3->1;4->1;5->2;6->2會(huì)發(fā)現(xiàn)一個(gè)規(guī)律,2n和2n-1的容忍度是一樣的鲫尊,都是n-1痴柔,所以為了更加高效,何必增加那一個(gè)不必要的zookeeper呢疫向。