要想學習分佈式應用,ZooKeeper是一個繞不過去的基礎系統。它爲大型分佈式計算提供開源的分佈式配置服務、同步服務和命名註冊。java
今天先介紹系統的安裝和基本使用,後續會推一些基本的Java使用代碼。node
https://www.apache.org/dyn/closer.cgi/zookeeper/,下載最新的ZooKeeper程序,當前最新版本是3.5.5,要求JDK在1.8以上。git
將下載的apache-zookeeper-3.5.5-bin.tar.gz文件使用命令tar -xzvf 解壓到 /usr/java 目錄,並將原目錄名修改成zookeeper-3.5.5。github
進入zookeeper-3.5.5目錄並建立兩個子目錄 data 和logs。數據庫
# mkdir data logsapache # echo 建立一個惟一的zookeeper實例號,我是用IP最後一個字節編程 # cd datavim # vim myid // 輸入 128 後保存退出bash 128服務器 # echo 複製 zoo_sample.cfg 爲 zoo.cfg # cp zoo_sample.cfg zoo.cfg # 修改參數 dataDir # vim zoo.cfg dataDir=/var/lib/zookeeper
|
而後修改 /etc/profile,增長修改相應的環境變量
# vim /etc/profile export PGDATA=/usr/java/postgres/data ZOOKEEPER_HOME=/usr/java/zookeeper-3.5.5 PATH=$ZOOKEEPER_HOME/bin:$PATH export ZOOKEEPER_HOME PATH # zkServer.sh start //啓動服務 # zkServer.sh status //查看服務狀態 # zkServer.sh stop //中止服務 |
Zookeeper使用的默認端口是2181,能夠在conf/zoo.cfg中修改這個端口號。安裝完成後,須要在防火牆開啓端口
# firewall-cmd --zone=public --add-port=2181/tcp –permanent # firewall-cmd –reload |
建立自動啓動的腳本
# cd /etc/rc.d/init.d # touch zookeeper # chmod +x zookeeper # vim zookeeper #!/bin/bash #chkconfig:2345 10 90 #description:service zookeeper
#set java environment JAVA_HOME=/usr/java/jdk8u222-b10 JRE_HOME=/usr/java/jdk8u222-b10/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export JAVA_HOME JRE_HOME CLASS_PATH PATH
export PGDATA=/usr/java/postgres/data ZOOKEEPER_HOME=/usr/java/zookeeper-3.5.5 PATH=$ZOOKEEPER_HOME/bin:$PATH
export PATH ZOOKEEPER_HOME
su root ${ZOOKEEPER_HOME}/bin/zkServer.sh "$1"
// 添加到啓動腳本 # chkconfig --add zookeeper
// 手工啓動 # service start zookeeper |
命令行鏈接到zookeeper
# zhCli.sh -server 127.0.0.1:2181
嘗試輸入help查看可用的命令,列出了命令,發現其實沒有help命令。
輸入ls,查看根目錄下有哪些節點
嘗試建立一個新的節點,並設置一個字符串,而後使用命令get查看已經建立的節點。
嘗試爲/hello從新賦值
賦值命令執行後,控制檯收到了一條通知事件:/hello值已經被修改。從新查看這個值,發現它的版本(dataVersion)已經從0變爲1。
再執行刪除命令,刪掉這個節點
在Windows上,能夠安裝zkui這個ZooKeeper的客戶端,下載網址:https://github.com/echoma/zkui/wiki/Download 。
下載解壓後,直接運行 zkui.exe,彈出來鏈接頁面。
在Host部分輸入ZooKeeper的地址和端口,點擊Login按鈕後,左邊窗口列出Root下的全部zNode。使用比較簡單,本身摸索幾分鐘就都會了。
在評估、開發、測試環境,使用一臺ZooKeeper就能夠了,但在生產環境應該配置爲多點複製模式。同一個應用多臺服務器複製部署的狀況,術語叫 quorum,全部的服務器使用相同的配置文件。
複製模式部署,最少須要三臺服務器,而且服務器的總數最好是奇數。複製模式部署,配置文件 conf/zoo.cfg同單點模式差很少,有一些不一樣,如:
dataDir=/var/lib/zookeeper clientPort=2181 tickTime=2000 initLimit=5 syncLimit=2 server.128=zoo1:2888:3888 server.129=zoo2:2888:3888 server.130=zoo3:2888:3888 |
在配置文件中,initLimit是集羣中ZooKeeper Server鏈接到leader的超時時間;syncLimit是服務器的超時時間。這兩個參數,使用的時間單位都是tickTime,initLimit值爲5,最終表明的是10秒;syncLimit值爲2,最終表明的是4秒。
列表server.X構成了整個ZooKeeper服務,當服務啓動的時候,會讀取data/myid文件,獲取本身的編號。
在server後面有兩個端口號:"2888"和"3888"。ZooKeeper服務器之間使用這兩個端口進行通訊。若是使用同一臺機器安裝多個ZooKeeper實例搭建集羣,每一個實例應該使用不一樣的端口,如:2888:3888/2889:3889/2890:3890;另外,每一個實例的dataDir和clientPort也應該不一樣。
ZooKeeper使用層級命名空間,相似一個分佈式文件系統。區別在於目錄節點也能夠綁定數據,相似於一個文件系統,一個文件同時也是一個目錄。ZooKeeper不支持相對路徑。Unicode字符均可以出如今名稱中,除了下面的一些特例:
在ZooKeeper樹中,每個節點就是一個znode。Znode包括一個stat結構,含數據修改的版本號,以及acl版本號,時間戳。每次一個znode節點的數據發生變化,版本號都會增長。當客戶端讀取數據時,也會把數據的版本號一併取回去。當客戶端嘗試修改或刪除一個znode時,須要提供嘗試修改節點的版本號。若是提供的版本號同系統中當前的版本號不一致,更新失敗。(相似於數據庫的樂觀鎖實現)
ZNodes是程序訪問的實體,有幾個須要瞭解的特性:
經過多種方式跟蹤時間
節點的Stat結構有以下屬性
ZooKeeper的全部讀操做getData()、getChildren()和exists()都有一個備選參數:設置watch。ZooKeeper Watch的定義:是一次性的觸發器,當數據發生變化時,向設置了watch的客戶端發送消息。有三個關鍵點:
ZooKeeper使用ACL控制節點的讀寫權限。父子節點的讀寫權限是獨立的,不遞歸。
ZooKeeper支持的幾種權限:
ZooKeeper內置的受權對象