日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZooKeeper入门之数据模型和常用命令介绍

發(fā)布時間:2025/3/20 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZooKeeper入门之数据模型和常用命令介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、zookeeper簡介

1.1 什么是zookeeper

zookeeper官網(wǎng):https://zookeeper.apache.org/

ZooKeeper是一個分布式的,開放源碼的分布式應用程序協(xié)調(diào)服務,是Google的Chubby一個開源的實現(xiàn),后來托管到Apache,于2010年11月正式成為Apache的頂級項目。 是Hadoop和Hbase的重要組件。

分布式應用程序可以基于它實現(xiàn)諸如數(shù)據(jù)發(fā)布/訂閱、負載均衡、命名服務、分布式協(xié)調(diào)/通知、集群管理、Master選舉、分布式鎖和分布式隊列等功能。

1.2 應用場景

zookeeper是一個經(jīng)典的分布式數(shù)據(jù)一致性解決方案,致力于為分布式應用提供一個高性能、高可用,且具有嚴格順序訪問控制能力的分布式協(xié)調(diào)存儲服務。

  • 維護配置信息

  • 分布式鎖服務

  • 集群管理

  • 生成分布式唯一ID

1.維護配置信息

java編程經(jīng)常會遇到配置項,比如數(shù)據(jù)庫的url、schema、user和password等。通常這些配置項我們會放置在配置文件中,再將配置文件放置在服務器上當需要更改配置項時,需要去服務器上修改對應的配置文件。但是隨著分布式系統(tǒng)的興起,由于許多服務都需要使用到該配置文件,因此有必須保證該配置服務的高可用性(high availability)和各臺服務器上配置數(shù)據(jù)的一致性。通常會將配置文件部署在一個集群上,然而一個集群動輒上千臺服務器,此時如果再一臺臺服務器逐個修改配置文件那將是非常繁瑣且危險的的操作,因此就需要一種服務,能夠高效快速且可靠地完成配置項的更改等操作,并能夠保證各配置項在每臺服務器上的數(shù)據(jù)一致性。zookeeper就可以提供這樣一種服務,其使用Zab這種一致性協(xié)議來保證一致性。現(xiàn)在有很多開源項目使用zookeeper來維護配置,比如在hbase中,客戶端就是連接一個zookeeper,獲得必要的hbase集群的配置信息,然后才可以進一步操作。還有在開源的消息隊列kafka中,也使用zookeeper來維護broker的信息。在alibaba開源的soa框架dubbo中也廣泛的使用zookeeper管理一些配置來實現(xiàn)服務治理。

2. 分布式鎖服務

一個集群是一個分布式系統(tǒng),由多臺服務器組成。為了提高并發(fā)度和可靠性,多臺服務器上運行著同一種服務。當多個服務在運行時就需要協(xié)調(diào)各服務的進度,有時候需要保證當某個服務在進行某個操作時,其他的服務都不能進行該操作,即對該操作進行加鎖,如果當前機器掛掉后,釋放鎖并fail over 到其他的機器繼續(xù)執(zhí)行該服務。

3. 集群管理

一個集群有時會因為各種軟硬件故障或者網(wǎng)絡故障,出現(xiàn)某些服務器掛掉而被移除集群,而某些服務器加入到集群中的情況,zookeeper會將這些服務器加入/移出的情況通知給集群中的其他正常工作的服務器,以及時調(diào)整存儲和計算等任務的分配和執(zhí)行等。此外zookeeper還會對故障的服務器做出診斷并嘗試修復。

4.生成分布式唯一ID

在過去的單庫單表型系統(tǒng)中,通常可以使用數(shù)據(jù)庫字段自帶的auto_increment屬性來自動為每條記錄生成一個唯一的ID。但是分庫分表后,就無法在依靠數(shù)據(jù)庫的auto_increment屬性來唯一標識一條記錄了。此時我們就可以用zookeeper在分布式環(huán)境下生成全局唯一ID。做法如下:每次要生成一個新Id時,創(chuàng)建一個持久順序節(jié)點,創(chuàng)建操作返回的節(jié)點序號,即為新Id,然后把比自己節(jié)點小的刪除即可

2.zookeeper的數(shù)據(jù)模型

ZooKeeper的數(shù)據(jù)節(jié)點可以視為樹狀結(jié)構(gòu)(或者目錄),樹中的各節(jié)點被稱為znode(即zookeeper node),一個znode可以有多個子節(jié)點。zookeeper節(jié)點在結(jié)構(gòu)上表現(xiàn)為樹狀;使用路徑path來定位某個znode,比如/ns-1/mysql/schema1/table1,此處ns-1、mysql、schema1、table1分別是根節(jié)點、2級節(jié)點以及3級節(jié)點;其中ns-1是mysql的父節(jié)點,mysql是ns-1的子節(jié)點。以此類推。

ZooKeeper的設計適合存儲少量的數(shù)據(jù),并不適合存儲大量數(shù)據(jù),所以znode的存儲限制最大不超過1M。

znode,兼具文件和目錄兩種特點。既像文件一樣維護著數(shù)據(jù)、元信息、ACL、時間戳等數(shù)據(jù)結(jié)構(gòu),又像目錄一樣可以作為路徑標識的一部分。

一個znode大體上分為3各部分:

  • 節(jié)點的數(shù)據(jù):即znode data(節(jié)點path, 節(jié)點data)的關(guān)系就像是java map中(key, value)的關(guān)系

  • 節(jié)點的子節(jié)點children

  • 節(jié)點的狀態(tài)stat:用來描述當前節(jié)點的創(chuàng)建、修改記錄,包括cZxid、ctime等

在zookeeper shell中使用get命令查看指定路徑節(jié)點的data、stat信息:

[zk: localhost:2181(CONNECTED) 5] get /motan/motan-ulive-rpc/com.uxin.zb.slive.service.SliveRoomService null cZxid = 0x50ec459 ctime = Thu Dec 12 20:55:22 CST 2019 mZxid = 0x50ec459 mtime = Thu Dec 12 20:55:22 CST 2019 pZxid = 0x1000bbbd4 cversion = 3 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 3

屬性說明:

狀態(tài)屬性說明
cZxid數(shù)據(jù)節(jié)點創(chuàng)建時的事務 ID
ctime數(shù)據(jù)節(jié)點創(chuàng)建時的時間
mZxid數(shù)據(jù)節(jié)點最后一次更新時的事務 ID
mtime數(shù)據(jù)節(jié)點最后一次更新時的時間
pZxid數(shù)據(jù)節(jié)點的子節(jié)點最后一次被修改時的事務 ID
cversion子節(jié)點的更改次數(shù)
dataVersion節(jié)點數(shù)據(jù)的更改次數(shù)
aclVersion節(jié)點的 ACL 的更改次數(shù)
ephemeralOwner如果節(jié)點是臨時節(jié)點,則表示創(chuàng)建該節(jié)點的會話的 SessionID;如果節(jié)點是持久節(jié)點,則該屬性值為 0
dataLength數(shù)據(jù)內(nèi)容的長度
numChildren數(shù)據(jù)節(jié)點當前的子節(jié)點個數(shù)

3.zookeeper常用shell命令

3.1 新增節(jié)點

create [-s] [-e] path data #其中-s 為有序節(jié)點,-e 臨時節(jié)點 創(chuàng)建持久化節(jié)點并寫入數(shù)據(jù):create /hadoop "123456"

創(chuàng)建持久化有序節(jié)點,此時創(chuàng)建的節(jié)點名為指定節(jié)點名 + 自增序號

[zk: localhost:2181(CONNECTED) 2] create -s /a "aaa" Created /a0000000000 [zk: localhost:2181(CONNECTED) 3] create -s /b "bbb" Created /b0000000001 [zk: localhost:2181(CONNECTED) 4] create -s /c "ccc" Created /c0000000002

創(chuàng)建臨時節(jié)點,臨時節(jié)點會在會話過期后被刪除:

[zk: localhost:2181(CONNECTED) 5] create -e /tmp "tmp" Created /tmp

創(chuàng)建臨時有序節(jié)點,臨時節(jié)點會在會話過期后被刪除:

[zk: localhost:2181(CONNECTED) 6] create -s -e /aa 'aaa' Created /aa0000000004 [zk: localhost:2181(CONNECTED) 7] create -s -e /bb 'bbb' Created /bb0000000005 [zk: localhost:2181(CONNECTED) 8] create -s -e /cc 'ccc' Created /cc0000000006

3.2 更新節(jié)點

更新節(jié)點的命令是 set,可以直接進行修改,如下:

set path data [version]

可以更新某個節(jié)點,也可以指定版本號更新。

[zk: localhost:2181(CONNECTED) 12] set /hadoop "345" cZxid = 0x2 ctime = Sat Oct 10 15:46:18 CST 2020 mZxid = 0xa mtime = Sat Oct 10 15:49:49 CST 2020 pZxid = 0x2 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 0

3.2 刪除節(jié)點

刪除節(jié)點的語法如下:

delete path [version]

和更新節(jié)點數(shù)據(jù)一樣,也可以傳入版本號,當你傳入的數(shù)據(jù)版本號 (dataVersion) 和當前節(jié)點的數(shù)據(jù)版本號不符合時,zookeeper 不會執(zhí)行刪除操作。

該刪除需要該節(jié)點沒有子節(jié)點存在。

[zk: localhost:2181(CONNECTED) 15] delete /hadoop 0 version No is not valid : /hadoop #無效的版本號 [zk: localhost:2181(CONNECTED) 16] delete /hadoop 1

要想刪除某個節(jié)點及其所有后代節(jié)點,可以使用遞歸刪除,命令為 rmr path。

3.3 查看節(jié)點列表

查看節(jié)點列表有 ls path 和 ls2 path 兩個命令,后者是前者的增強,不僅可以查看指定路徑下的所有節(jié)點,還可以查看當前節(jié)點的信息

3.4 監(jiān)聽器get path [watch]

使用 get path [watch] 注冊的監(jiān)聽器能夠在節(jié)點內(nèi)容發(fā)生改變的時候,向客戶端發(fā)出通知。需要注意的是 zookeeper 的觸發(fā)器是一次性的 (One-time trigger),即觸發(fā)一次后就會立即失效。

[zk: localhost:2181(CONNECTED) 4] get /hadoop watch [zk: localhost:2181(CONNECTED) 5] set /hadoop 45678 WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop ?#節(jié)點值改變

3.5 監(jiān)聽器stat path [watch]

使用 stat path [watch] 注冊的監(jiān)聽器能夠在節(jié)點狀態(tài)發(fā)生改變的時候,向客戶端發(fā)出通知

[zk: localhost:2181(CONNECTED) 7] stat /hadoop watch [zk: localhost:2181(CONNECTED) 8] set /hadoop 112233 WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop ?#節(jié)點值改變

3.6 監(jiān)聽器ls || ls2 path [watch]

使用 ls path [watch] 或 ls2 path [watch] 注冊的監(jiān)聽器能夠監(jiān)聽該節(jié)點下所有子節(jié)點的增加和刪除操作。

[zk: localhost:2181(CONNECTED) 9] ls /hadoop watch [] [zk: localhost:2181(CONNECTED) 10] create /hadoop/yarn "aaa" WATCHER:: WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hadoop

4.zookeeper的數(shù)據(jù)一致性

Zab協(xié)議介紹:https://www.jianshu.com/p/2bceacd60b8a

在ensemble集群中follower的update操作會滯后于leader的update完成。事實的結(jié)果使我們在提交更新數(shù)據(jù)之前,不必在每一臺ZooKeeper服務器上執(zhí)行持久化變更數(shù)據(jù),而是僅需在主服務器上執(zhí)行持久化變更數(shù)據(jù)。ZooKeeper客戶端的最佳實踐是全部鏈接到follower上。然而客戶端是有可能連接到leader上的,并且客戶端控制不了這個選擇,甚至客戶端并不知道連接到了follower還是leader。下圖所示, 讀操作向follower請求即可,而寫操作由leader來提交。

?

每一個對znode樹的更新操作,都會被賦予一個全局唯一的ID,我們稱之為zxid(ZooKeeper Transaction ID)。更新操作的ID按照發(fā)生的時間順序升序排序。例如, z1小于 z2,那么 z1的操作就早于 z2操作。

ZooKeeper在數(shù)據(jù)一致性上實現(xiàn)了如下幾個方面:

  • 順序一致性

從客戶端提交的更新操作是按照先后循序排序的。例如,如果一個客戶端將一個znode z賦值為a,然后又將z的值改變成b,那么在這個過程中不會有客戶端在z的值變?yōu)閎后,取到的值是a。

  • 原子性

更新操作的結(jié)果不是失敗就是成功。即,如果更新操作失敗,其他的客戶端是不會知道的。

  • 系統(tǒng)視圖唯一性

無論客戶端連接到哪個服務器,都將看見唯一的系統(tǒng)視圖。如果客戶端在同一個會話中去連接一個新的服務器,那么 他所看見的視圖的狀態(tài)不會比之前服務器上看見的更舊。當ensemble中的一個服務器宕機,客戶端去嘗試連接另外一臺服務器時,如果這臺服務器的狀態(tài)舊于之前宕機的服務器,那么服務器將不會接受客戶端的連接請求,直到服務器的狀態(tài)趕上之前宕機的服務器為止。

  • 持久性

一旦更新操作成功,數(shù)據(jù)將被持久化到服務器上,并且不能撤銷。所以服務器宕機重啟,也不會影響數(shù)據(jù)。

  • 時效性

系統(tǒng)視圖的狀態(tài)更新的延遲時間是有一個上限的,最多不過幾十秒。如果服務器的狀態(tài)落后于其他服務器太多,ZooKeeper會寧可關(guān)閉這個服務器上的服務,強制客戶端去連接一個狀態(tài)更新的服務器。

總結(jié)

以上是生活随笔為你收集整理的ZooKeeper入门之数据模型和常用命令介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。