zookeeper簡單可以概括為:一致、有頭、數據數。
一致:就是每個節點的數據都是一致的。
有頭:節點一般為單數,因為要選舉一個leader,其他都是follower,當leader的服務器掛了之后zookeeper會自己選舉算法重新選定leader。默認的算法是FastLeaderElection,默認是采用投票數大於半數則勝出的邏輯。
數據數:每一個節點綁定一份數據,可以是樹狀。所以稱為數據樹;
zookeeper集群有個重要的特性,即只要集群中超過一半的機器可用,則集群整體對外是可用的。一半來說,集群中配置的機器數量一半為基數個數,當只有兩個zookeeper機器時,掛掉一個zookeeper則不滿足超過一半機器可用,如果此時有三台機器掛一台的情況下集群還是可用的。
安裝配置:
一般我們會把中間都安裝在/usr/local下,這個相當於window環境的Program Files目錄。解壓后,在zookeeper文件下有一個conf文件夾。里面默認有三個文件:
configuration.xsl
log4j.properties
zoo_sample.cfg
把zoo_sample.cfg 文件復制一份命名為 zoo.cfg。里面的配置都暫時不用改,在文件最下面加上所有機器的IP和端口:
server.1=192.168.0.110:2888:3888
server.2=192.168.0.111:2888:3888
server.3=192.168.0.112:2888:3888
在zoo.cfg的配置中有一個默認的路徑:tmp/zookeeper 。zookeeper的數據都是在內存中的,但是在本地文件也會存一份,放置在該路徑下,這是臨時的路徑,zookeeper會定時清理,所以上生產此文件夾必須修改成其他文件夾。
在每台機器的該路徑下創建一個myid 的文件。在里面寫自己的別名。如上面配置的三台機器。第一台機器(192.168.0.110)的myid里面就寫1,第二台(192.168.0.111)的myid寫2,第三台(192.168.0.112)的myid寫3
以上以完成配置,接下來就可以啟動了:
cd bin
./zkServer.sh start 啟動
./zkServer.sh stop 停止
./zkServer.sh status 顯示狀態
zookeeper應用場景:
配置一致:在zookeeper上做一個監聽器,監聽所有的集群機器,修改配置后所有被監聽的機器都收到了。
HA:(High Available), 高可用性集群,相當於主備動態切換。
pub/sub:
naming service:
load balance:
分布式鎖:
FastLeaderElection選舉算法
FastLeaderElection是標准的fast paxos的實現,它首先向所有Server提議自己要成為leader,當其它Server收到提議以后,解決 epoch 和 zxid 的沖突,並接受對方的提議,然后向對方發送接受提議完成的消息。
FastLeaderElection算法通過異步的通信方式來收集其它節點的選票,同時在分析選票時又根據投票者的當前狀態來作不同的處理,以加快Leader的選舉進程。
每個Server都一個接收線程池和一個發送線程池, 在沒有發起選舉時,這兩個線程池處於阻塞狀態,直到有消息到來時才解除阻塞並處理消息,同時每個Serve r都有一個選舉線程(可以發起選舉的線程擔任)。
1). 主動發起選舉端(選舉線程)的處理
首先自己的 logicalclock加1,然后生成notification消息,並將消息放入發送隊列中, 系統中配置有幾個Server就生成幾條消息,保證每個Server都能收到此消息,如果當前Server 的狀態是LOOKING就一直循環檢查接收隊列是否有消息,如果有消息,根據消息中對方的狀態進行相應的處理。
2).主動發送消息端(發送線程池)的處理
將要發送的消息由Notification消息轉換成ToSend消息,然后發送對方,並等待對方的回復。
3). 被動接收消息端(接收線程池)的處理
將收到的消息轉換成Notification消息放入接收隊列中,如果對方Server的epoch小於logicalclock則向其發送一個消息(讓其更新epoch);如果對方Server處於Looking狀態,自己則處於Following或Leading狀態,則也發送一個消息(當前Leader已產生,讓其盡快收斂)。