溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ZooKeeper的架構(gòu)由什么組成

發(fā)布時(shí)間:2021-12-09 09:51:17 來(lái)源:億速云 閱讀:187 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“ZooKeeper的架構(gòu)由什么組成”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“ZooKeeper的架構(gòu)由什么組成”吧!

1. Zookeeper簡(jiǎn)介

1.1 Zookeeper是什么?

Zookeeper 是一個(gè)分布式協(xié)調(diào)服務(wù)的開(kāi)源框架。 主要用來(lái)解決分布式集群中應(yīng)用系統(tǒng)的一致性問(wèn)題,
例如怎樣避免同時(shí)操作同一數(shù)據(jù)造成臟讀的問(wèn)題。分布式系統(tǒng)中數(shù)據(jù)存在一致性的問(wèn)題??!
* ZooKeeper 本質(zhì)上是一個(gè)分布式的小文件存儲(chǔ)系統(tǒng)。 提供基于類似于文件系統(tǒng)的目錄樹(shù)方式的數(shù)
據(jù)存儲(chǔ),并且可以對(duì)樹(shù)中的節(jié)點(diǎn)進(jìn)行有效管理。
* ZooKeeper 提供給客戶端監(jiān)控存儲(chǔ)在zk內(nèi)部數(shù)據(jù)的功能,從而可以達(dá)到基于數(shù)據(jù)的集群管理。 諸
如: 統(tǒng)一命名服務(wù)(dubbo)、分布式配置管理(solr的配置集中管理)、分布式消息隊(duì)列
(sub/pub)、分布式鎖、分布式協(xié)調(diào)等功能。

1.2 zookeeper的架構(gòu)組成

ZooKeeper的架構(gòu)由什么組成

Leader

  • Zookeeper 集群工作的核心角色

  • 集群內(nèi)部各個(gè)服務(wù)器的調(diào)度者。

  • 事務(wù)請(qǐng)求(寫(xiě)操作) 的唯一調(diào)度和處理者,保證集群事務(wù)處理的順序性;對(duì)于 create, setData, delete 等有寫(xiě)操作的請(qǐng)求,則需要統(tǒng)一轉(zhuǎn)發(fā)給leader 處理, leader 需要決定編號(hào)、執(zhí) 行操作,這個(gè)過(guò)程稱為一個(gè)事務(wù)。

Follower

  • 處理客戶端非事務(wù)(讀操作) 請(qǐng)求,

  • 轉(zhuǎn)發(fā)事務(wù)請(qǐng)求給 Leader;

  • 參與集群 Leader 選舉投票 2n-1臺(tái)可以做集群投票。 此外,針對(duì)訪問(wèn)量比較大的 zookeeper 集群, 還可新增觀察者角色。

Observer

  • 觀察者角色,觀察 Zookeeper 集群的最新?tīng)顟B(tài)變化并將這些狀態(tài)同步過(guò)來(lái),其對(duì)于非事務(wù)請(qǐng)求可 以進(jìn)行獨(dú)立處理,對(duì)于事務(wù)請(qǐng)求,則會(huì)轉(zhuǎn)發(fā)給 Leader服務(wù)器進(jìn)行處理。

  • 不會(huì)參與任何形式的投票只提供非事務(wù)服務(wù),通常用于在不影響集群事務(wù)處理能力的前提下提升集 群的非事務(wù)處理能力。增加了集群增加并發(fā)的讀請(qǐng)求。

ZooKeeper的架構(gòu)由什么組成

ZK也是Master/slave架構(gòu),但是與之前不同的是zk集群中的Leader不是指定而來(lái),而是通過(guò)選舉產(chǎn) 生。

1.3 Zookeeper 特點(diǎn)

1. Zookeeper:一個(gè)領(lǐng)導(dǎo)者(leader:老大),多個(gè)跟隨者(follower:小弟)組成的集群。
2. Leader負(fù)責(zé)進(jìn)行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)(內(nèi)部原理) 
3. Follower用于接收客戶請(qǐng)求并向客戶端返回結(jié)果,在選舉Leader過(guò)程中參與投票
4. 集群中只要有半數(shù)以上節(jié)點(diǎn)存活,Zookeeper集群就能正常服務(wù)。
5. 全局?jǐn)?shù)據(jù)一致:每個(gè)server保存一份相同的數(shù)據(jù)副本,Client無(wú)論連接到哪個(gè)server,數(shù)據(jù)都是一
致的。
6. 更新請(qǐng)求順序進(jìn)行(內(nèi)部原理) 
7. 數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功,要么失敗。

2. Zookeeper環(huán)境搭建

2.1 Zookeeper的搭建方式

Zookeeper安裝方式有三種,單機(jī)模式和集群模式以及偽集群模式。
■ 單機(jī)模式:Zookeeper只運(yùn)行在一臺(tái)服務(wù)器上,適合測(cè)試環(huán)境;
■ 偽集群模式:就是在一臺(tái)服務(wù)器上運(yùn)行多個(gè)Zookeeper 實(shí)例;
■ 集群模式:Zookeeper運(yùn)行于一個(gè)集群上,適合生產(chǎn)環(huán)境,這個(gè)計(jì)算機(jī)集群被稱為一個(gè)“集合體”

2.2 Zookeeper集群搭建

下載

  • 首先我們下載穩(wěn)定版本的zookeeper http://zookeeper.apache.org/releases.html

上傳

下載完成后,將zookeeper壓縮包 zookeeper-3.4.14.tar.gz上傳到linux系統(tǒng)/opt/lagou/software

解壓 壓縮包

tar -zxvf zookeeper-3.4.14.tar.gz -C ../servers/

修改配置文件創(chuàng)建data與log目錄

#創(chuàng)建zk存儲(chǔ)數(shù)據(jù)目錄 
mkdir -p /opt/lagou/servers/zookeeper-3.4.14/data
#創(chuàng)建zk日志文件目錄
mkdir -p /opt/lagou/servers/zookeeper-3.4.14/data/logs
#修改zk配置文件 cd /opt/lagou/servers/zookeeper-3.4.14/conf 
#文件改名 mv zoo_sample.cfg zoo.cfg vim zoo.cfg 
#更新datadir dataDir=/opt/lagou/servers/zookeeper-3.4.14/data 
#增加logdir dataLogDir=/opt/lagou/servers/zookeeper-3.4.14/data/logs 
#增加集群配置
##server.服務(wù)器ID=服務(wù)器IP地址:服務(wù)器之間通信端口:服務(wù)器之間投票選舉端口 
server.1=linux121:2888:3888
server.2=linux122:2888:3888 
server.3=linux123:2888:3888 
#打開(kāi)注釋
#ZK提供了自動(dòng)清理事務(wù)日志和快照文件的功能,這個(gè)參數(shù)指定了清理頻率,單位是小時(shí) 
autopurge.purgeInterval=1

ZooKeeper的架構(gòu)由什么組成

添加myid配置

  1. 在zookeeper的 data 目錄下創(chuàng)建一個(gè) myid 文件,內(nèi)容為1,這個(gè)文件就是記錄每個(gè)服務(wù)器的ID

cd /opt/lagou/servers/zookeeper-3.4.14/data 
echo 1 > myid

ZooKeeper的架構(gòu)由什么組成

安裝包分發(fā)并修改myid的值

rsync-script /opt/lagou/servers/zookeeper-3.4.14
修改myid值 linux122
echo 2 >/opt/lagou/servers/zookeeper-3.4.14/data/myid
修改myid值 linux123
echo 3 >/opt/lagou/servers/zookeeper-3.4.14/data/myid
依次啟動(dòng)三個(gè)zk實(shí)例
  • 啟動(dòng)命令(三個(gè)節(jié)點(diǎn)都要執(zhí)行)

/opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh start
  • 查看zk啟動(dòng)情況

/opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh status

ZooKeeper的架構(gòu)由什么組成

  • 集群?jiǎn)?dòng)停止腳本

vim zk.sh 

#!/bin/sh
echo "start zookeeper server..." 
if(($#==0));then 
echo "no params";
exit; 
fi
hosts="linux121 linux122 linux123" 
for host in $hosts 
do
ssh $host "source /etc/profile; /opt/lagou/servers/zookeeper- 3.4.14/bin/zkServer.sh $1" 
done

3. Zookeeper數(shù)據(jù)結(jié)構(gòu)與監(jiān)聽(tīng)機(jī)制

  • ZooKeeper數(shù)據(jù)模型Znode

在ZooKeeper中,數(shù)據(jù)信息被保存在一個(gè)個(gè)數(shù)據(jù)節(jié)點(diǎn)上,這些節(jié)點(diǎn)被稱為znode。ZNode 是
Zookeeper 中最小數(shù)據(jù)單位,在 ZNode 下面又可以再掛 ZNode,這樣一層層下去就形成了一個(gè)層次化
命名空間 ZNode 樹(shù),我們稱為 ZNode Tree,它采用了類似文件系統(tǒng)的層級(jí)樹(shù)狀結(jié)構(gòu)進(jìn)行管理。見(jiàn)下圖
示例:

ZooKeeper的架構(gòu)由什么組成

在 Zookeeper 中,每一個(gè)數(shù)據(jù)節(jié)點(diǎn)都是一個(gè) ZNode,上圖根目錄下有兩個(gè)節(jié)點(diǎn),分別是:app1 和
app2,其中 app1 下面又有三個(gè)子節(jié)點(diǎn),所有ZNode按層次化進(jìn)行組織,形成這么一顆樹(shù),ZNode的節(jié)
點(diǎn)路徑標(biāo)識(shí)方式和Unix文件系統(tǒng)路徑非常相似,都是由一系列使用斜杠(/)進(jìn)行分割的路徑表示,開(kāi)
發(fā)人員可以向這個(gè)節(jié)點(diǎn)寫(xiě)入數(shù)據(jù),也可以在這個(gè)節(jié)點(diǎn)下面創(chuàng)建子節(jié)點(diǎn)。

3.1 ZNode 的類型

剛剛已經(jīng)了解到,Zookeeper的znode tree是由一系列數(shù)據(jù)節(jié)點(diǎn)組成的,那接下來(lái),我們就對(duì)數(shù)據(jù)節(jié)點(diǎn)
做詳細(xì)講解
Zookeeper 節(jié)點(diǎn)類型可以分為三大類:
持久性節(jié)點(diǎn)(Persistent)
臨時(shí)性節(jié)點(diǎn)(Ephemeral)
順序性節(jié)點(diǎn)(Sequential)
在開(kāi)發(fā)中在創(chuàng)建節(jié)點(diǎn)的時(shí)候通過(guò)組合可以生成以下四種節(jié)點(diǎn)類型:持久節(jié)點(diǎn)、持久順序節(jié)點(diǎn)、臨時(shí)節(jié)
點(diǎn)、臨時(shí)順序節(jié)點(diǎn)。不同類型的節(jié)點(diǎn)則會(huì)有不同的生命周期
* 持久節(jié)點(diǎn):是Zookeeper中最常見(jiàn)的一種節(jié)點(diǎn)類型,所謂持久節(jié)點(diǎn),就是指節(jié)點(diǎn)被創(chuàng)建后會(huì)一直存在服務(wù)器,直到刪除操作主動(dòng)清除
* 持久順序節(jié)點(diǎn):就是有順序的持久節(jié)點(diǎn),節(jié)點(diǎn)特性和持久節(jié)點(diǎn)是一樣的,只是額外特性表現(xiàn)在順序上。
順序特性實(shí)質(zhì)是在創(chuàng)建節(jié)點(diǎn)的時(shí)候,會(huì)在節(jié)點(diǎn)名后面加上一個(gè)數(shù)字后綴,來(lái)表示其順序。
* 臨時(shí)節(jié)點(diǎn):就是會(huì)被自動(dòng)清理掉的節(jié)點(diǎn),它的生命周期和客戶端會(huì)話綁在一起,客戶端會(huì)話結(jié)束,節(jié)點(diǎn)
會(huì)被刪除掉。與持久性節(jié)點(diǎn)不同的是,臨時(shí)節(jié)點(diǎn)不能創(chuàng)建子節(jié)點(diǎn)。
* 臨時(shí)順序節(jié)點(diǎn):就是有順序的臨時(shí)節(jié)點(diǎn),和持久順序節(jié)點(diǎn)相同,在其創(chuàng)建的時(shí)候會(huì)在名字后面加上數(shù)字后綴。

* 事務(wù)ID

首先,先了解,事務(wù)是對(duì)物理和抽象的應(yīng)用狀態(tài)上的操作集合。往往在現(xiàn)在的概念中,狹義上的事務(wù)通
常指的是數(shù)據(jù)庫(kù)事務(wù),一般包含了一系列對(duì)數(shù)據(jù)庫(kù)有序的讀寫(xiě)操作,這些數(shù)據(jù)庫(kù)事務(wù)具有所謂的ACID特
性,即原子性(Atomic)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。

而在ZooKeeper中,事務(wù)是指能夠改變ZooKeeper服務(wù)器狀態(tài)的操作,我們也稱之為事務(wù)操作或更新
操作,一般包括數(shù)據(jù)節(jié)點(diǎn)創(chuàng)建與刪除、數(shù)據(jù)節(jié)點(diǎn)內(nèi)容更新等操作。對(duì)于每一個(gè)事務(wù)請(qǐng)求,ZooKeeper都
會(huì)為其分配一個(gè)全局唯一的事務(wù)ID,用 ZXID 來(lái)表示,通常是一個(gè) 64 位的數(shù)字。每一個(gè) ZXID 對(duì)應(yīng)一次
更新操作,從這些ZXID中可以間接地識(shí)別出ZooKeeper處理這些更新操作請(qǐng)求的全局順序
zk中的事務(wù)指的是對(duì)zk服務(wù)器狀態(tài)改變的操作(create,update data,更新字節(jié)點(diǎn));zk對(duì)這些事務(wù)操作都
會(huì)編號(hào),這個(gè)編號(hào)是自增長(zhǎng)的被稱為ZXID。

3.2 ZNode 的狀態(tài)信息

[zk: localhost:2181(CONNECTED) 2] get /zookeeper 
cZxid = 0x0 
ctime = Wed Dec 31 19:00:00 EST 1969 
mZxid = 0x0 
mtime = Wed Dec 31 19:00:00 EST 1969 
pZxid = 0x0 
cversion = -1
dataVersion = 0 
aclVersion = 0 
ephemeralOwner = 0x0
dataLength = 0 
numChildren = 1

整個(gè) ZNode 節(jié)點(diǎn)內(nèi)容包括兩部分:節(jié)點(diǎn)數(shù)據(jù)內(nèi)容和節(jié)點(diǎn)狀態(tài)信息。數(shù)據(jù)內(nèi)容是空,其他的屬于狀態(tài)信 息。那么這些狀態(tài)信息都有什么含義呢?

cZxid 就是 Create ZXID,表示節(jié)點(diǎn)被創(chuàng)建時(shí)的事務(wù)ID。
ctime 就是 Create Time,表示節(jié)點(diǎn)創(chuàng)建時(shí)間。 
mZxid 就是 Modified ZXID,表示節(jié)點(diǎn)最后一次被修改時(shí)的事務(wù)ID。 
mtime 就是 Modified Time,表示節(jié)點(diǎn)最后一次被修改的時(shí)間。 
pZxid 表示該節(jié)點(diǎn)的子節(jié)點(diǎn)列表最后一次被修改時(shí)的事務(wù) ID。只有子節(jié)點(diǎn)列表變更才會(huì)更新 pZxid,子 節(jié)點(diǎn)內(nèi)容變更不會(huì)更新。 
cversion 表示子節(jié)點(diǎn)的版本號(hào)。 
dataVersion 表示內(nèi)容版本號(hào)。 
aclVersion 標(biāo)識(shí)acl版本
ephemeralOwner 表示創(chuàng)建該臨時(shí)節(jié)點(diǎn)時(shí)的會(huì)話 sessionID,如果是持久性節(jié)點(diǎn)那么值為 0 
dataLength 表示數(shù)據(jù)長(zhǎng)度。
numChildren 表示直系子節(jié)點(diǎn)數(shù)。

3.3 Watcher 機(jī)制

Zookeeper使用Watcher機(jī)制實(shí)現(xiàn)分布式數(shù)據(jù)的發(fā)布/訂閱功能

一個(gè)典型的發(fā)布/訂閱模型系統(tǒng)定義了一種 一對(duì)多的訂閱關(guān)系,能夠讓多個(gè)訂閱者同時(shí)監(jiān)聽(tīng)某一個(gè)主題 對(duì)象,當(dāng)這個(gè)主題對(duì)象自身狀態(tài)變化時(shí),會(huì)通知所有訂閱者,使它們能夠做出相應(yīng)的處理。

在 ZooKeeper 中,引入了 Watcher 機(jī)制來(lái)實(shí)現(xiàn)這種分布式的通知功能。ZooKeeper 允許客戶端向服 務(wù)端注冊(cè)一個(gè) Watcher 監(jiān)聽(tīng),當(dāng)服務(wù)端的一些指定事件觸發(fā)了這個(gè) Watcher,那么Zk就會(huì)向指定客戶 端發(fā)送一個(gè)事件通知來(lái)實(shí)現(xiàn)分布式的通知功能。

整個(gè)Watcher注冊(cè)與通知過(guò)程如圖所示。 ZooKeeper的架構(gòu)由什么組成 Zookeeper的Watcher機(jī)制主要包括客戶端線程、客戶端WatcherManager、Zookeeper服務(wù)器三部分。

具體工作流程為:

  • 客戶端在向Zookeeper服務(wù)器注冊(cè)的同時(shí),會(huì)將Watcher對(duì)象存儲(chǔ)在客戶端的WatcherManager當(dāng) 中

  • 當(dāng)Zookeeper服務(wù)器觸發(fā)Watcher事件后,會(huì)向客戶端發(fā)送通知

  • 客戶端線程從WatcherManager中取出對(duì)應(yīng)的Watcher對(duì)象來(lái)執(zhí)行回調(diào)邏輯

4. Zookeeper的基本使用

4.1 ZooKeeper命令行操作

現(xiàn)在已經(jīng)搭建起了一個(gè)能夠正常運(yùn)行的zookeeper服務(wù)了,所以接下來(lái),就是來(lái)借助客戶端來(lái)對(duì) zookeeper的數(shù)據(jù)節(jié)點(diǎn)進(jìn)行操作

首先,進(jìn)入到zookeeper的bin目錄之后

通過(guò)zkClient進(jìn)入zookeeper客戶端命令行

./zkcli.sh 連接本地的zookeeper服務(wù)器
./zkCli.sh -server ip:port(2181) 連接指定的服務(wù)器

連接成功之后,系統(tǒng)會(huì)輸出Zookeeper的相關(guān)環(huán)境及配置信息等信息。輸入help之后,屏幕會(huì)輸出可用 的Zookeeper命令,如下圖所示

[zk: localhost:2181(CONNECTED) 3] help 
ZooKeeper -server host:port cmd args
	stat path [watch] 
	set path data [version] 
	ls path [watch] 
	delquota [-n|-b] path 
	ls2 path [watch] 
	setAcl path acl 
	setquota -n|-b val path 
	history 
	redo cmdno 
	printwatches on|off 
	delete path [version] 
	sync path 
	listquota path 
	rmr path 
	get path [watch] 
	create [-s] [-e] path data acl 
	addauth scheme auth 
	quit 
	getAcl path 
	close 
	connect host:port

感謝各位的閱讀,以上就是“ZooKeeper的架構(gòu)由什么組成”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)ZooKeeper的架構(gòu)由什么組成這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI