單機模式的zk進程雖然便于開發與測試,但并不適合在生產環境使用。在生產環境下,我們需要使用集群模式來對zk進行部署。
注意
在集群模式下,建議至少部署3個zk進程,或者部署奇數個zk進程。如果只部署2個zk進程,當其中一個zk進程掛掉后,剩下的一個進程并不能構成一個quorum的大多數。
因此,部署2個進程甚至比單機模式更不可靠,因為2個進程其中一個不可用的可能性比一個進程不可用的可能性還大。
zookeeper最主要的應用場景是集群,下面介紹如何在一個集群上部署一個zookeeper。只要集群上的大多數zookeeper服務啟動了,那么總的zookeeper服務便是可用的。
另外,最好使用奇數臺服務器。如歌zookeeper擁有5臺服務器,那么在最多2臺服務器出現故障后,整個服務還可以正常使用。
所謂的zookeeper容錯是指,當宕掉幾個zookeeper服務器之后,剩下的個數必須大于宕掉的個數,也就是剩下的服務數必須大于n/2,zookeeper才可以繼續使用,無論奇偶數都可以選舉leader。5臺機器最多宕掉2臺,還可以繼續使用,因為剩下3臺大于5/2。說為什么最好為奇數個,是在以最大容錯服務器個數的條件下,會節省資源,比如,最大容錯為2的情況下,對應的zookeeper服務數,奇數為5,而偶數為6,也就是6個zookeeper服務的情況下最多能宕掉2個服務,所以從節約資源的角度看,沒必要部署6(偶數)個zookeeper服務。
zookeeper有這樣一個特性:集群中只要有過半的機器是正常工作的,那么整個集群對外就是可用的。也就是說如果有2個zookeeper,那么只要有1個死了zookeeper就不能用了,因為1沒有過半,所以2個zookeeper的死亡容忍度為0;同理,要是有3個zookeeper,一個死了,還剩下2個正常的,過半了,所以3個zookeeper的容忍度為1;同理你多列舉幾個:2->0;3->1;4->1;5->2;6->2會發現一個規律,2n和2n-1的容忍度是一樣的,都是n-1,所以為了更加高效,何必增加那一個不必要的zookeeper呢。