zookeeper簡介

序言

??Apache ZooKeeper是由集群(節(jié)點組)使用的一種服務(wù)瘟判,用于在自身之間協(xié)調(diào)怨绣,并通過穩(wěn)健的同步技術(shù)維護共享數(shù)據(jù)。ZooKeeper本身是一個分布式應(yīng)用程序拷获,為寫入分布式應(yīng)用程序提供服務(wù)篮撑。

1.zookeeper特性

  • 一致性:數(shù)據(jù)一致性,數(shù)據(jù)按照順序分批入庫匆瓜。
  • 原子性:事務(wù)要么成功要么失敗赢笨,不會局部化未蝌。
  • 單一視圖:客戶端連接集群中任一zk節(jié)點,數(shù)據(jù)都是一致的茧妒。
  • 可靠性:每次對zk的操作狀態(tài)都會保存在服務(wù)端萧吠。
  • 實時性:客戶端可以讀取到zk服務(wù)器的最新數(shù)據(jù)。

2.zookeeper應(yīng)用場景

2.1 數(shù)據(jù)發(fā)布與訂閱

??發(fā)布與訂閱即所謂的配置管理桐筏,顧名思義就是有系統(tǒng)將數(shù)據(jù)發(fā)布到zk節(jié)點上纸型,供訂閱者動態(tài)獲取數(shù)據(jù),實現(xiàn)配置信息的集中式管理和動態(tài)更新梅忌。例如全局的配置信息狰腌,地址列表等就非常適合使用。(Diamond和ConfigServer在這方面也具備功能)

應(yīng)用中的具體使用

  • 索引信息和集群中機器節(jié)點狀態(tài)存放在zk的一些指定節(jié)點牧氮,供各個客戶端使用;
  • 系統(tǒng)日志(經(jīng)過處理后的)存儲琼腔,這些日志通常2-3天后被清除;
  • 應(yīng)用中用到的一些配置信息集中管理,在應(yīng)用啟動的時候主動來獲取一次踱葛,并且在節(jié)點上注冊一個Watcher丹莲,以后每次配置有更新,實時通知到應(yīng)用剖毯。
  • 業(yè)務(wù)邏輯中需要用到的一些全局變量圾笨,比如一些消息中間件的消息隊列通常有個offset,這個offset存放在zk上逊谋,這樣集群中每個發(fā)送者都能知道當(dāng)前的發(fā)送進度
  • 系統(tǒng)中有些信息需要動態(tài)獲取擂达,并且還會存在人工手動去修改這個信息。以前通常是暴露出接口胶滋,例如JMX接口板鬓,有了zk后,只要將這些信息存放到zk節(jié)點上即可究恤。

2.2 分布通知/協(xié)調(diào)

??ZooKeeper中特有watcher注冊異步通知機制俭令,能夠很好的實現(xiàn)分布式環(huán)境下不同系統(tǒng)之間的通知與協(xié)調(diào),實現(xiàn)對數(shù)據(jù)變更的實時處理部宿。

??使用方法:通常是不同系統(tǒng)都對ZK上同一個znode進行注冊抄腔,監(jiān)聽znode的變化(包括znode本身內(nèi)容及子節(jié)點的),其中一個系統(tǒng)update了znode理张,那么另一個系統(tǒng)能夠收到通知赫蛇,并作出相應(yīng)處理。

2.3 分布式鎖

??分布式鎖雾叭,這個主要得益于ZooKeeper為我們保證了強一致性悟耘,即用戶只要完全信任每時每刻,zk集群中任意節(jié)點(一個zk server)上的相同znode的數(shù)據(jù)是一定是相同的织狐。

鎖服務(wù)可以分為兩類: 一個是保持獨占暂幼,另一個是控制時序筏勒。

2.4 集群管理

Hbase Master選舉則是zookeeper經(jīng)典的使用場景;
Storm集群管理;

2.5 分布式隊列

3. Zookeeper架構(gòu)(Architecture)

看看下面的圖表旺嬉。它描述了ZooKeeper的“客戶端-服務(wù)器架構(gòu)”管行。

客戶端-服務(wù)器架構(gòu).png

作為ZooKeeper架構(gòu)的一部分的每個組件在下表中進行了說明。

部分 描述
Client(客戶端) 客戶端鹰服,我們的分布式應(yīng)用集群中的一個節(jié)點病瞳,從服務(wù)器訪問信息揽咕。對于特定的時間間隔悲酷,每個客戶端向服務(wù)器發(fā)送消息以使服務(wù)器知道客戶端是活躍的。類似地亲善,當(dāng)客戶端連接時设易,服務(wù)器發(fā)送確認(rèn)碼。如果連接的服務(wù)器沒有響應(yīng)蛹头,客戶端會自動將消息重定向到另一個服務(wù)器顿肺。
Server(服務(wù)器) 服務(wù)器,我們的ZooKeeper總體中的一個節(jié)點渣蜗,為客戶端提供所有的服務(wù)屠尊。向客戶端發(fā)送確認(rèn)碼以告知服務(wù)器是活躍的。
Ensemble ZooKeeper服務(wù)器組耕拷。形成ensemble所需的最小節(jié)點數(shù)為3讼昆。
Leader 服務(wù)器節(jié)點,如果任何連接的節(jié)點失敗骚烧,則執(zhí)行自動恢復(fù)浸赫。Leader在服務(wù)啟動時被選舉。
Follower 跟隨leader指令的服務(wù)器節(jié)點赃绊。

4.Zookeeper層次命名空間

下圖描述了用于內(nèi)存表示的ZooKeeper文件系統(tǒng)的樹結(jié)構(gòu)既峡。ZooKeeper節(jié)點稱為 znode 。每個znode由一個名稱標(biāo)識碧查,并用路徑(/)序列分隔运敢。

  • 在圖中,首先有一個由“/”分隔的znode忠售。在根目錄下传惠,你有兩個邏輯命名空間 configworkers
  • config 命名空間用于集中式配置管理档痪,workers 命名空間用于命名涉枫。
  • config 命名空間下,每個znode最多可存儲1MB的數(shù)據(jù)腐螟。這與UNIX文件系統(tǒng)相類似愿汰,除了父znode也可以存儲數(shù)據(jù)困后。這種結(jié)構(gòu)的主要目的是存儲同步數(shù)據(jù)并描述znode的元數(shù)據(jù)则酝。此結(jié)構(gòu)稱為 ZooKeeper數(shù)據(jù)模型晋辆。
ZooKeeper數(shù)據(jù)模型.png

ZooKeeper數(shù)據(jù)模型中的每個znode都維護著一個 stat 結(jié)構(gòu)。一個stat僅提供一個znode的元數(shù)據(jù)西潘。它由版本號吗跋,操作控制列表(ACL)侧戴,時間戳數(shù)據(jù)長度組成。

  • 版本號: 每個znode都有版本號跌宛,這意味著每當(dāng)與znode相關(guān)聯(lián)的數(shù)據(jù)發(fā)生變化時酗宋,其對應(yīng)的版本號也會增加。當(dāng)多個zookeeper客戶端嘗試在同一znode上執(zhí)行操作時疆拘,版本號的使用就很重要蜕猫。
  • 操作控制列表(ACL): ACL基本上是訪問znode的認(rèn)證機制。它管理所有znode讀取和寫入操作哎迄。
  • 時間戳: 時間戳表示創(chuàng)建和修改znode所經(jīng)過的時間回右。它通常以毫秒為單位。ZooKeeper從“事務(wù)ID"(zxid)標(biāo)識znode的每個更改漱挚。Zxid 是唯一的翔烁,并且為每個事務(wù)保留時間,以便你可以輕松地確定從一個請求到另一個請求所經(jīng)過的時間旨涝。
  • 數(shù)據(jù)長度: 存儲在znode中的數(shù)據(jù)總量是數(shù)據(jù)長度蹬屹。你最多可以存儲1MB的數(shù)據(jù)。

Znode的類型

Znode被分為持久(persistent)節(jié)點颊糜,順序(sequential)節(jié)點臨時(ephemeral)節(jié)點哩治。

  • 持久節(jié)點: 即使在創(chuàng)建該特定znode的客戶端斷開連接后,持久節(jié)點仍然存在衬鱼。默認(rèn)情況下业筏,除非另有說明,否則所有znode都是持久的鸟赫。
  • 臨時節(jié)點: 客戶端活躍時蒜胖,臨時節(jié)點就是有效的。當(dāng)客戶端與ZooKeeper集合斷開連接時抛蚤,臨時節(jié)點會自動刪除台谢。注意: 因此,只有臨時節(jié)點不允許有子節(jié)點岁经。如果臨時節(jié)點被刪除朋沮,則下一個合適的節(jié)點將填充其位置。臨時節(jié)點在leader選舉中起著重要作用缀壤。
  • 順序節(jié)點: 順序節(jié)點可以是持久的或臨時的樊拓。當(dāng)一個新的znode被創(chuàng)建為一個順序節(jié)點時纠亚,ZooKeeper通過將10位的序列號附加到原始名稱來設(shè)置znode的路徑。例如筋夏,如果將具有路徑 /myapp 的znode創(chuàng)建為順序節(jié)點蒂胞,則ZooKeeper會將路徑更改為 /myapp0000000001 ,并將下一個序列號設(shè)置為0000000002条篷。如果兩個順序節(jié)點是同時創(chuàng)建的骗随,那么ZooKeeper不會對每個znode使用相同的數(shù)字。順序節(jié)點在鎖定和同步中起重要作用赴叹。

5. Sessions(會話)

會話對于ZooKeeper的操作非常重要鸿染。會話中的請求按FIFO順序執(zhí)行。一旦客戶端連接到服務(wù)器稚瘾,將建立會話并向客戶端分配會話ID 牡昆。

客戶端以特定的時間間隔發(fā)送心跳以保持會話有效姚炕。如果ZooKeeper集合在超過服務(wù)器開啟時指定的期間(會話超時)都沒有從客戶端接收到心跳摊欠,則它會判定客戶端死機。

會話超時通常以毫秒為單位柱宦。當(dāng)會話由于任何原因結(jié)束時些椒,在該會話期間創(chuàng)建的臨時節(jié)點也會被刪除。

6 Watches(監(jiān)視)

監(jiān)視是一種簡單的機制掸刊,使客戶端收到關(guān)于ZooKeeper集合中的更改的通知免糕。客戶端可以在讀取特定znode時設(shè)置Watches忧侧。Watches會向注冊的客戶端發(fā)送任何znode(客戶端注冊表)更改的通知石窑。

Znode更改: 是與znode相關(guān)的數(shù)據(jù)的修改或znode的子項中的更改。
只觸發(fā)一次watches: 如果客戶端想要再次通知蚓炬,則必須通過另一個讀取操作來完成松逊。
連接會話過期時: 客戶端將與服務(wù)器斷開連接,相關(guān)的watches也將被刪除肯夏。

7. Zookeeper 工作流

ZAB協(xié)議

Zookeeper的核心是原子廣播,這個機制保證了各個Server之間的同步经宏。實現(xiàn)這個機制的協(xié)議叫做Zab協(xié)議.

Zab協(xié)議有兩種模式,它們分別是恢復(fù)模式(選主:leader election)廣播模式(同步:Atomic broadcast)驯击。
當(dāng)服務(wù)啟動或者在領(lǐng)導(dǎo)者崩潰后烁兰,Zab就進入了恢復(fù)模式,當(dāng)領(lǐng)導(dǎo)者被選舉出來徊都,且大多數(shù)Server完成了和leader的狀態(tài)同步以后,恢復(fù)模式就結(jié)束了沪斟。狀態(tài)同步保證了leader和Server具有相同的系統(tǒng)狀態(tài)。

paxos算法

在一個分布式數(shù)據(jù)庫系統(tǒng)中暇矫,如果各節(jié)點的初始狀態(tài)一致主之,每個節(jié)點都執(zhí)行相同的操作序列轨域,那么他們最后能得到一個一致的狀態(tài);

Paxos算法解決的什么問題

解決的就是保證每個節(jié)點執(zhí)行相同的操作序列。好吧杀餐,這還不簡單干发,master維護一個全局寫隊列,所有寫操作都必須 放入這個隊列編號史翘,那么無論我們寫多少個節(jié)點枉长,只要寫操作是按編號來的,就能保證一致性琼讽。

Paxos算法通過投票來對寫操作進行全局編號必峰,同一時刻,只有一個寫操作被批準(zhǔn)钻蹬,同時并發(fā)的寫操作要去爭取選票吼蚁,只有獲得過半數(shù)選票的寫操作才會被 批準(zhǔn)(所以永遠(yuǎn)只會有一個寫操作得到批準(zhǔn)),其他的寫操作競爭失敗只好再發(fā)起一輪投票问欠,就這樣肝匆,在日復(fù)一日年復(fù)一年的投票中,所有寫操作都被嚴(yán)格編號排 序顺献。編號嚴(yán)格遞增旗国,當(dāng)一個節(jié)點接受了一個編號為100的寫操作,之后又接受到編號為99的寫操作(因為網(wǎng)絡(luò)延遲等很多不可預(yù)見原因)注整,它馬上能意識到自己 數(shù)據(jù)不一致了能曾,自動停止對外服務(wù)并重啟同步過程。任何一個節(jié)點掛掉都不會影響整個集群的數(shù)據(jù)一致性(總2n+1臺肿轨,除非掛掉大于n臺)寿冕。

ZooKeeper集合啟動,它將等待客戶端連接椒袍⊥粘客戶端將連接到ZooKeeper集合中的一個節(jié)點。它可以是leader或follower節(jié)點槐沼。一旦客戶端被連接曙蒸,節(jié)點將向特定客戶端分配會話ID并向該客戶端發(fā)送確認(rèn)。如果客戶端沒有收到確認(rèn)岗钩,它將嘗試連接ZooKeeper集合中的另一個節(jié)點纽窟。 一旦連接到節(jié)點,客戶端將以有規(guī)律的間隔向節(jié)點發(fā)送心跳兼吓,以確保連接不會丟失臂港。

  • 如果客戶端想要讀取特定的znode,它將會向具有znode路徑的節(jié)點發(fā)送讀取請求,并且節(jié)點通過從其自己的數(shù)據(jù)庫獲取來返回所請求的znode审孽。為此县袱,在ZooKeeper集合中讀取速度很快。
  • 如果客戶端想要將數(shù)據(jù)存儲在ZooKeeper集合中佑力,則會將znode路徑和數(shù)據(jù)發(fā)送到服務(wù)器式散。連接的服務(wù)器將該請求轉(zhuǎn)發(fā)給leader,然后leader將向所有的follower重新發(fā)出寫入請求打颤。如果只有大部分節(jié)點成功響應(yīng)暴拄,而寫入請求成功,則成功返回代碼將被發(fā)送到客戶端编饺。 否則乖篷,寫入請求失敗。絕大多數(shù)節(jié)點被稱為 Quorum 透且。

下圖描述了ZooKeeper工作流撕蔼,后面的表說明了它的不同組件。

ZooKeeper工作流.png
組件 描述
寫入(write) 寫入過程由leader節(jié)點處理秽誊。leader將寫入請求轉(zhuǎn)發(fā)到所有znode鲸沮,并等待znode的回復(fù)。如果一半的znode回復(fù)养距,則寫入過程完成诉探。
讀取(read) 讀取由特定連接的znode在內(nèi)部執(zhí)行,因此不需要與集群進行交互棍厌。
復(fù)制數(shù)據(jù)庫(replicated database) 它用于在zookeeper中存儲數(shù)據(jù)。每個znode都有自己的數(shù)據(jù)庫竖席,每個znode在一致性的幫助下每次都有相同的數(shù)據(jù)耘纱。
Leader Leader是負(fù)責(zé)處理寫入請求的Znode。
Follower follower從客戶端接收寫入請求毕荐,并將它們轉(zhuǎn)發(fā)到leader znode束析。
請求處理器(request processor) 只存在于leader節(jié)點。它管理來自follower節(jié)點的寫入請求憎亚。
原子廣播(atomic broadcasts) 負(fù)責(zé)廣播從leader節(jié)點到follower節(jié)點的變化员寇。

ZooKeeper集合中的節(jié)點

分析在ZooKeeper集合中擁有不同數(shù)量的節(jié)點的效果。

  • 如果我們有單個節(jié)點第美,則當(dāng)該節(jié)點故障時蝶锋,ZooKeeper集合將故障。它有助于“單點故障"什往,不建議在生產(chǎn)環(huán)境中使用扳缕。
  • 如果我們有兩個節(jié)點而一個節(jié)點故障,我們沒有占多數(shù),因為兩個中的一個不是多數(shù)躯舔。
  • 如果我們有三個節(jié)點而一個節(jié)點故障驴剔,那么我們有大多數(shù),因此粥庄,這是最低要求丧失。ZooKeeper集合在實際生產(chǎn)環(huán)境中必須至少有三個節(jié)點。
  • 如果我們有四個節(jié)點而兩個節(jié)點故障惜互,它將再次故障利花。類似于有三個節(jié)點,額外節(jié)點不用于任何目的载佳,因此炒事,最好添加奇數(shù)的節(jié)點,例如3蔫慧,5挠乳,7。

我們知道寫入過程比ZooKeeper集合中的讀取過程要貴姑躲,因為所有節(jié)點都需要在數(shù)據(jù)庫中寫入相同的數(shù)據(jù)睡扬。因此,對于平衡的環(huán)境擁有較少數(shù)量(例如3黍析,5卖怜,7)的節(jié)點比擁有大量的節(jié)點要好

8. Zookeeper leader選舉

讓我們分析如何在ZooKeeper集合中選舉leader節(jié)點〔妫考慮一個集群中有N個節(jié)點马靠。leader選舉的過程如下:

  • 1.所有節(jié)點創(chuàng)建具有相同路徑 /app/leader_election/guid_ 的順序臨時節(jié)點蔼两。
  • 2.ZooKeeper集合將附加10位序列號到路徑甩鳄,創(chuàng)建的znode將是 /app/leader_election/guid_0000000001,/app/leader_election/guid_0000000002等额划。
  • 3.對于給定的實例妙啃,在znode中創(chuàng)建最小數(shù)字的節(jié)點成為leader,而所有其他節(jié)點是follower俊戳。
  • 4.每個follower節(jié)點監(jiān)視下一個具有最小數(shù)字的znode揖赴。例如,創(chuàng)建znode/app/leader_election/guid_0000000008的節(jié)點將監(jiān)視znode/app/leader_election/guid_0000000007抑胎,創(chuàng)建znode/app/leader_election/guid_0000000007的節(jié)點將監(jiān)視znode/app/leader_election/guid_0000000006燥滑。
  • 5.如果leader關(guān)閉,則其相應(yīng)的znode/app/leader_electionN會被刪除圆恤。
  • 6.下一個在線follower節(jié)點將通過監(jiān)視器獲得關(guān)于leader移除的通知突倍。
  • 7.下一個在線follower節(jié)點將檢查是否存在其他具有最小數(shù)字的znode腔稀。如果沒有,那么它將承擔(dān)leader的角色羽历。否則焊虏,它找到的創(chuàng)建具有最小數(shù)字的znode的節(jié)點將作為leader。
  • 8.類似地秕磷,所有其他follower節(jié)點選舉創(chuàng)建具有最小數(shù)字的znode的節(jié)點作為leader诵闭。

leader選舉是一個復(fù)雜的過程,但ZooKeeper服務(wù)使它非常簡單澎嚣。

9.Zookeeper Cli

ZooKeeper命令行界面(CLI): 用于與ZooKeeper集合進行交互以進行開發(fā)疏尿。它有助于調(diào)試和解決不同的選項。

要執(zhí)行ZooKeeper CLI操作易桃,首先打開ZooKeeper服務(wù)器(“bin/zkServer.sh start”)褥琐,然后打開ZooKeeper客戶端(“bin/zkCli.sh”)。一旦客戶端啟動晤郑,你可以執(zhí)行以下操作:

執(zhí)行功能 語法 特點
創(chuàng)建znode 持久節(jié)點 create /path /data
順序節(jié)點 create -s /path /data
臨時節(jié)點 create -e /path /data
順序節(jié)點: 保證znode路徑將是唯一的
臨時節(jié)點: 當(dāng)會話過期或客戶端斷開連接時敌呈,臨時節(jié)點將被自動刪除。
獲取數(shù)據(jù) get /path
順序節(jié)點: 訪問時必須輸入znode的完整路徑造寝。eg:get /FirstZnode0000000001
監(jiān)視znode的變化 get /path [watch] 1 eg:get /FirstZnode 1 當(dāng)指定的znode或znode的子數(shù)據(jù)更改時磕洪,監(jiān)視器會顯示通知。你只能在 get 命令中設(shè)置watch诫龙。
輸出類似于普通的 get 命令析显,但它會等待后臺等待znode更改。
設(shè)置數(shù)據(jù) set /path /data 如果此znote節(jié)點設(shè)置了監(jiān)視,執(zhí)行命令后,監(jiān)視此節(jié)點的客戶端會收到通知
創(chuàng)建znode的子節(jié)點 create /parent/path/subnode/path /data 創(chuàng)建子節(jié)點類似于創(chuàng)建新的znode签赃。唯一的區(qū)別是谷异,子znode的路徑也將具有父路徑。
列出znode的子節(jié)點 ls /path 此命令用于列出和顯示znode的子項姊舵。
檢查狀態(tài) stat /path 狀態(tài)描述指定的znode的元數(shù)據(jù)晰绎。它包含時間戳版本號括丁,ACL數(shù)據(jù)長度子znode等細(xì)項伶选。
移除/刪除znode 移除 rmr /path
刪除 delete/path
rmr /path : 移除指定的znode并遞歸其所有子節(jié)點
delete/path : 命令類似于 remove 命令史飞,除了它只適用于沒有子節(jié)點的znode。

舉個監(jiān)聽通知的例子,當(dāng)我們監(jiān)聽的節(jié)點數(shù)據(jù)有變動的時候,客戶端會收到通知如下

[zk: localhost:2181(CONNECTED) 1] get /FirstZnode “Mysecondzookeeper-app" 

WATCHER: :

WatchedEvent state:SyncConnected type:NodeDataChanged path:/FirstZnode
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x84
mtime = Tue Sep 29 17:14:47 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 23
numChildren = 0
屬性 解釋
WatchedEvent state:
type:
path:
cZxid 對應(yīng)為該節(jié)點的創(chuàng)建時間(Create):創(chuàng)建節(jié)點時的事務(wù)ID
ctime 創(chuàng)建節(jié)點時的時間
mZxid 對應(yīng)該節(jié)點的最近一次修改的時間(Mofify):最后修改節(jié)點時的事務(wù)ID
mtime 最后修改節(jié)點時的時間
pZxid 表示該節(jié)點的子節(jié)點列表最后一次修改的事務(wù)ID仰税,添加子節(jié)點或刪除子節(jié)點就會影響子節(jié)點列表构资,但是修改子節(jié)點的數(shù)據(jù)內(nèi)容則不影響該ID;
cversion 子節(jié)點版本號,子節(jié)點每次修改版本號加1
dataVersion 數(shù)據(jù)版本號陨簇,數(shù)據(jù)每次修改該版本號加1
aclVersion 權(quán)限版本號吐绵,權(quán)限每次修改該版本號加1
ephemeralOwner -
dataLength 該節(jié)點的數(shù)據(jù)長度
numChildren 該節(jié)點擁有子節(jié)點的數(shù)量

znote版本號作用

普及悲觀鎖 | 樂觀鎖

  • 悲觀鎖:它會假定所有不同事務(wù)的處理一定會出現(xiàn)干擾,數(shù)據(jù)庫中最嚴(yán)格的并發(fā)控制策略,如果一個事務(wù)A正在對數(shù)據(jù)處理己单,那么在整個事務(wù)過程中唉窃,其他事務(wù)都無法對這個數(shù)據(jù)進行更新操作,直到A事務(wù)釋放了這個鎖纹笼。
  • 樂觀鎖:它假定所有不同事務(wù)的處理不一定會出現(xiàn)干擾纹份,所以在大部分操作里不許加鎖,但是既然是并發(fā)就有出現(xiàn)干擾的可能廷痘,如何解決沖突就是一個問題蔓涧。在樂觀鎖中當(dāng)你在提交更新請求之前,你要先去檢查你讀取這個數(shù)據(jù)之后該數(shù)據(jù)是否發(fā)生了變化笋额,如果有那么你此次的提交就要放棄元暴,如果沒有就可以提交。

Zookeeper中的版本號就是樂觀鎖兄猩,你修改節(jié)點數(shù)據(jù)之前會讀取這個數(shù)據(jù)并記錄該數(shù)據(jù)版本號茉盏,當(dāng)你需要更新時會攜帶這個版本號去提交,如果你此時攜帶的版本號(就是你上次讀取出來的)和當(dāng)前節(jié)點的版本號相同則說明該數(shù)據(jù)沒有被修改過厦滤,那么你的提交就會成功援岩,如果提交失敗說明該數(shù)據(jù)在你讀取之后和提交之前這段時間內(nèi)被修改了。

這里通過set命令并攜帶版本號提交更新掏导,版本號相同更新就會成功享怀。

設(shè)置成功.png

如果你再次更新并使用之前的版本號那么就會失敗。

設(shè)置失敗.png

10. Zookeeper和Redis區(qū)別

區(qū)別點 Zookeeper Redis
側(cè)重點 解決分布式一致性 緩存
存儲量 每個znote節(jié)點最多只能存儲1M Redis則根據(jù)硬盤情況而定
存儲方式 String 五種數(shù)據(jù)類型
讀寫性能 相對比較差 優(yōu)
監(jiān)測機制 Watch,有變動廣而告之
數(shù)據(jù)同步 集群 + Session -

疑問

問題1 客戶端在連接zookeeper的時候,連接的IP地址必須要填寫全部的嗎

測試三臺zookeeper服務(wù)器A,B,C,對應(yīng)的ip為A_ip,B_ip,C_ip
經(jīng)測試發(fā)現(xiàn),

  • 1.如果只連接集群中單個A_ip,則這臺A_ip宕機了,客戶端就不能連接到zookeeper集群;
  • 2.如果連接多個,不連接全部,只連接了A_ip和B_ip,如果A服務(wù)掛掉(B服務(wù)是ok的),客戶端斷掉后會立馬再次連接,也會連接成功;

連接全部zookeeper服務(wù)ip容錯率好些.

問題2 會不會有同時兩個leader服務(wù)器存在的情況,如果有,怎么處理的;

初始狀態(tài): zookeeper服務(wù)器A,B,C三臺服務(wù)器服務(wù)器中,啟動后A被投為Leader;
當(dāng)A宕機后,B和C重新選擇出B為Leader,當(dāng)A再重新能訪問會發(fā)起新一輪領(lǐng)導(dǎo)選舉,發(fā)現(xiàn)zookeeper集群中的大多數(shù)服務(wù)器(B和C)都選擇了A,那么A也服從大多數(shù),變?yōu)镕ollower;

參考連接:https://mp.weixin.qq.com/s/t2oH5RDw8Ckx3MkciVVnqQ中的4.4:舊Leader恢復(fù)后發(fā)起選舉

解釋
單點故障:(英語:single point of failure趟咆,縮寫SPOF)是指系統(tǒng)中一點失效添瓷,就會讓整個系統(tǒng)無法運作的部件,換句話說值纱,單點故障即會整體故障鳞贷。

參考
https://blog.csdn.net/qq_36660812/article/details/81058358
https://www.cnblogs.com/oxspirt/p/7427969.html
Zookeeper中的Znode特性
https://www.w3cschool.cn/zookeeper/zookeeper_overview.html
https://www.cnblogs.com/aspirant/p/9088322.html
https://mp.weixin.qq.com/s/t2oH5RDw8Ckx3MkciVVnqQ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市虐唠,隨后出現(xiàn)的幾起案子搀愧,更是在濱河造成了極大的恐慌,老刑警劉巖疆偿,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咱筛,死亡現(xiàn)場離奇詭異,居然都是意外死亡杆故,警方通過查閱死者的電腦和手機迅箩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來处铛,“玉大人饲趋,你說我怎么就攤上這事拐揭。” “怎么了奕塑?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵堂污,是天一觀的道長。 經(jīng)常有香客問我爵川,道長敷鸦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任寝贡,我火速辦了婚禮扒披,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圃泡。我一直安慰自己碟案,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布颇蜡。 她就那樣靜靜地躺著价说,像睡著了一般。 火紅的嫁衣襯著肌膚如雪风秤。 梳的紋絲不亂的頭發(fā)上鳖目,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音缤弦,去河邊找鬼领迈。 笑死,一個胖子當(dāng)著我的面吹牛碍沐,可吹牛的內(nèi)容都是我干的狸捅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼累提,長吁一口氣:“原來是場噩夢啊……” “哼尘喝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斋陪,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤朽褪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后无虚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞍匾,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年骑科,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片构拳。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡咆爽,死狀恐怖梁棠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斗埂,我是刑警寧澤符糊,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站呛凶,受9級特大地震影響男娄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漾稀,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一模闲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崭捍,春花似錦尸折、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粒梦,卻和暖如春亮航,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匀们。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工缴淋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昼蛀。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓宴猾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叼旋。 傳聞我的和親對象是個殘疾皇子仇哆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容