ZooKeeper分布式協(xié)調(diào)服務(wù)設(shè)計(jì)核心概念及安裝配置
目錄
- 一、ZooKeeper 簡(jiǎn)介
- 1.ZooKeeper 設(shè)計(jì)目標(biāo)
- 2.核心概念
- 1)Session 會(huì)話
- 2)數(shù)據(jù)節(jié)點(diǎn)
- 3)Watcher
- 4)ACL
- 3.Zab 協(xié)議介紹
- 二、ZooKeeper Cluster 安裝
- 1.安裝 ZooKeeper
- 2.使用 Golang 連接 ZooKeeper 的 API 接口
- 3.配置 ZooKeeper Cluster
一、ZooKeeper 簡(jiǎn)介
ZooKeeper 是一個(gè)開(kāi)源的分布式協(xié)調(diào)服務(wù),目前由 Apache 進(jìn)行維護(hù)。ZooKeeper 可以用于實(shí)現(xiàn)分布式系統(tǒng)中常見(jiàn)的發(fā)布/訂閱、負(fù)載均衡、命令服務(wù)、分布式協(xié)調(diào)/通知、集群管理、Master 選舉、分布式鎖和分布式隊(duì)列等功能。 它具有以下特性:
順序一致性: 來(lái)自客戶(hù)端的更新操作將會(huì)按照順序被應(yīng)用;
原子性: 即要么全部更新成功,要么要不更新失敗,沒(méi)有部分的結(jié)果;
統(tǒng)一的系統(tǒng)鏡像: 即不管客戶(hù)端連接的是哪臺(tái)服務(wù)器,都能看到同樣的服務(wù)視圖(也就是無(wú)狀態(tài)的)
可靠性: 一旦寫(xiě)入操作被執(zhí)行,那么這個(gè)狀態(tài)將會(huì)被持久化,直到其它客戶(hù)端的修改生效。
實(shí)時(shí)性: 一旦一個(gè)事務(wù)被成功應(yīng)用,ZooKeeper 可以保證客戶(hù)端立即讀取到這個(gè)事務(wù)變更后的最新?tīng)顟B(tài)的數(shù)據(jù)。
1.ZooKeeper 設(shè)計(jì)目標(biāo)
- ZooKeeper 致力于為那些高吞吐的大型分布式系統(tǒng)提供一個(gè)高性能、高可用、且具有嚴(yán)格順序訪問(wèn)控制能力的分布式協(xié)調(diào)服務(wù)。
1)簡(jiǎn)單的數(shù)據(jù)模型:
ZooKeeper 通過(guò)樹(shù)形結(jié)構(gòu)來(lái)存儲(chǔ)數(shù)據(jù),它由一系列被稱(chēng)為 ZNode 的數(shù)據(jù)節(jié)點(diǎn)組成,類(lèi)似于常見(jiàn)的文件系統(tǒng);
不過(guò)和常見(jiàn)的文件系統(tǒng)不同,ZooKeeper 將數(shù)據(jù)全量存儲(chǔ)在內(nèi)存中,以此來(lái)實(shí)現(xiàn)高吞吐,減少訪問(wèn)延遲。
2)可配置 Cluster:
為了保證高可用,最好是以集群形態(tài)部署 ZooKeeper,這樣只要集群中大部分機(jī)器是可用的,那么 ZooKeeper 本身仍然可用。
上圖中每一個(gè) Server 代表一個(gè)安裝 ZooKeeper 服務(wù)的服務(wù)器,組成 ZooKeeper 服務(wù)的服務(wù)器都會(huì)在內(nèi)存中維護(hù)當(dāng)前的服務(wù)器狀態(tài),并且每臺(tái)服務(wù)器間都保持著通信。并通過(guò) Zab
協(xié)議來(lái)保持?jǐn)?shù)據(jù)的一致性。
3)順序訪問(wèn):
對(duì)于來(lái)自客戶(hù)端的每個(gè)更新請(qǐng)求,ZooKeeper 都會(huì)分配一個(gè)全局唯一的遞增 ID,這個(gè) ID 決定了所有事務(wù)操作的先后順序。
4)高性能高可用
ZooKeeper 將數(shù)據(jù)全量存儲(chǔ)在內(nèi)存中以保持高性能,并通過(guò)服務(wù)集群來(lái)實(shí)現(xiàn)高可用;由于 ZooKeeper 的所有更新和刪除都是基于事務(wù)的,所以其在讀多寫(xiě)少的應(yīng)用場(chǎng)景中有著很高的性能表現(xiàn)。
2.核心概念
Cluster 角色:
1)Session 會(huì)話
當(dāng) Client 通過(guò) TCP 長(zhǎng)連接 連接到 ZooKeeper 服務(wù)器時(shí),Session 便開(kāi)始建立連接,并通過(guò) tickTime
(心跳檢測(cè))機(jī)制來(lái)保持有效的會(huì)話狀態(tài)。通過(guò)這個(gè)連接,Client 可以發(fā)送請(qǐng)求并接收響應(yīng),同時(shí)也可以接收到 Watch 事件的通知。
另外,當(dāng)由于網(wǎng)絡(luò)故障或者 Client 主動(dòng)斷開(kāi)等原因,導(dǎo)致連接斷開(kāi),此時(shí)只要在會(huì)話超時(shí)時(shí)間之內(nèi)重新建立連接,則之間創(chuàng)建的會(huì)話依然有效。(這個(gè)取決于 tickTime
配置)
2)數(shù)據(jù)節(jié)點(diǎn)
ZooKeeper 數(shù)據(jù)模型是由一系列基本數(shù)據(jù)單元 ZNode(數(shù)據(jù)節(jié)點(diǎn))組成的節(jié)點(diǎn)樹(shù),其中根節(jié)點(diǎn)為 /
(每個(gè)節(jié)點(diǎn)上都會(huì)保存自己的數(shù)據(jù)和節(jié)點(diǎn)信息);ZooKeeper 中的節(jié)點(diǎn)可以分為兩大類(lèi):
持久節(jié)點(diǎn): 節(jié)點(diǎn)一旦創(chuàng)建,除非被主動(dòng)刪除,否則一直存在。
臨時(shí)節(jié)點(diǎn): 一旦創(chuàng)建該節(jié)點(diǎn)的客戶(hù)端會(huì)話(Session)失效,則所有該客戶(hù)端創(chuàng)建的臨時(shí)節(jié)點(diǎn)都會(huì)被刪除。
3)Watcher
ZooKeeper 中一個(gè)常用的功能是 Watcher(事件監(jiān)聽(tīng)器),它允許用戶(hù)在指定節(jié)點(diǎn)上針對(duì)感興趣的事件注冊(cè)監(jiān)聽(tīng),當(dāng)事件發(fā)生時(shí),監(jiān)聽(tīng)器會(huì)被觸發(fā),并將事件推送到客戶(hù)端。該機(jī)制是 ZooKeeper 實(shí)現(xiàn)分布式協(xié)調(diào)服務(wù)的重要特性。
4)ACL
create
可以進(jìn)行創(chuàng)建操作read
可以進(jìn)行查看操作write
可以對(duì)創(chuàng)建的內(nèi)容進(jìn)行寫(xiě)入操作delete
可以進(jìn)行刪除操作admin
可以進(jìn)行配置權(quán)限操作命令作用create
可以進(jìn)行創(chuàng)建操作read
可以進(jìn)行查看操作write
可以對(duì)創(chuàng)建的內(nèi)容進(jìn)行寫(xiě)入操作delete
可以進(jìn)行刪除操作admin
可以進(jìn)行配置權(quán)限操作
3.Zab 協(xié)議介紹
Zab(ZooKeeper Atomic Broadcast 原子廣播)協(xié)議是為分布式協(xié)調(diào)服務(wù) ZooKeeper 專(zhuān)門(mén)設(shè)計(jì)的一種 支持崩潰恢復(fù)的原子廣播協(xié)議;
在 ZooKeeper 中,主要依賴(lài) Zab 協(xié)議來(lái)實(shí)現(xiàn)分布式數(shù)據(jù)一致性;
基于 Zab 協(xié)議,ZooKeeper 實(shí)現(xiàn)了一種主備模式的系統(tǒng)架構(gòu)來(lái)保持集群中各個(gè)副本間的數(shù)據(jù)一致性。
二、ZooKeeper Cluster 安裝
準(zhǔn)備工作:
安裝 JDK:下載地址(需要?jiǎng)?chuàng)建 Oracle 賬號(hào))
[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 和服務(wù)器間的通信會(huì)話限制(相當(dāng)于健康檢查,tickTime 的時(shí)間為 ms (1s = 1000ms))
initLimit
:Leader 和 Follower 間初始通信限制。
syncLimit
:Leader 和 Follower 間同步通信限制(當(dāng)響應(yīng)時(shí)間超于 syncLimit * tickTime 時(shí),Leader 便會(huì)將 Follower 進(jìn)行移除)
dataDir
:此目錄用于存放保存在內(nèi)存數(shù)據(jù)庫(kù)中的快照信息(當(dāng)未配置 dataLogDir 參數(shù)時(shí),日志信息也會(huì)存放到此目錄)
clientPort
:ZooKeeper 監(jiān)聽(tīng)的端口,用于客戶(hù)端連接使用。
啟動(dòng) ZooKeeper
[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh start # 啟動(dòng)[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh status # 查看狀態(tài)
連接到 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]
當(dāng)連接成功后,系統(tǒng)會(huì)輸出 ZooKeeper 的相關(guān)配置信息和相關(guān)環(huán)境,并在屏幕上輸出 Welcome to ZooKeeper!
等信息。
2.使用 Golang 連接 ZooKeeper 的 API 接口
3.配置 ZooKeeper Cluster
在原來(lái)的基礎(chǔ)上,在增加兩臺(tái)服務(wù)器:
1)將 Java 和 ZooKeeper 傳給新的服務(wù)器:
[root@ZooKeeper ~]# scp -r /usr/local/java [email protected]:/usr/local/[root@ZooKeeper ~]# scp -r /usr/local/zookeeper [email protected]:/usr/local/
2)在新的服務(wù)器上啟動(dòng) 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 集群(三臺(tái)服務(wù)器上操作一樣)
[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)創(chuàng)建 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
需要確保每臺(tái)服務(wù)器的 myid
文件中數(shù)字不同,并且和自己所在機(jī)器的 zoo.cfg
中 server.id=host:port:port
的 id
值一樣。
另外,id
的范圍是 1 ~ 255
。
5)重啟 ZooKeeper 服務(wù)
[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh restart # 三臺(tái)服務(wù)器都要重啟
查看 ZooKeeper 狀態(tài):
驗(yàn)證:
以上就是ZooKeeper分布式協(xié)調(diào)服務(wù)設(shè)計(jì)核心概念及安裝配置的詳細(xì)內(nèi)容,更多關(guān)于ZooKeeper分布式協(xié)調(diào)服務(wù)核心安裝配置的資料請(qǐng)關(guān)注其它相關(guān)文章!
