什麼是 zookeeper?
Zookeeper 是google的chubby一個開源實作,是hadoop的分布式協調服務
它包含一個簡單的原語集,分布式應用程式可以基于它實作同步服務,配置維護和命名服務等。
在Hbase中會用到。
Zk(zookeeper簡稱)可以用來保證資料在zk叢集之間的資料的事物性一緻。
Zk預設資料2M以下。
zookeeper架構圖
如何搭建Zookeeper伺服器叢集
zk伺服器叢集規模不小于3節點,要求伺服器之間系統時間要保持一緻。
将下載下傳的zookeeper複制到/usr/local 裡,解壓:
tar –zxvf zookeeper-3.4.5.tar.gz
重命名:
mv zookeeper-3.4.5.tar.gz zk
在hadoop的/usr/local目錄下,解壓縮zk….tar.gz,設定環境變量
設定環境變量:
加入:
export ZOOKEEPER_HOME=/usr/local/zk
在PATH 後面追加:
:$ZOOKEEPER_HOME/bin
使環境變量生效:
source /etc/profile
在conf目錄下,修改檔案
mv zoo_sample.cfg zoo.cfg [root@hadoop zk]# cd conf [root@hadoop conf]# ls configuration.xsl log4j.properties zoo_sample.cfg [root@hadoop conf]# mv zoo_sample.cfg zoo.cfg [root@hadoop conf]# ls configuration.xsl log4j.properties zoo.cfg
編輯該檔案:
vi zoo.cfg
修改dataDir=/usr/local/zk/data
新增
server.0=hadoop:2888:3888 server.1=hadoop1:2888:3888 server.2=hadoop2:2888:3888
這裡講下zookeeper的角色:
上司者(leader):負責投票的發起和決議,更新系統狀态
學習者(learner):包括追随者(follower)和觀察者(observer),follower用于接受用戶端請求并向用戶端傳回結果,在選主過程中參與投票。
observer 可以接受用戶端連接配接,将寫請求轉發給leader,但observer不參加投票過程,隻同步leader的狀态,observer的目的是為了擴充系統,提高讀取速度。
用戶端(client),請求發起方。
建立檔案夾 :
進入zk檔案夾下,建立data檔案夾。
[root@hadoop zk]# mkdir data
在data目錄下,建立檔案myid,值為0
[root@hadoop zk]# cd data [root@hadoop data]# ls [root@hadoop data]# vi myid
把zk目錄複制到hadoop1和hadoop2中
scp -r zk hadoop1:/usr/local scp -r zk hadoop2:/usr/local
環境變量也要複制過去
[root@hadoop local]# scp /etc/profile hadoop1:/etc/ profile 100% 2037 2.0KB/s 00:00 [root@hadoop local]# scp /etc/profile hadoop2:/etc/ profile 100% 2037 2.0KB/s 00:00
記得在hadoop1和hadoop2節點上:
source /etc/profile
使環境變量生效
把hadoop1中相應的myid的值改為1,把hadoop2中相應的myid的值改為2
[root@hadoop local]# ssh hadoop1 Last login: Mon May 11 08:22:01 2015 fromhadoop [root@hadoop1 ~]# vi /usr/local/zk/data [root@hadoop1 ~]# vi /usr/local/zk/data/myid [root@hadoop1~]# exit logout Connection to hadoop1 closed. [root@hadoop local]# ssh hadoop2 Last login: Mon May 11 08:21:48 2015 fromhadoop [root@hadoop2 ~]# vi /usr/local/zk/data/myid [root@hadoop2 ~]# exit logout Connection to hadoop2 closed.
啟動,在三個節點上分别執行指令zkServer.sh start
[root@hadoop zk]# cd bin [root@hadoop bin]# ls README.txt zkCli.cmd zkEnv.cmd zkServer.cmd zkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh [root@hadoop bin]# zkServer.sh start JMX enabled by default Using config:/usr/local/zk/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
其他兩個節點類似上面操作
[root@hadoop bin]# ssh hadoop1 Last login: Mon May 11 08:24:36 2015 fromhadoop [root@hadoop1~]# cd /usr/local [root@hadoop1 local]# cd zk [root@hadoop1 zk]# cd bin [root@hadoop1 bin]# ls README.txt zkCli.cmd zkEnv.cmd zkServer.cmd zkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh [root@hadoop1 bin]# zkServer.sh start JMX enabled by default Using config:/usr/local/zk/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@hadoop1 bin]# ssh hadoop2 Last login: Mon May 11 08:25:52 2015 fromhadoop [root@hadoop2 ~]# cd /usr/local/zk/bin [root@hadoop2 bin]# zkServer.sh start JMX enabled by default Using config:/usr/local/zk/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
檢驗,在三個節點上分别執行指令zkServer.sh status
檢視選舉結果:
[root@hadoop2 bin]# zkServer.sh status JMX enabled by default Using config:/usr/local/zk/bin/../conf/zoo.cfg Mode: follower [root@hadoop1 bin]# zkServer.sh status JMX enabled by default Using config: /usr/local/zk/bin/../conf/zoo.cfg Mode: leader [root@hadoop bin]# zkServer.sh status JMX enabled by default Using config:/usr/local/zk/bin/../conf/zoo.cfg Mode: follower
Zookeeper的使用(指令行操作)
Zookeeper有目錄結構,稱作節點,節點可以指派,可以添加,可以删除
終端:zkCli.sh 可以進入指令行
[zk: localhost:2181(CONNECTED) 2] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 3] ls/zookeeper [quota] [zk: localhost:2181(CONNECTED) 4] ls/zookeeper/quota []
建立了一個節點,給它指派hadoop,通過get 指令獲得它的值。
[zk: localhost:2181(CONNECTED) 5] create/cloud hadoop Created /cloud [zk: localhost:2181(CONNECTED) 6] ls / [cloud, zookeeper] [zk: localhost:2181(CONNECTED) 7] get /cloud hadoop cZxid = 0x100000002 ctime = Mon May 11 10:07:07 CST 2015 mZxid = 0x100000002 mtime = Mon May 11 10:07:07 CST 2015 pZxid = 0x100000002 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0
可以set 設定值 你會發現在其他的兩個zookeeper伺服器上,會獲得這個值,也就是所謂的事物一緻性。
Zookeeper的節點
Znode有兩種類型,短暫的和持久的。
Znode的類型在建立時确定給并且之後不能 在修改。
短暫znode的用戶端會話結束時,zookeeper會将該短暫的znode删除,短暫znode不可以有子節點。
持久znode不依賴與用戶端會話,隻有當用戶端明确要删除該持久znode時才會被删除。
本文作者: chaplinthink, 關注領域:大資料、基礎架構、系統設計, 一個熱愛學習、分享的大資料工程師