zookeeper
- 1 zookeeper入門
- 1.1 zookeeper特點
- 1.2 資料結構
- 1.3應用場景
- 1.4 下載地址
- 2 zookeeper安裝
- 2.1 安裝部署
- 2.2 配置引數解讀
- 3 zookeeper內部原理
- 3.1 選舉機制
- 3.2 節點型別
- 4 zookeeper實戰(重點)
- 4.1 偽分布式集群
- 4.2 客戶端命令列操作
- 4.3 寫資料流程
- 4.4 java連接zookeeper
- 總結
1 zookeeper入門
zookeeper是一個開源的分布式的,為分布式應用提供協調服務的Apache專案
1.1 zookeeper特點
- zookeeper: 一個領導者(Leader),多個跟隨者(Follower)組成的集群
- 集群中只要有半數以上節點存貨,zookeeper集群就能正常服務
- 全域資料一致: 每個server保存一份相同的資料副本,client無論連接到哪個server,資料都是一致的
- 更新請求順序進行,來自同一個client的更新請求按其發送順序依次執行
- 資料更新原子性,一次資料更新要么成功,要么失敗
- 實時性,在一定時間范圍內,client能讀到最新資料
1.2 資料結構
zookeeper資料模型的結構與Unix檔案系統很類似,整體上可以看做是一棵樹,每個節點稱作一個ZNode.每個ZNode默認能夠存盤1MB的資料,每個ZNode都可以通過其路徑唯一標識
1.3應用場景
- 統一命名服務
- 例如: ip不容易記住,而域名容易記住
- 統一配置管理
- 可將配置資訊寫入zookeeper上的一個ZNode
- 各個客戶端服務器監聽這個ZNode
- 一旦ZNode中的資料被修改,zookeeper將通知各個客戶端服務器
- 統一集群管理
- 可將節點資訊寫入zookeeper上的一個ZNode
- 監聽這ZNode可獲取它的實時狀態變化
- 服務器動態上下線
- 客戶端能實時洞察到服務器上下線的變化
- 負載均衡
- 在zookeeper中記錄每臺服務器的訪問數,讓訪問數最少的服務器去處理最新的客戶端請求
1.4 下載地址
官網下載
2 zookeeper安裝
2.1 安裝部署
需要具備jdk環境(示例):
#解壓
tar -zxf apache-zookeeper-3.5.9-bin.tar.gz
#移動
mv apache-zookeeper-3.5.9-bin /opt/
#進入組態檔目錄
cd /opt/apache-zookeeper-3.5.9-bin/conf/
#cp組態檔
cp zoo_sample.cfg zoo.cfg
#修改組態檔
vi zoo.cfg

#進入bin目錄
cd /opt/apache-zookeeper-3.5.9-bin/bin/
#啟動服務端
./zkServer.sh start
#啟動客戶端
./zkCli.sh
2.2 配置引數解讀
代碼如下(示例):

3 zookeeper內部原理
3.1 選舉機制
- 半數機制: 集群中半數以上機器存活,集群可用.所以zookeeper適合安裝奇數太服務器
- zookeeper雖然在組態檔中并沒有指定Master和Slave.但是,zookeeper作業時,是有一個節點為Leader,其他則為Follower,Leader是通過內部的選舉機制臨時產生的
- 每個ZNode自己投票,未選出Leader就會把票投給id最大的,當票超過半數則Leader產生,后面再新增多少ZNode都無法改變Leader
3.2 節點型別
持久(persistent): 客戶端和服務器斷開連接后,創建的節點不洗掉
短暫(ephemeral): 客戶端和服務器斷開連接后,創建的節點洗掉
4 zookeeper實戰(重點)
4.1 偽分布式集群
#進入資料目錄
cd /opt/apache-zookeeper-3.5.9-bin/zkData/
#創建節點資料目錄
mkdir zk1
mkdir zk2
mkdir zk3
#創建myid檔案
echo "1" > zk1/myid
echo "2" > zk2/myid
echo "3" > zk3/myid
#進入組態檔目錄
cd /opt/apache-zookeeper-3.5.9-bin/conf/
#復制組態檔
cp zoo.cfg zk1.cfg
#修改組態檔
vi zk1.cfg

server.X --> X就是myid中的數字,表示這是第幾號服務器
第一個埠是Leader與Follower交換資訊埠(資料副本)
第二個埠是leader服務器掛了,用來選舉的通信埠(選舉)
#在復制兩份組態檔
cp zk1.cfg zk2.cfg
cp zk1.cfg zk3.cfg
修改dataDir和clientport(遞增)
#進入bin目錄
cd /opt/apache-zookeeper-3.5.9-bin/bin/
#啟動服務
./zkServer.sh start zk1.cfg
./zkServer.sh start zk2.cfg
./zkServer.sh start zk3.cfg
#查看節點狀態
./zkServer.sh status zk1.cfg
./zkServer.sh status zk2.cfg
./zkServer.sh status zk3.cfg
#客戶端連接(可以和任意的ZNode諒解)
./zkCli.sh -server 192.168.59.140:2181
4.2 客戶端命令列操作
#查看所有操作命令
help
#查看當前znode中所包含的內容
ls /
#查看當前節點詳細資料
ls -s /
#創建普通節點(可以遞回創建節點,但是必須要有資料,沒有資料創建不了)
create /sanguo "劉備"
#獲取節點的值
get /sanguo
#創建短暫的節點(當客戶端斷開,zf被洗掉)
create -e /sanguo/zf "張飛"
#創建帶序號的節點
create -s /sanguo/gy "關羽"
#修改節點的值
set /sanguo "織席販履--劉備也"
#監聽節點的變化(再開一個client)
#注意:監聽觸發器是一次性的,也就是一次就會失效
get -w /sanguo
#監聽節點的子節點變化(路徑變化)
ls -w /sanguo
#洗掉節點
delete /sanguo/zf
#遞回洗掉(如果有子節點,delete是無法洗掉的,需用deleteall)
deleteall /sanguo
4.3 寫資料流程

4.4 java連接zookeeper
引入依賴
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.9</version>
</dependency>
撰寫demo
public class TestZookeeper {
private static String ip = "192.168.59.140:2181";
private static int session_timeout = 40000;
private static CountDownLatch latch = new CountDownLatch(1);
public static void main(String[] args) throws Exception {
ZooKeeper zooKeeper = new ZooKeeper(ip, session_timeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState() == Event.KeeperState.SyncConnected) {
//確認已經連接完畢后再進行操作
latch.countDown();
System.out.println("已經獲得了連接");
}
}
});
//連接完成之前先等待
latch.await();
String s = zooKeeper.create("/sanguo", "三國".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(s);
}
}
總結
文章內容主要來自B站尚硅谷

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/287140.html
標籤:其他
