zookeeper-3.4.10分散式叢集環境搭建
初始叢集狀態
機器名 |
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();
}