.

什麼是Zookeeper

Zookeeper是一個分散式開源框架,提供了協調分散式應用的基本服務,它向外部應用暴露一組通用服務——分散式同步(Distributed Synchronization)、命名服務(Naming Service)、叢集維護(Group Maintenance)等,簡化分散式應用協調及其管理的難度,提供高效能的分散式服務。ZooKeeper本身可以以單機模式安裝執行,不過它的長處在於通過分散式ZooKeeper叢集(一個Leader,多個Follower),基於一定的策略來保證ZooKeeper叢集的穩定性和可用性,從而實現分散式應用的可靠性。

Zookeeper簡介

1、Zookeeper是為別的分散式程式服務的
2、Zookeeper本身就是一個分散式程式(只要有半數以上節點存活,zk就能正常服務)
3、Zookeeper所提供的服務涵蓋:主從協調、伺服器節點動態上下線、統一配置管理、分散式共享鎖、統> 一名稱服務等
4、雖然說可以提供各種服務,但是zookeeper在底層其實只提供了兩個功能:
4.1:管理(儲存,讀取)使用者程式提交的資料(類似namenode中存放的metadata)
4.2:為使用者程式提供資料節點監聽服務

Zookeeper應用場景圖

Zookeeper叢集機制

Zookeeper叢集的角色: Leader 和 follower 
只要叢集中有半數以上節點存活,叢集就能提供服務

Zookeeper特性

1、Zookeeper:一個leader,多個follower組成的叢集
2、全域性資料一致:每個server儲存一份相同的資料副本,client無論連線到哪個server,資料都是一致的
3、分散式讀寫,更新請求轉發,由leader實施
4、更新請求順序進行,來自同一個client的更新請求按其傳送順序依次執行
5、資料更新原子性,一次資料更新要麼成功,要麼失敗
6、實時性,在一定時間範圍內,client能讀到最新資料

zookeeper的資料儲存機制

資料儲存形式

zookeeper中對使用者的資料採用kv形式儲存

只是zk有點特別:

key:是以路徑的形式表示的,那就以為著,各key之間有父子關係,比如

/ 是頂層key

使用者建的key只能在/ 下作為子節點,比如建一個key: /aa  這個key可以帶value資料

 也可以建一個key:   /bb

也可以建key: /aa/xx

zookeeper中,對每一個數據key,稱作一個znode

綜上所述,zk中的資料儲存形式如下:

znode型別

zookeeper中的znode有多種型別:

  1. PERSISTENT  持久的:建立者就算跟叢集斷開聯絡,該類節點也會持久存在與zk叢集中
  2. EPHEMERAL  短暫的:建立者一旦跟叢集斷開聯絡,zk就會將這個節點刪除
  3. SEQUENTIAL  帶序號的:這類節點,zk會自動拼接上一個序號,而且序號是遞增的

組合型別:

    PERSISTENT  :持久不帶序號

    EPHEMERAL  :短暫不帶序號

    PERSISTENT  且 SEQUENTIAL   :持久且帶序號

    EPHEMERAL  且 SEQUENTIAL  :短暫且帶序號

zookeeper的叢集部署

叢集選舉示意圖

解壓Zokeeper安裝包到apps目錄下
tar -zxvf zookeeper-3.4.6.tar.gz -C apps

cd /root/apps/zookeeper-3.4.6/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改dataDir=/root/zkdata
在後面加上叢集的機器:2888是leader和follower通訊埠,3888是投票的

server.1=hdp-01:2888:3888
server.2=hdp-02:2888:3888
server.3=hdp-03:2888:3888

對3臺節點,都建立目錄 mkdir /root/zkdata
對3臺節點,在工作目錄中生成myid檔案,但內容要分別為各自的id: 1,2,3

echo 1 > /root/zkdata/myid
echo 2 > /root/zkdata/myid
echo 3 > /root/zkdata/myid

從hdp20-01上scp安裝目錄到其他兩個節點
cd apps
scp -r zookeeper-3.4.6/ hdp-02:$PWD
scp -r zookeeper-3.4.6/ hdp-03:$PWD

啟動zookeeper叢集
zookeeper沒有提供自動批量啟動指令碼,需要手動一臺一臺地起zookeeper程序
在每一臺節點上,執行命令:

cd /root/apps/zookeeper-3.4.6
bin/zkServer.sh start
啟動後,用jps應該能看到一個程序:QuorumPeerMain

但是,光有程序不代表zk已經正常服務,需要用命令檢查狀態:
bin/zkServer.sh status
能看到角色模式:為leader或follower,即正常了。

自己寫個指令碼,一鍵啟動
vi zkmanage.sh

#!/bin/bash
for host in hdp-01 hdp-02 hdp-03
do
echo "${host}:$1ing....."
ssh $host "/root/apps/zookeeper-3.4.6/bin/zkServer.sh $1"
done

停止命令:sh zjmanage.sh stop
加個可執行許可權:chmod +zkmanage.sh
啟動命令:./zkmanage.sh start
但是出現沒有Java環境變數問題,修改配置檔案
vi zkmanage.sh
修改配置如下

#!/bin/bash
for host in hdp-01 hdp-02 hdp-03
do
echo "${host}:$1ing....."
ssh $host "source /etc/profile;/root/apps/zookeeper-3.4.6/bin/zkServer.sh $1"
done

sleep 2
for host in hdp-01 hdp-02 hdp-03
do
ssh $host "source /etc/profile;/root/apps/zookeeper-3.4.6/bin/zkServer.sh status"
done

啟動叢集結果

hdp-01:starting.....
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
hdp-02:starting.....
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
hdp-03:starting.....
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
JMX enabled by default
Using config: /root/apps/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

 

版權@須臾之餘https://my.oschina.net/u/39951