zkcli远程连接_ZooKeeper 学习笔记(二)-API 操作和应用
客戶端
znode 可能含有數(shù)據(jù),也可能沒(méi)有。如果 znode 包含數(shù)據(jù),那么數(shù)據(jù)存儲(chǔ)為字節(jié)數(shù)組(byte array)。字節(jié)數(shù)組的具體格式特定于每個(gè)應(yīng)用的實(shí)現(xiàn),ZooKeeper 不直接 提供解析支持。不過(guò)一般情況下,以 UTF-8 或 ASCII 編碼的字符串就已經(jīng)夠用了。
API 概述
ZooKeeper 的 API 可以抽象成以下方法:
create /path data
創(chuàng)建一個(gè)名為 /path 的 znode 節(jié)點(diǎn),并包含數(shù)據(jù) data
delete /path
刪除名為 /path 的 znode
exists /path
檢查是否存在名為 /path 的節(jié)點(diǎn)
setData /path data
設(shè)置名為 /path 節(jié)點(diǎn)數(shù)據(jù)為 data
getData /path
返回名為 /path 節(jié)點(diǎn)的所有子節(jié)點(diǎn)列表
需要注意的是,ZooKepper 并不允許局部寫入或讀取 znode 節(jié)點(diǎn)的數(shù)據(jù)。當(dāng)設(shè)置一個(gè) znode 節(jié)點(diǎn)的數(shù)據(jù)或讀取時(shí),znode 節(jié)點(diǎn)的內(nèi)容會(huì)被整個(gè)替換或者全部讀取。
zkCli.sh
ZooKeeper 安裝包提供了客戶端工具 zkCli.sh(zkCli.cmd)方便我們學(xué)習(xí)實(shí)驗(yàn) API 接口,該工具位于 bin 目錄下,啟動(dòng)命令格式為:
bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
后面一段“127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183”是 ZooKeeper 集群的 IP 和端口組成的字符串,客戶端會(huì)以隨機(jī)順序連接到服務(wù)器中。連接上集群后,如下圖顯示:
zkCli 連接成功
其中 0x15a0d2841340001 是本次 session 的 id。
這兒簡(jiǎn)單的演示臨時(shí)節(jié)點(diǎn)和監(jiān)視點(diǎn)特性:
同時(shí)開兩個(gè) zkCli 分別為 A,B;
A 連接至 127.0.0.1:2181
A連接到 ZooKeeper 集群
B 連接至 127.0.0.1:2182。
B連接到 ZooKeeper 集群
A 創(chuàng)建臨時(shí)節(jié)點(diǎn):create -e /temp_a "temp a znode"
A 創(chuàng)建節(jié)點(diǎn)
B 查看節(jié)點(diǎn)數(shù)據(jù)并設(shè)置監(jiān)控點(diǎn):get /temp_a true
B 查看節(jié)點(diǎn)
A 關(guān)閉模擬客戶端崩潰。
A 創(chuàng)建的臨時(shí)節(jié)點(diǎn)被刪除
A 關(guān)閉連接
因?yàn)楸O(jiān)視點(diǎn)的設(shè)置,B 收到 /temp_a 刪除通知
B 收到刪除通知
開源客戶端庫(kù)
zkCli 只適合學(xué)習(xí)和試驗(yàn) ZooKeeper 集群,如果我們需要利用 ZooKeeper 實(shí)際開發(fā)分布式協(xié)同任務(wù)的系統(tǒng)時(shí),可以使用 ZooKeeper 自帶的客戶端庫(kù)。不過(guò)這些 jar 包只提供基本的阻塞和非阻塞 API 接口,需要開發(fā)人員自己實(shí)現(xiàn)類似會(huì)話超時(shí)重連,重復(fù)設(shè)置監(jiān)視點(diǎn)等功能。除了 ZooKeeper 自帶的客戶端包,還可以使用以下客戶端模塊。
zkClient
zkClient 是 Github 上一個(gè)開源的 ZooKeeper 客戶端,是由 Datameer的工程師 Stefan Groschupf 和 Peter Voss 一起開發(fā)的。zkClient 在原生 API 上進(jìn)行封裝,是一個(gè)更簡(jiǎn)單易用的 ZooKeeper 客戶端。同時(shí),zkClient 在內(nèi)部實(shí)現(xiàn)了諸如 session 超時(shí)重練,Watcher 反復(fù)注冊(cè)等功能,使這些繁瑣復(fù)雜的功能對(duì)開發(fā)人員透明。
Curator
Curator 是 Netflix 公司開源的一套 ZooKeeper 客戶端框架,和 zkClient 一樣,Curator 解決了很多 ZooKeeper 客戶端非常底層的細(xì)節(jié)開發(fā)工作,目前已成為 Apache 的頂級(jí)項(xiàng)目,是全世界范圍內(nèi)使用最廣泛的 ZooKeeper 客戶端之一。
除了封裝底層細(xì)節(jié),使之對(duì)開發(fā)透明,Curator 還提供了一套易用性和可讀性更強(qiáng)的 Fluent 風(fēng)格的 API 框架。
除此之外,Curator 還提供餓了 ZooKeeper 各種應(yīng)用場(chǎng)景的抽象封裝(Recipe),如共享鎖服務(wù),Master 選舉機(jī)制和分布式計(jì)數(shù)器等。
典型應(yīng)用
需要再次說(shuō)明 ZooKeeper 是保證分布式數(shù)據(jù)一致性和任務(wù)協(xié)調(diào)的框架,它并不會(huì)直接實(shí)現(xiàn)具體的分布式鎖,Master 選舉等分布式功能,而是提供一些簡(jiǎn)單易用的 API 接口,具體的功能實(shí)現(xiàn)需要開發(fā)者根據(jù)情況自行實(shí)現(xiàn)。另一方面,ZooKeeper 同時(shí)也是一個(gè)典型的發(fā)布/訂閱模式的分布式數(shù)據(jù)管理與協(xié)調(diào)方案,配合監(jiān)視點(diǎn)事件通知機(jī)制,可以非常方便地構(gòu)建一些列分布式應(yīng)用中都會(huì)涉及的核心功能:
數(shù)據(jù)發(fā)布/訂閱
負(fù)載均衡
命名服務(wù)
分布式協(xié)調(diào)/通知
集群管理
Master 選舉
分布式鎖
分布式隊(duì)列
下面簡(jiǎn)單介紹下分布式鎖的實(shí)現(xiàn)思路。
分布式鎖
假設(shè)一個(gè)應(yīng)用由 n 個(gè)進(jìn)程組成,分別為 p1, p2 .... pn,這些進(jìn)程嘗試獲取一個(gè)鎖從而進(jìn)入臨界區(qū)進(jìn)行操作。這兒我們可以使用 ZooKeeper 的 znode 來(lái)代表一個(gè)鎖,如“/lock”。
所有進(jìn)程同時(shí)嘗試創(chuàng)建這個(gè) znode,由 ZooKeeper 來(lái)保證順序性。
如果某進(jìn)程成功創(chuàng)建了 “/lock”,假設(shè)為 p4,則代表 p4 搶占到了該分布式鎖,p4 可以執(zhí)行臨界區(qū)代碼,其他進(jìn)程則會(huì)因?yàn)?znode 存在而創(chuàng)建失敗。
它們可以在 “/lock”節(jié)點(diǎn)上創(chuàng)建監(jiān)視器后等待 znode 刪除通知,如果刪除通知到來(lái),則重復(fù) 1 搶占鎖。
p4 釋放鎖時(shí),刪除 “/lock”節(jié)點(diǎn)即可,需要注意,因?yàn)?p4 很可能執(zhí)行臨界區(qū)代碼時(shí)崩潰,所以“/lock”節(jié)點(diǎn)應(yīng)該臨時(shí)節(jié)點(diǎn),如果 p4 崩潰,則該節(jié)點(diǎn)自行刪除。
羊群效應(yīng)
上述分布式鎖的實(shí)現(xiàn)簡(jiǎn)單易用,但是卻會(huì)造成“羊群效應(yīng)”。想象一下,如果有 1000 個(gè)客戶端同時(shí)調(diào)用 exists 監(jiān)視“/lock”節(jié)點(diǎn)變化。那么當(dāng)這個(gè) znode 創(chuàng)建或刪除時(shí)就會(huì)發(fā)送 1000 個(gè)通知,這個(gè)被監(jiān)視的 znode 的一個(gè)變化會(huì)產(chǎn)生一個(gè)尖峰的通知,該尖峰時(shí)刻提交的操作可能會(huì)產(chǎn)生很高的延遲。
為了防止羊群效應(yīng)的產(chǎn)生,利用有序節(jié)點(diǎn),分布式鎖不妨換一種實(shí)現(xiàn)方式:
系統(tǒng)已經(jīng)存在“/lock”節(jié)點(diǎn),爭(zhēng)搶鎖的進(jìn)程在該節(jié)點(diǎn)下創(chuàng)建臨時(shí)有序子節(jié)點(diǎn),形如:/lock/192.168.1.200:2222-00000001;
進(jìn)程獲取 /lock 下子節(jié)點(diǎn)列表,判斷自己的節(jié)點(diǎn)位置:
如果自己的節(jié)點(diǎn)序號(hào)最小,則表示獲得鎖,執(zhí)行臨界區(qū)代碼;
如果不是,則在自己序號(hào)前一個(gè)子節(jié)點(diǎn)增加監(jiān)視點(diǎn) Watcher,等待刪除通知。
獲取鎖的進(jìn)程,執(zhí)行外臨界代碼,刪除自己的子節(jié)點(diǎn),表示釋放鎖;
下一個(gè)子節(jié)點(diǎn)序號(hào)的進(jìn)程獲取刪除通知,重復(fù)動(dòng)作 2。
這種實(shí)現(xiàn)方式下,進(jìn)程只監(jiān)測(cè)排在它前面進(jìn)程的節(jié)點(diǎn),而不是 所有進(jìn)程都監(jiān)測(cè) /lock 節(jié)點(diǎn),避免了“羊群效應(yīng)”。結(jié)構(gòu)如下圖所示:
分布式鎖
ZooKeeper 和 Dubbo
Dubbo 是阿里巴巴開源(好像開源版本已經(jīng)停止更新)的由 Java 語(yǔ)言編寫的分布式服務(wù)框架,致力于提供高性能和透明化的遠(yuǎn)程服務(wù)調(diào)用方案和 SOA 服務(wù)治理方案。
Dubbo 基于 ZooKeeper 實(shí)現(xiàn)服務(wù)注冊(cè)中心。注冊(cè)中心是 RPC 框架最核心的模塊之一,用于服務(wù)的注冊(cè)和訂閱。在 Dubbo 的實(shí)現(xiàn)中,對(duì)注冊(cè)中心模塊進(jìn)行抽象封裝,因此可以基于其提供的外部接口實(shí)現(xiàn)各種不同類型的注冊(cè)中心,例如數(shù)據(jù)庫(kù),Redis 等。
在 Dubbo 注冊(cè)中心的整體架構(gòu)中,ZooKeeper 上服務(wù)的節(jié)點(diǎn)設(shè)計(jì)如下圖所示:
分布式鎖
/dubbo 這是 Dubbo 在 ZooKeeper 上創(chuàng)建的根節(jié)點(diǎn)
/dubbo/com.foo.BarService 是服務(wù)節(jié)點(diǎn),代表了 Dubbo 的一個(gè)服務(wù)
/dubbo/com.foo.BarService/providers 這是服務(wù)提供者的根節(jié)點(diǎn),其子節(jié)點(diǎn)代表每一個(gè)服務(wù)真正提供者
/dubbo/com.foo.BarService/consumers 這是服務(wù)消費(fèi)者的根節(jié)點(diǎn),其子節(jié)點(diǎn)代表每一個(gè)服務(wù)的真正消費(fèi)者
流程說(shuō)明:
服務(wù)提供者(Provider)啟動(dòng)
向 /dubbo/com.foo.BarService/providers 目錄下寫入自己的URL地址。
服務(wù)消費(fèi)者(Consumer)啟動(dòng)時(shí)
訂閱 /dubbo/com.foo.BarService/providers 目錄下的提供者URL地址。
并向 /dubbo/com.foo.BarService/consumers 目錄下寫入自己的URL地址。
監(jiān)控中心(Monitor)啟動(dòng)時(shí)
訂閱 /dubbo/com.foo.BarService 目錄下的所有提供者和消費(fèi)者URL地址。
需要注意的是,所有提供者和消費(fèi)者在 ZooKeeper 上創(chuàng)建的節(jié)點(diǎn)都是臨時(shí)節(jié)點(diǎn),利用臨時(shí)節(jié)點(diǎn)生命周期和會(huì)話綁定的特性,一旦機(jī)器發(fā)生故障導(dǎo)致服務(wù)提供者無(wú)法對(duì)外提供服務(wù),該臨時(shí)節(jié)點(diǎn)就會(huì)自動(dòng)從 ZooKeeper 上刪除。
內(nèi)容來(lái)源
從 Paxos 到 ZooKeeper 分布式一致性原理與實(shí)踐
ZooKeeper 分布式過(guò)程協(xié)同技術(shù)詳解
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的zkcli远程连接_ZooKeeper 学习笔记(二)-API 操作和应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: access 战地1不加入ea_战地1正
- 下一篇: mongodb 服务器时区设置_关于Mo