日期 | 做者 | 版本 | 備註 |
---|---|---|---|
2020-04-15 | dingbin | v1.0 | |
Zookeeper,簡稱zk, 做爲解決分佈式一致性問題的成熟開源技術棧已經被普遍使用。本文用簡短精煉的篇幅迅速論述一下zookeeper集羣的安裝部署和使用方法。html
注意:java
安裝zookeeper以前須要在每臺機器上安裝好jdk,建議安裝至少jdk1.8及以上版本。本文安裝的是jdk1.8。本文使用的zookeeper版本是當前最新的zookeeper 3.6.1版本。相關程序安裝包和開源java工程源代碼連接是: zookeeper3.6.1package.rar 提取碼: fmw2
其中zookeeper JAVA API用法demo源碼在esproj.zip文件中java工程的zk目錄下。以下2圖所示:
![]()
![]()
ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。node
ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。web
ZooKeeper包含一個簡單的原語集,提供Java和C的接口。算法
ZooKeeper代碼版本中,提供了分佈式獨享鎖、選舉、隊列的接口,其中分佈鎖和隊列有Java和C兩個版本,選舉只有Java版本。apache
ZooKeeper是以Fast Paxos算法爲基礎的,Paxos 算法存在活鎖的問題,即當有多個proposer交錯提交時,有可能互相排斥致使沒有一個proposer能提交成功,而Fast Paxos做了一些優化,經過選舉產生一個leader (領導者),只有leader才能提交proposer,具體算法可見Fast Paxos。所以,要想弄懂ZooKeeper首先得對Fast Paxos有所瞭解。vim
ZooKeeper的基本運轉流程:windows
一、選舉Leader。 二、同步數據。 三、選舉Leader過程當中算法有不少,但要達到的選舉標準是一致的。 四、Leader要具備最高的執行ID,相似root權限。 五、集羣中大多數的機器獲得響應並follow選出的Leader。
在Zookeeper中,znode是一個跟Unix文件系統路徑類似的節點,能夠往這個節點存儲或獲取數據。若是在建立znode時Flag設置爲EPHEMERAL,那麼當建立這個znode的節點和Zookeeper失去鏈接後,這個znode將再也不存在在Zookeeper裏,Zookeeper使用Watcher察覺事件信息。當客戶端接收到事件信息,好比鏈接超時、節點數據改變、子節點改變,能夠調用相應的行爲來處理數據。Zookeeper的Wiki頁面展現瞭如何使用Zookeeper來處理事件通知,隊列,優先隊列,鎖,共享鎖,可撤銷的共享鎖,兩階段提交。api
那麼Zookeeper能作什麼事情呢,簡單的例子:假設咱們有20個搜索引擎的服務器(每一個負責總索引中的一部分的搜索任務)和一個總服務器(負責向這20個搜索引擎的服務器發出搜索請求併合並結果集),一個備用的總服務器(負責當總服務器宕機時替換總服務器),一個web的cgi(向總服務器發出搜索請求)。搜索引擎的服務器中的15個服務器提供搜索服務,5個服務器正在生成索引。這20個搜索引擎的服務器常常要讓正在提供搜索服務的服務器中止提供服務開始生成索引,或生成索引的服務器已經把索引生成完成能夠提供搜索服務了。使用Zookeeper能夠保證總服務器自動感知有多少提供搜索引擎的服務器並向這些服務器發出搜索請求,當總服務器宕機時自動啓用備用的總服務器。服務器
從zookeeper官網https://zookeeper.apache.org/releases.html 下載當前最新版本的zookeeper3.6.1。
分佈式zookeeper(簡稱zk)集羣至少要求運行在3臺或以上服務器上。本文講述是基於安裝在3臺vmware虛擬機上,各虛擬機機器結點以下表:
本節使用的全部vmware虛擬機配置均爲CPU:8核,內存6G,硬盤足夠。
根據咱們一向部署分佈式服務的作法:
1) 先建立zk用戶和zk組;
groupadd zk vim /etc/group 會發現最後一行有zk用戶組 adduser -g zk zk 建立zk用戶,同時加入zk用戶組,自動建立zk的homedir爲/home/zk vim /etc/passwd 能夠看到最後一行是zk用戶。 passwd zk 爲zk用戶新設立密碼 將zk用戶加入sudo權限 注意:本步驟非必須,可選。 chmod +w /etc/sudoers vim /etc/sudoers 添加以下行:
而後再chmod -w /etc/sudoers
2) 建立zk服務的basedir:/opt/zk
chown -R zk:zk /opt/zk
3) 在/opt/zk下分別建立app data logs temp分別做爲zk的app/data/logs/temp 目錄。
4) 配置zk
解壓zk壓縮包文件:apache-zookeeper-3.6.1-bin.tar.gz 到/opt/zk/app目錄下:
在cent7a機器上執行:
cd /opt/zk/app/apache-zookeeper-3.6.1-bin/conf mv zoo_sample.cfg zoo.cfg vim zoo.cfg 修改以下:
其中clientPort 2181是客戶端鏈接zk集羣的端口,dataDir和dataLogDir分別是數據目錄和日誌目錄。文件最後的3行是用於zk集羣互聯。
server.A = B:C:D A:zookeeper服務器的序號,即第幾號服務器. 注意這個序號要與zookeeper的myid保持一致 B:服務器的 IP 地址 C:服務器跟隨者follower與集羣中的 Leader 服務器交換信息的端口 D:若是集羣中的 Leader 服務器宕機,須要一個端口通訊從新進行選舉,選出一個新的 Leader。這個端口就是用來作leader選舉的端口
注意server.1/server.2/server.3 中的1/2/3是zk 結點的序號,不一樣結點必須不能相同。
直接將此zoo.cfg一行不用修改原樣拷貝到cent7b和cent7c機器上相同目錄下。
接下來在cent7a的datadir即:/opt/zk/data下新建立myid文件,並寫入1:
一樣地在cent7b的datadir即:/opt/zk/data下新建立myid文件,並寫入2:
在cent7c的datadir即:/opt/zk/data下新建立myid文件,並寫入3:
至此,zk集羣配置結束。啓動zk集羣以前不要忘記開放3臺機器上2181/2888/3888 三個端口:
systemctl start firewalld firewall-cmd --zone=public --add-port=2181/tcp --permanent firewall-cmd --zone=public --add-port=2888/tcp --permanent firewall-cmd --zone=public --add-port=3888/tcp --permanent firewall-cmd --reload
Zk集羣主要操做命令以下:
在全部機器上執行:/opt/zk/app/apache-zookeeper-3.6.1-bin/bin/zkServer.sh start/stop/status/restart ##啓動/中止/查詢狀態/重啓 zk服務
可見zk集羣成功,1個leader和2個follower。
在全部機器上執行:/opt/zk/app/apache-zookeeper-3.6.1-bin/bin/zkCli.sh ##鏈接本地服務器,默認是2181端口
/opt/zk/app/apache-zookeeper-3.6.1-bin/bin/zkCli.sh -server ip:port ##鏈接指定zk服務器和端口
ZooKeeper是經過客戶端腳原本操做的。客戶端腳本:zkCli.sh,存放在ZooKeeper的bin目錄下。
默認鏈接本地的ZooKeeper服務器:#zkCli.sh
鏈接指定的ZooKeeper服務器:#zkCli.sh –server Server IP:port
在cent7a上運行:/opt/zk/app/apache-zookeeper-3.6.1-bin/bin/zkCli.sh -server 192.168.0.112:2181
,顯示以下:
執行:/opt/zk/app/apache-zookeeper-3.6.1-bin/bin/zkCli.sh -server 192.168.0.112:2181
此時進入zookeeper系統的交互模式。
此時鍵入h或help命令,能夠看到交互模式下支持的命令選項,以下圖:
命令行工具的一些簡單操做以下:
1) 顯示根目錄下、文件: ls / 使用 ls 命令來查看當前 ZooKeeper 中所包含的內容 2) 顯示根目錄下、文件: ls2 / 查看當前節點數據並能看到更新次數等數據 3) 建立文件,並設置初始內容: create /zk "test" 建立一個新的 znode節點「 zk 」以及與它關聯的字符串 4) 獲取文件內容: get /zk 確認 znode 是否包含咱們所建立的字符串 5) 修改文件內容: set /zk "zkbak" 對 zk 所關聯的字符串進行設置 6) 刪除文件: delete /zk 將剛纔建立的 znode 刪除 7) 退出客戶端: quit 8) 幫助命令: help
Zookeeper提供了豐富的java api 。後續可直接在附件的java工程中詳見。這裏重點須要說起的是:zookeeper的JAVA API接口強烈推薦使用它的高級封裝接口CuratorFramework,而切不要使用它的原生接口,由於原生接口很原始,不少功能須要本身從新實現,很很差用。而高級封裝接口CuratorFramework做了不少大量優秀的高級抽象封裝,使用很是方便。
JAVA api demo源代碼見附件esproj.zip文件中java工程zk目錄。
Zookeeper 有不少可視化工具,其中一個輕便易用的工具是ZooInspector. 程序包是:ZooInspector.zip (該文件附於項目交付清單中) 。解壓後 直接在windows上雙擊 ZooInspector/build/ zookeeper-dev-ZooInspector.jar 便可打開圖形界面以下:
鍵入上面搭建好的zookeeper集羣192.168.0.112:2181 便可進入可視化界面: