初始叢集狀態

機器名

IP

作用

linux系統

master

192.168.218.133

 

CentOS-6.9-x86_64-bin-DVD1.iso

slave1

192.168.218.135

 

CentOS-6.9-x86_64-bin-DVD1.iso

slave2

192.168.218.134

 

CentOS-6.9-x86_64-bin-DVD1.iso

修改所有機器上的zk環境變數
sudo vim ~/.bash_profile

source ~/.bash_profile

 

 

 

export ZOOKEEPER_HOME=/home/hadoop/zookeeper/zookeeper-3.4.10

:${ZOOKEEPER_HOME}/bin

修改配置檔案zoo.cfg

所有zookeeper節點的配置檔案zoo.cfg都是一樣的,只有myid檔案不一樣

重新命名mv zoo_smaple.cfg zoo.cfg

sudo vim zoo.cfg

dataDir=/home/hadoop/zookeeper/zookeeperData

maxSessionTimeout=120000

maxClientCnxns=600

server.1=master:2888:3888

server.2=slave2:2888:3888

server.3=slave1:2888:3888

 

根據zoo.cfg到各個機器上手動建立dataDir目錄

mkdir -pv /home/hadoop/zookeeper/zookeeperData

根據zoo.cfg到各個機器上手動建立myid檔案

master : echo 1 > myid

slave1 : echo 3 > myid

slave2 : echo 2 > myid

每臺機器都要啟動zk

檢視zk的狀態

zkServer.sh status

每臺伺服器都執行zkServer.sh status,其中有一臺應該顯示:“Mode:follower,其他顯示“Mode:leader”

jps -l

批量啟動zk指令碼開發

vi zk-start.sh

#!/bin/bash

#呼叫zkServer.sh start啟動zk服務

for host in master slave1 slave2

do

        echo "starting $host zookeeper......"

        ssh [email protected]$host "source ~/.bash_profile;/home/hadoop/zookeeper/zookeeper-3.4.10/bin/zkServer.sh start"

done

#呼叫zkServer.sh status檢視zk狀態

賦予指令碼執行的許可權

chmod u+x zk-start.sh

執行指令碼

sh zk-start.sh

zk叢集結構

zk叢集中節點有3中角色

leader 主節點

follower 從節點,會參與叢集leader的選舉

observer 從節點,不會參與叢集leader的選舉

 

leader選舉機制:叢集啟動之時,比如,server1先啟動,啟動之後,探測叢集中是否有leader,如果沒有,就開始往叢集中廣播投票:選自己。接著server2上線了發現叢集中沒有leader,也投票選舉:選自己,接著server1和server2都受到兩個投票資訊,兩個節點都沒有成功當選leader,再來一輪投票,server1會投server2(投id更大的),server2投自己(投id更大的),此時兩人都得到選舉資訊:結果是server2得到兩個投票得分,server2當選leader,此時叢集進入正常工作狀態,然後server3上線了探測發現有一個leader了自動進入follower狀態。叢集執行中,如果leader宕機,剩下的機器會自動進入選狀態重新選舉,選舉的依據是:優先考慮節點所持有的資料的版本號,次之在考慮id。

 

zk的基本使用

zk的自帶命令列客戶端使用

zkCli.sh

  zk中的資料本質上是一些<key,value>

  zk中的一個數據叫做一個znode

  一個znode中的資料不能太大,通常在10kb以內,官方要求最多不能超過1mb,如果太大則會導叢集中各節點的資料無法實時同步保持一致性

znode型別

ephemeral節點:臨時幾點,臨時節點的生命週期跟客戶端回話繫結,一旦客戶端回話失敗,那麼這個客戶端建立的所有臨時節點都會被刪除

persistent節點:持久節點,一旦被建立就會一直存在,除非手動刪除

sequential節點:帶自增序號的節點,在同一個節點下建立sequential節點,zk會給子節點名字自動拼接一個自增的序列號

zk的節點事件監聽功能

  ls path watch                                                                                                                                                                                                                                                                                                                 

zk的客戶端api基本使用

String connectString = "192.168.218.133:2181,192.168.218.134:2181,192.168.218.135:2181";

int sessionTimeout = 2000;

Watcher watcher = null;

try {

ZooKeeper zk = new ZooKeeper(connectString, sessionTimeout, watcher);

String path = "/aaa/bbb";

boolean watch = false;

Stat stat = new Stat();

byte[] data = zk.getData(path, watch, stat);

System.out.println(new String(data));

zk.close();

} catch (IOException e) {

e.printStackTrace();

} catch (KeeperException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

}