ZooKeeper分布式協調服務設計核心概念及安裝配置
目錄
- 一、ZooKeeper 簡介
- 1.ZooKeeper 設計目標
- 2.核心概念
- 1)Session 會話
- 2)數據節點
- 3)Watcher
- 4)ACL
- 3.Zab 協議介紹
- 二、ZooKeeper Cluster 安裝
- 1.安裝 ZooKeeper
- 2.使用 Golang 連接 ZooKeeper 的 API 接口
- 3.配置 ZooKeeper Cluster
一、ZooKeeper 簡介
ZooKeeper 是一個開源的分布式協調服務,目前由 Apache 進行維護。ZooKeeper 可以用于實現分布式系統中常見的發布/訂閱、負載均衡、命令服務、分布式協調/通知、集群管理、Master 選舉、分布式鎖和分布式隊列等功能。 它具有以下特性:
順序一致性: 來自客戶端的更新操作將會按照順序被應用;
原子性: 即要么全部更新成功,要么要不更新失敗,沒有部分的結果;
統一的系統鏡像: 即不管客戶端連接的是哪臺服務器,都能看到同樣的服務視圖(也就是無狀態的)
可靠性: 一旦寫入操作被執行,那么這個狀態將會被持久化,直到其它客戶端的修改生效。
實時性: 一旦一個事務被成功應用,ZooKeeper 可以保證客戶端立即讀取到這個事務變更后的最新狀態的數據。
1.ZooKeeper 設計目標
- ZooKeeper 致力于為那些高吞吐的大型分布式系統提供一個高性能、高可用、且具有嚴格順序訪問控制能力的分布式協調服務。
1)簡單的數據模型:
ZooKeeper 通過樹形結構來存儲數據,它由一系列被稱為 ZNode 的數據節點組成,類似于常見的文件系統;
不過和常見的文件系統不同,ZooKeeper 將數據全量存儲在內存中,以此來實現高吞吐,減少訪問延遲。
2)可配置 Cluster:
為了保證高可用,最好是以集群形態部署 ZooKeeper,這樣只要集群中大部分機器是可用的,那么 ZooKeeper 本身仍然可用。
上圖中每一個 Server 代表一個安裝 ZooKeeper 服務的服務器,組成 ZooKeeper 服務的服務器都會在內存中維護當前的服務器狀態,并且每臺服務器間都保持著通信。并通過 Zab
協議來保持數據的一致性。
3)順序訪問:
對于來自客戶端的每個更新請求,ZooKeeper 都會分配一個全局唯一的遞增 ID,這個 ID 決定了所有事務操作的先后順序。
4)高性能高可用
ZooKeeper 將數據全量存儲在內存中以保持高性能,并通過服務集群來實現高可用;由于 ZooKeeper 的所有更新和刪除都是基于事務的,所以其在讀多寫少的應用場景中有著很高的性能表現。
2.核心概念
Cluster 角色:
1)Session 會話
當 Client 通過 TCP 長連接 連接到 ZooKeeper 服務器時,Session 便開始建立連接,并通過 tickTime
(心跳檢測)機制來保持有效的會話狀態。通過這個連接,Client 可以發送請求并接收響應,同時也可以接收到 Watch 事件的通知。
另外,當由于網絡故障或者 Client 主動斷開等原因,導致連接斷開,此時只要在會話超時時間之內重新建立連接,則之間創建的會話依然有效。(這個取決于 tickTime
配置)
2)數據節點
ZooKeeper 數據模型是由一系列基本數據單元 ZNode(數據節點)組成的節點樹,其中根節點為 /
(每個節點上都會保存自己的數據和節點信息);ZooKeeper 中的節點可以分為兩大類:
持久節點: 節點一旦創建,除非被主動刪除,否則一直存在。
臨時節點: 一旦創建該節點的客戶端會話(Session)失效,則所有該客戶端創建的臨時節點都會被刪除。
3)Watcher
ZooKeeper 中一個常用的功能是 Watcher(事件監聽器),它允許用戶在指定節點上針對感興趣的事件注冊監聽,當事件發生時,監聽器會被觸發,并將事件推送到客戶端。該機制是 ZooKeeper 實現分布式協調服務的重要特性。
4)ACL
create
可以進行創建操作read
可以進行查看操作write
可以對創建的內容進行寫入操作delete
可以進行刪除操作admin
可以進行配置權限操作命令作用create
可以進行創建操作read
可以進行查看操作write
可以對創建的內容進行寫入操作delete
可以進行刪除操作admin
可以進行配置權限操作
3.Zab 協議介紹
Zab(ZooKeeper Atomic Broadcast 原子廣播)協議是為分布式協調服務 ZooKeeper 專門設計的一種 支持崩潰恢復的原子廣播協議;
在 ZooKeeper 中,主要依賴 Zab 協議來實現分布式數據一致性;
基于 Zab 協議,ZooKeeper 實現了一種主備模式的系統架構來保持集群中各個副本間的數據一致性。
二、ZooKeeper Cluster 安裝
準備工作:
安裝 JDK:下載地址(需要創建 Oracle 賬號)
[root@ZooKeeper ~]# lsanaconda-ks.cfg jdk-8u181-linux-x64.tar.gz[root@ZooKeeper ~]# tar zxf jdk-8u181-linux-x64.tar.gz [root@ZooKeeper ~]# lsanaconda-ks.cfg jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz[root@ZooKeeper ~]# mv jdk1.8.0_181 /usr/local/java[root@ZooKeeper ~]# cat <<END >> /etc/profileexport JAVA_HOME=/usr/local/javaexport PATH=$PATH:$JAVA_HOME/binEND[root@ZooKeeper ~]# source /etc/profile[root@ZooKeeper ~]# java -version
1.安裝 ZooKeeper
[root@ZooKeeper ~]# wget http://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz[root@ZooKeeper ~]# lsanaconda-ks.cfg apache-zookeeper-3.6.3-bin.tar.gz jdk-8u181-linux-x64.tar.gz[root@ZooKeeper ~]# tar zxf apache-zookeeper-3.6.3-bin.tar.gz[root@ZooKeeper ~]# mv apache-zookeeper-3.6.3-bin /usr/local/zookeeper[root@ZooKeeper ~]# mkdir /usr/local/zookeeper/data[root@ZooKeeper ~]# cat <<END >> /usr/local/zookeeper/conf/zoo.cfgtickTime=2000initLimit=10syncLimit=5dataDir=/usr/local/zookeeper/dataclientPort=2181END
注解:
tickTime
:Client 和服務器間的通信會話限制(相當于健康檢查,tickTime 的時間為 ms (1s = 1000ms))
initLimit
:Leader 和 Follower 間初始通信限制。
syncLimit
:Leader 和 Follower 間同步通信限制(當響應時間超于 syncLimit * tickTime 時,Leader 便會將 Follower 進行移除)
dataDir
:此目錄用于存放保存在內存數據庫中的快照信息(當未配置 dataLogDir 參數時,日志信息也會存放到此目錄)
clientPort
:ZooKeeper 監聽的端口,用于客戶端連接使用。
啟動 ZooKeeper
[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh start # 啟動[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh status # 查看狀態
連接到 ZooKeeper
[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181Welcome to ZooKeeper!JLine support is enabledWATCHER::WatchedEvent state:SyncConnected type:None path:null[zk: 127.0.0.1:2181(CONNECTED) 0]
當連接成功后,系統會輸出 ZooKeeper 的相關配置信息和相關環境,并在屏幕上輸出 Welcome to ZooKeeper!
等信息。
2.使用 Golang 連接 ZooKeeper 的 API 接口
3.配置 ZooKeeper Cluster
在原來的基礎上,在增加兩臺服務器:
1)將 Java 和 ZooKeeper 傳給新的服務器:
[root@ZooKeeper ~]# scp -r /usr/local/java [email protected]:/usr/local/[root@ZooKeeper ~]# scp -r /usr/local/zookeeper [email protected]:/usr/local/
2)在新的服務器上啟動 ZooKeeper:
[root@ZooKeeper ~]# cat <<END >> /etc/profileexport JAVA_HOME=/usr/local/javaexport PATH=$PATH:$JAVA_HOME/binEND[root@ZooKeeper ~]# source /etc/profile[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh start
3)配置 Cluster 集群(三臺服務器上操作一樣)
[root@ZooKeeper ~]# cat <<END >> /usr/local/zookeeper/conf/zoo.cfgserver.1=192.168.1.1:2888:3888server.2=192.168.1.2:2889:3889server.3=192.168.1.3:2890:3890END
4)創建 myid
文件
[root@ZooKeeper ~]# echo "1" > /usr/local/zookeeper/data/myid[root@ZooKeeper-2 ~]# echo "2" > /usr/local/zookeeper/data/myid[root@ZooKeeper-2 ~]# echo "3" > /usr/local/zookeeper/data/myid
需要確保每臺服務器的 myid
文件中數字不同,并且和自己所在機器的 zoo.cfg
中 server.id=host:port:port
的 id
值一樣。
另外,id
的范圍是 1 ~ 255
。
5)重啟 ZooKeeper 服務
[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh restart # 三臺服務器都要重啟
查看 ZooKeeper 狀態:
驗證:
以上就是ZooKeeper分布式協調服務設計核心概念及安裝配置的詳細內容,更多關于ZooKeeper分布式協調服務核心安裝配置的資料請關注其它相關文章!