天天看點

分布式協調服務-Zookeeper

什麼是 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, 關注領域:大資料、基礎架構、系統設計, 一個熱愛學習、分享的大資料工程師