Zookeeper簡介html
什麼是zookeeper?java
zookeeper是一個是分佈式的註冊中心。是一個分佈式的,開放源碼的分佈式應用程序協調服務, 它是由Google的Chubby一個開源的實現,現已開源,http://zookeeper.apache.org/中能夠查看到基本信息。它是集羣的管理者,監視着集羣中各個節點的狀態根據節點提交的反饋進行下一步合理操做。最終,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。它實現諸如數據發佈/訂閱、負載均衡、命名服務、分佈式協 調/通知、集羣管理、Master 選舉、配置維護,名字服務、分佈式同步、分佈式鎖和分佈式隊列 等功能。git
注意:github
本文章使用的是Centos7的系統,使用的Zookeeper版本爲 zookeeper-3.4.13.tar.gz。搭建項目以前必須需關閉防火牆,或者指定暴露端口。算法
systemctl stop firewalld
systemctl disable firewalld
單機實戰apache
1.1下載服務器
首先,咱們須要下載使用的包,session
進入要下載的版本的目錄,選擇.tar.gz文件下載數據結構
下載連接:http://archive.apache.org/dist/zookeeper/負載均衡
下載最新版本,若是
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
若是出現下列狀況,則須要安裝 wget , 若是直接將文件下載,則不須要安裝 wget.或者使用FTP文件直接將已下載的包上傳至當前服務器。
$ yum -y install wget
$ wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
當前文件已下載至當前目錄當中。
1.2安裝
先解壓文件,而後再將文件移至目錄當中。/usr/lib/
$ tar -zxvf zookeeper-3.4.13.tar.gz -C /usr/lib/ $ cd /usr/lib/zookeeper-3.4.13/
顯示下列內容則已安裝成功
1.3配置
進入配置文件目錄,複製配置文件zoo_sample.cfg 並將其更名爲zoo.cfg 給建立權限
$ cd /usr/lib/zookeeper-3.4.13/conf $ cp zoo_sample.cfg zoo.cfg
$ chmod u+x zoo.cfg
$ cat zoo.cfg
參數名 |
說明 |
clientPort |
客戶端鏈接server的端口,即對外服務端口,通常設置爲2181吧。 |
dataDir |
存儲快照文件snapshot的目錄。默認狀況下,事務日誌也會存儲在這裏。建議同時配置參數dataLogDir, 事務日誌的寫性能直接影響zk性能。 |
tickTime |
ZK中的一個時間單元。ZK中全部時間都是以這個時間單元爲基礎,進行整數倍配置的。例如,session的最小超時時間是2*tickTime。 |
dataLogDir |
事務日誌輸出目錄。儘可能給事務日誌的輸出配置單獨的磁盤或是掛載點,這將極大的提高ZK性能。 |
globalOutstandingLimit |
最大請求堆積數。默認是1000。ZK運行的時候, 儘管server已經沒有空閒來處理更多的客戶端請求了,可是仍是容許客戶端將請求提交到服務器上來,以提升吞吐性能。固然,爲了防止Server內存溢出,這個請求堆積數仍是須要限制下的。 |
preAllocSize |
預先開闢磁盤空間,用於後續寫入事務日誌。默認是64M,每一個事務日誌大小就是64M。若是ZK的快照頻率較大的話,建議適當減少這個參數。(Java system property:zookeeper.preAllocSize ) |
snapCount |
每進行snapCount次事務日誌輸出後,觸發一次快照(snapshot), 此時,ZK會生成一個snapshot.*文件,同時建立一個新的事務日誌文件log.*。默認是100000.(真正的代碼實現中,會進行必定的隨機數處理,以免全部服務器在同一時間進行快照而影響性能)(Java system property:zookeeper.snapCount ) |
traceFile |
用於記錄全部請求的log,通常調試過程當中可使用,可是生產環境不建議使用,會嚴重影響性能。(Java system property:? requestTraceFile ) |
maxClientCnxns |
單個客戶端與單臺服務器之間的鏈接數的限制,是ip級別的,默認是60,若是設置爲0,那麼代表不做任何限制。請注意這個限制的使用範圍,僅僅是單臺客戶端機器與單臺ZK服務器之間的鏈接數限制,不是針對指定客戶端IP,也不是ZK集羣的鏈接數限制,也不是單臺ZK對全部客戶端的鏈接數限制。指定客戶端IP的限制策略,這裏有一個patch,能夠嘗試一下:http://rdc.taobao.com/team/jm/archives/1334(No Java system property) |
clientPortAddress |
對於多網卡的機器,能夠爲每一個IP指定不一樣的監聽端口。默認狀況是全部IP都監聽 clientPort 指定的端口。 New in 3.3.0 |
minSessionTimeoutmaxSessionTimeout |
Session超時時間限制,若是客戶端設置的超時時間不在這個範圍,那麼會被強制設置爲最大或最小時間。默認的Session超時時間是在2 * tickTime ~ 20 * tickTime 這個範圍 New in 3.3.0 |
fsync.warningthresholdms |
事務日誌輸出時,若是調用fsync方法超過指定的超時時間,那麼會在日誌中輸出警告信息。默認是1000ms。(Java system property: fsync.warningthresholdms )New in 3.3.4 |
autopurge.purgeInterval |
在上文中已經提到,3.4.0及以後版本,ZK提供了自動清理事務日誌和快照文件的功能,這個參數指定了清理頻率,單位是小時,須要配置一個1或更大的整數,默認是0,表示不開啓自動清理功能。(No Java system property) New in 3.4.0 |
autopurge.snapRetainCount |
這個參數和上面的參數搭配使用,這個參數指定了須要保留的文件數目。默認是保留3個。(No Java system property) New in 3.4.0 |
electionAlg |
在以前的版本中, 這個參數配置是容許咱們選擇leader選舉算法,可是因爲在之後的版本中,只會留下一種「TCP-based version of fast leader election」算法,因此這個參數目前看來沒有用了,這裏也不詳細展開說了。(No Java system property) |
initLimit |
Follower在啓動過程當中,會從Leader同步全部最新數據,而後肯定本身可以對外服務的起始狀態。Leader容許F在 initLimit 時間內完成這個工做。一般狀況下,咱們不用太在乎這個參數的設置。若是ZK集羣的數據量確實很大了,F在啓動的時候,從Leader上同步數據的時間也會相應變長,所以在這種狀況下,有必要適當調大這個參數了。(No Java system property) |
syncLimit |
在運行過程當中,Leader負責與ZK集羣中全部機器進行通訊,例如經過一些心跳檢測機制,來檢測機器的存活狀態。若是L發出心跳包在syncLimit以後,尚未從F那裏收到響應,那麼就認爲這個F已經不在線了。注意:不要把這個參數設置得過大,不然可能會掩蓋一些問題。(No Java system property) |
leaderServes |
默認狀況下,Leader是會接受客戶端鏈接,並提供正常的讀寫服務。可是,若是你想讓Leader專一於集羣中機器的協調,那麼能夠將這個參數設置爲no,這樣一來,會大大提升寫操做的性能。(Java system property: zookeeper. leaderServes )。 |
server.x=[hostname]:nnnnn[:nnnnn] |
這裏的x是一個數字,與myid文件中的id是一致的。右邊能夠配置兩個端口,第一個端口用於F和L之間的數據同步和其它通訊,第二個端口用於Leader選舉過程當中投票通訊。 |
group.x=nnnnn[:nnnnn]weight.x=nnnnn |
對機器分組和權重設置,能夠 參見這裏(No Java system property) |
cnxTimeout |
Leader選舉過程當中,打開一次鏈接的超時時間,默認是5s。(Java system property: zookeeper. cnxTimeout ) |
zookeeper.DigestAuthenticationProvider |
ZK權限設置相關,具體參見 《 使用super 身份對有權限的節點進行操做 》 和 《 ZooKeeper 權限控制 》 |
skipACL |
對全部客戶端請求都不做ACL檢查。若是以前節點上設置有權限限制,一旦服務器上打開這個開頭,那麼也將失效。(Java system property: zookeeper.skipACL ) |
forceSync |
這個參數肯定了是否須要在事務日誌提交的時候調用 FileChannel .force來保證數據徹底同步到磁盤。(Java system property: zookeeper.forceSync ) |
jute.maxbuffer |
每一個節點最大數據量,是默認是1M。這個限制必須在server和client端都進行設置纔會生效。(Java system property: jute.maxbuffer ) |
配置文件以後,咱們能夠進行啓動。
進入bin目錄,啓動、中止、重啓分和查看當前節點狀態(包括集羣中是何角色)別執行:
$ cd /usr/lib/zookeeper-3.4.13/bin
$ ./zkServer.sh start $ ./zkServer.sh stop $ ./zkServer.sh restart
$ ./zkServer.sh status
啓動以後,當咱們經過進程和狀態查看內容,發現zookeeper學是未啓動。
此錯誤告訴咱們,當前java命令不存在,就此zookeeper的安裝依賴Java,咱們須要安裝JDK。
咱們能夠經過 命令進行jdk的安裝
yum -y install java
java -version
安裝完以後再經過版本查看命令
顯示1.8JDK已安裝成功。咱們再來進行zk的啓動。
顯示當前內容,則zookeeper真正啓動成功。
集羣的安裝
安裝前準備
當前文章使用的三臺機器進行集羣安裝 192.168.87.147,192.168.87.148,192.168.87.149,記得每臺服務都必須關閉防火牆。
systemctl stop firewalld systemctl disable firewalld
首先對192.168.87.147機器進行安裝。下載,解壓文件。
$ tar -zxvf zookeeper-3.4.13.tar.gz -C /usr/lib/ $ cd /usr/lib/zookeeper-3.4.13/ $ cd /usr/lib/zookeeper-3.4.13/conf $ cp zoo_sample.cfg zoo.cfg $ chmod u+x zoo.cfg $ cat zoo.cfg
與單機版本不一樣的是,此處配置文件須要指定當前集羣的機器配置,配置以下
server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader服務器交換信息的端口(上面的端口Y);D
表示的是萬一集羣中的 Leader 服務器掛了,須要一個端口來從新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通訊的端口(上面的端口Z)。
若是是僞集羣的配置方式,因爲 B 都是同樣,因此不一樣的 Zookeeper 實例通訊端口號不能同樣,因此要給它們分配不一樣的端口號。 * 在上面配置的dataDir目錄下建立myid文件,填寫這個節點上的id號,就是server.A=B:C:D配置的A那個號碼
建立和修改完配置文件後,須要指定每個服務器的id,咱們配置中指定了datadir的目錄是/usr/lib/zookeeper3.4.13/data因此咱們須要在此目錄下建立myid文件,指定id
echo "0">/usr/lib/zookeeper3.4.13/data/myid
建立完成以後,咱們須要在另外兩臺機器上面一樣安裝zookeeper. 若是192.168.87.148的myid則1 ,若是192.168.87.149myid爲2
scp -r root@192.168.87.147:/usr/lib/zookeeper3.4.13 /usr/lib/ echo "1">/usr/lib/zookeeper3.4.13/data/myid
注意三臺服務對應的myid須要對應,否則沒法進行集羣。
最後每臺服務器啓動服務
$ cd /usr/lib/zookeeper-3.4.13/bin $ ./zkServer.sh start
若是每臺服務器,顯示下列結果,則啓動成功。(記得zookeeper是依賴於JDK)
此時集羣已搭建。
下列是關於zookeeper的集羣,下列代碼能夠進行當測試。
能夠查找經過 https://github.com/wsb878/zookeeperJava 去查看當前查代碼的測試方法。