成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Zookeeper學(xué)習(xí)系列【一】 教會(huì)你Zookeeper的一些基礎(chǔ)概念

DevWiki / 619人閱讀

摘要:具有不可分割性即原語(yǔ)的執(zhí)行必須是連續(xù)的,在執(zhí)行過(guò)程中不允許被中斷。提供服務(wù)主要就是通過(guò)數(shù)據(jù)結(jié)構(gòu)原語(yǔ)集機(jī)制達(dá)到的。子節(jié)點(diǎn)的版本號(hào)數(shù)據(jù)節(jié)點(diǎn)版本號(hào)版本號(hào)創(chuàng)建該節(jié)點(diǎn)的會(huì)話的。后位則為遞增序列。

前言

最近加入了部門的技術(shù)興趣小組,被分配了Zookeeper的研究任務(wù)。在研究過(guò)程當(dāng)中,發(fā)現(xiàn)Zookeeper由于其開源的特性和其卓越的性能特點(diǎn),在業(yè)界使用廣泛,有很多的應(yīng)用場(chǎng)景,而這些不同的應(yīng)用場(chǎng)景實(shí)際上底層的原理都是差不多的,只要你真正理解了Zookeeper的一些基礎(chǔ)概念和機(jī)制,就能夠觸類旁通。

于是乎,在第一次和項(xiàng)目小組內(nèi)成員分享過(guò)Zookeeper作為服務(wù)注冊(cè)中心的原理和客戶端demo演示之后,我萌生出了整理一個(gè)專題的想法,以此為起點(diǎn),慢慢撿起自己的博客分享之路。

本篇的內(nèi)容主要介紹以下幾點(diǎn)

What is Zookeeper

Zookeeper 數(shù)據(jù)模型

Zookeeper 服務(wù)基本操作

Sessions

Watches

總結(jié)

一、What is Zookeeper

我最早接觸Zookeeper是因?yàn)槲覀冺?xiàng)目使用的微服務(wù)治理架構(gòu)是Dubbo,Dubbo推薦使用的服務(wù)注冊(cè)中心就是Zookeeper。從本質(zhì)上來(lái)說(shuō),Zookeeper就是一種分布式協(xié)調(diào)服務(wù),在分布式環(huán)境中協(xié)調(diào)和管理服務(wù)是一個(gè)復(fù)雜的過(guò)程。ZooKeeper通過(guò)其簡(jiǎn)單的架構(gòu)和API解決了這個(gè)問(wèn)題。 ZooKeeper允許開發(fā)人員專注于核心應(yīng)用程序邏輯,而不必?fù)?dān)心應(yīng)用程序的分布式特性。Zookeeper最早的應(yīng)用是在Hadoop生態(tài)中,Apache HBase使用ZooKeeper跟蹤分布式數(shù)據(jù)的狀態(tài)。

實(shí)際上從它的名字上就很好理解,Zoo - 動(dòng)物園,Keeper - 管理員,動(dòng)物園中有很多種動(dòng)物,這里的動(dòng)物就可以比作分布式環(huán)境下多種多樣的服務(wù),而Zookeeper做的就是管理這些服務(wù)。

ZooKeeper 的設(shè)計(jì)目標(biāo)是將那些復(fù)雜且容易出錯(cuò)的分布式一致性服務(wù)封裝起來(lái),構(gòu)成一個(gè)高效可靠的原語(yǔ)集,并以一系列簡(jiǎn)單易用的接口提供給用戶使用。

原語(yǔ): 操作系統(tǒng)或計(jì)算機(jī)網(wǎng)絡(luò)用語(yǔ)范疇。是由若干條指令組成的,用于完成一定功能的一個(gè)過(guò)程。具有不可分割性·即原語(yǔ)的執(zhí)行必須是連續(xù)的,在執(zhí)行過(guò)程中不允許被中斷。

Zookeeper提供服務(wù)主要就是通過(guò):數(shù)據(jù)結(jié)構(gòu) + 原語(yǔ)集 + watch機(jī)制達(dá)到的。

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

二、Zookeeper 數(shù)據(jù)模型 ZNode

從上圖可以看到,Zookeeper的數(shù)據(jù)模型和Unix的文件系統(tǒng)目錄樹很類似,擁有一個(gè)層次的命名空間。這里面的每一個(gè)節(jié)點(diǎn)都被稱為 - ZNode, 節(jié)點(diǎn)可以擁有子節(jié)點(diǎn),同時(shí)也允許少量數(shù)據(jù)節(jié)點(diǎn)存儲(chǔ)在該節(jié)點(diǎn)之下。(可以理解成一個(gè)允許一個(gè)文件也可以是一個(gè)目錄的文件系統(tǒng))

(1)節(jié)點(diǎn)引用方式

ZNode通過(guò)路徑引用,如同Unix中的文件路徑。路徑必須是絕對(duì)的,因此他們必須有斜杠字符/來(lái)開頭,除此之外,路徑名必須是唯一的,且不能更改。

這個(gè)特性在Dubbo的服務(wù)注冊(cè)上也有體現(xiàn),Dubbo源碼中有個(gè)貫穿全局的類URL,dubbo是以總線模式來(lái)時(shí)刻傳遞和保存配置信息的,也就是配置信息都被放在URL上進(jìn)行傳遞,隨時(shí)可以取得相關(guān)配置信息。Dubbo在向注冊(cè)中心注冊(cè)時(shí)寫下的節(jié)點(diǎn)名就是由URL中的URI和配置信息編碼后組成的。如下圖。


這屬于這部分知識(shí)的擴(kuò)展內(nèi)容,在之后服務(wù)注冊(cè)中心的章節(jié)會(huì)更具體的說(shuō)明。

(2)ZNode結(jié)構(gòu)

前面提到過(guò),ZNode兼具文件和目錄兩種特點(diǎn),既像文件一樣維護(hù)著數(shù)據(jù)、元信息、ACL、時(shí)間戳等數(shù)據(jù)結(jié)構(gòu),又像目錄一樣可以作為路徑標(biāo)識(shí)的一部分。

ZNode由以下幾部分組成:

Stat數(shù)據(jù)結(jié)構(gòu)

操作控制列表(ACL) - 每個(gè)節(jié)點(diǎn)都有一個(gè)ACL來(lái)做節(jié)點(diǎn)的操作控制,這個(gè)列表規(guī)定了用戶的權(quán)限,限定了特定用戶對(duì)目標(biāo)節(jié)點(diǎn)的操作

CREATE - 創(chuàng)建子節(jié)點(diǎn)的權(quán)限

READ - 獲取節(jié)點(diǎn)數(shù)據(jù)和子節(jié)點(diǎn)列表的權(quán)限

WRITE - 更新節(jié)點(diǎn)數(shù)據(jù)的權(quán)限

DELETE - 刪除子節(jié)點(diǎn)的權(quán)限

ADMIN - 設(shè)置節(jié)點(diǎn)ACL的權(quán)限

版本 - ZNode有三個(gè)數(shù)據(jù)版本

version - 當(dāng)前ZNode的版本

cversion - 當(dāng)前ZNode子節(jié)點(diǎn)的版本

aversion - 當(dāng)前ACL列表的版本

Zxid

可以理解成Zookeeper中時(shí)間戳的一種表現(xiàn)形式,也可以理解成事務(wù)ID的概念

如果Zxid1的值小于Zxid2的值,那么Zxid1所對(duì)應(yīng)的事件發(fā)生在Zxid2所對(duì)應(yīng)的事件之前。

ZooKeeper的每個(gè)節(jié)點(diǎn)維護(hù)者三個(gè)Zxid值,分別為:cZxid、mZxid、pZxid。

cZxid:節(jié)點(diǎn)創(chuàng)建時(shí)間 create

mZxid:節(jié)點(diǎn)最近一次修改時(shí)間 modify

pZxid:該節(jié)點(diǎn)的子節(jié)點(diǎn)列表最后一次被修改時(shí)的時(shí)間,子節(jié)點(diǎn)內(nèi)容變更不會(huì)變更pZxid

data域

children節(jié)點(diǎn)

下面有幾個(gè)需要注意的知識(shí)點(diǎn)著重講一下:

A. 狀態(tài)信息/節(jié)點(diǎn)屬性

下圖是我在服務(wù)器上使用zkClient,用get命令獲取到的某個(gè)Dubbo微服務(wù)接口節(jié)點(diǎn)的狀態(tài)信息,來(lái)作為示例,

[zk: localhost:2181(CONNECTED) 0] get /dubbo/com.***.microservice.ucs.api.UniqueControlApi
127.0.0.1 // 節(jié)點(diǎn)數(shù)據(jù)Data域
cZxid = 0xdd59  //Created ZXID,表示該ZNode被創(chuàng)建時(shí)的事務(wù)ID
ctime = Thu Apr 18 15:17:11 CST 2019 //Created Time,表示該ZNode被創(chuàng)建的時(shí)間
mZxid = 0xdd59 //Modified ZXID,表示該ZNode最后一次被更新時(shí)的事務(wù)ID
mtime = Thu Apr 18 15:17:11 CST 2019 //Modified Time,表示該節(jié)點(diǎn)最后一次被更新的時(shí)間
pZxid = 0xdd62 //表示該節(jié)點(diǎn)的子節(jié)點(diǎn)列表最后一次被修改時(shí)的事務(wù)ID。注意,只有子節(jié)點(diǎn)列表變更了才會(huì)變更pZxid,子節(jié)點(diǎn)內(nèi)容變更不會(huì)影響pZxid。
cversion = 4  //子節(jié)點(diǎn)的版本號(hào)
dataVersion = 0 //數(shù)據(jù)節(jié)點(diǎn)版本號(hào)
aclVersion = 0 //ACL版本號(hào)
ephemeralOwner = 0x0  //創(chuàng)建該節(jié)點(diǎn)的會(huì)話的sessionID。如果該節(jié)點(diǎn)是持久節(jié)點(diǎn),那么這個(gè)屬性值為0。
dataLength = 9 // Data域內(nèi)容長(zhǎng)度 
numChildren = 4 // 子節(jié)點(diǎn)個(gè)數(shù) 眾所周知,Dubbo接口子節(jié)點(diǎn)分為providers/configurators/routers/consumers

B. Data域

關(guān)于Data域,Zookeeper中每個(gè)節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)要被原子性的操作,也就是說(shuō)讀操作將獲取與節(jié)點(diǎn)相關(guān)的所有數(shù)據(jù),寫操作也將替換掉節(jié)點(diǎn)的所有數(shù)據(jù)。

值得注意的是,Zookeeper雖然可以存儲(chǔ)數(shù)據(jù),但是從設(shè)計(jì)目的上,并不是為了做數(shù)據(jù)庫(kù)或者大數(shù)據(jù)存儲(chǔ),相反,它是用來(lái)管理調(diào)度數(shù)據(jù),比如分布式應(yīng)用中的配置文件信息、狀態(tài)信息、匯集位置等,這些數(shù)據(jù)通常是很小的數(shù)據(jù),KB為大小單位。ZNode對(duì)數(shù)據(jù)大小也有限制,至多1M。實(shí)際上從這里,就可以推導(dǎo)出Zookeeper用于分布式配置中心的可行性。

C. Zxid

在ZooKeeper中,能改變ZooKeeper服務(wù)器狀態(tài)的操作稱為事務(wù)操作。一般包括數(shù)據(jù)節(jié)點(diǎn)創(chuàng)建與刪除、數(shù)據(jù)內(nèi)容更新和客戶端會(huì)話創(chuàng)建與失效等操作。對(duì)應(yīng)每一個(gè)事務(wù)請(qǐng)求,ZooKeeper都會(huì)為其分配一個(gè)全局唯一的事務(wù)ID,用Zxid表示。

由上圖的示例可以看出,Zxid是一個(gè)64位的數(shù)字。前32位叫做epoch,用來(lái)標(biāo)識(shí)Zookeeper 集群中的Leader節(jié)點(diǎn),當(dāng)Leader節(jié)點(diǎn)更換時(shí),就會(huì)有一個(gè)新的epoch后32位則為遞增序列。從這些Zxid中可以間接地識(shí)別出ZooKeeper處理這些事務(wù)操作請(qǐng)求的全局順序。

(3)節(jié)點(diǎn)類型

ZNode節(jié)點(diǎn)類型嚴(yán)格來(lái)說(shuō)有四種:持久節(jié)點(diǎn)、臨時(shí)節(jié)點(diǎn)、持久順序節(jié)點(diǎn)、臨時(shí)順序節(jié)點(diǎn)

PERSISTENT 持久節(jié)點(diǎn) - 該節(jié)點(diǎn)的生命周期不依賴于session,創(chuàng)建之后客戶端斷開連接,節(jié)點(diǎn)依舊存在,只用客戶端執(zhí)行刪除操作,節(jié)點(diǎn)才能被刪除;

EPHEMERAL 臨時(shí)節(jié)點(diǎn) - 該節(jié)點(diǎn)的聲明周期依賴于session,客戶端斷開連接,臨時(shí)節(jié)點(diǎn)就會(huì)自動(dòng)刪除。另外,臨時(shí)節(jié)點(diǎn)不允許有子節(jié)點(diǎn)。

SEQUENTIAL 順序節(jié)點(diǎn) - 當(dāng)選擇創(chuàng)建順序節(jié)點(diǎn)時(shí),ZooKeeper通過(guò)將10位的序列號(hào)附加到原始名稱來(lái)設(shè)置znode的路徑。例如,如果將具有路徑 /myapp 的znode創(chuàng)建為順序節(jié)點(diǎn),則ZooKeeper會(huì)將路徑更改為 /myapp0000000001 ,并將下一個(gè)序列號(hào)設(shè)置為0000000002。如果兩個(gè)順序節(jié)點(diǎn)是同時(shí)創(chuàng)建的,那么ZooKeeper不會(huì)對(duì)每個(gè)znode使用相同的數(shù)字。順序節(jié)點(diǎn)在鎖定和同步中起重要作用。

三、Zookeeper服務(wù)基本操作

如上圖,標(biāo)明了Zookeeper服務(wù)的九種基本操作,進(jìn)入ZkClient.sh,使用help,可以看到這幾種操作。

[zk: localhost:2181(CONNECTED) 1] help   
ZooKeeper -server host:port cmd args
    stat path [watch] // 獲取指定節(jié)點(diǎn)的狀態(tài)信息
    set path data [version] // setData操作
    ls path [watch] // 查看某個(gè)節(jié)點(diǎn)下的所有子節(jié)點(diǎn)信息
    delquota [-n|-b] path // 刪除節(jié)點(diǎn)配額
    ls2 path [watch] // ls + stat 兩個(gè)命令結(jié)合
    setAcl path acl // 設(shè)置ACL
    setquota -n|-b val path // 設(shè)置節(jié)點(diǎn)配額,-n 是限制子節(jié)點(diǎn)個(gè)數(shù) -b是限制節(jié)點(diǎn)數(shù)據(jù)長(zhǎng)度
    history // 歷史命令
    redo cmdno // 執(zhí)行歷史命令
    printwatches on|off
    delete path [version] // 刪除指定路徑節(jié)點(diǎn),有子節(jié)點(diǎn)需要先刪除子節(jié)點(diǎn)
    sync path // 同步視圖
    listquota path // 查看節(jié)點(diǎn)配額信息
    rmr path // 刪除節(jié)點(diǎn)及其子節(jié)點(diǎn)
    get path [watch] // 獲取當(dāng)前節(jié)點(diǎn)數(shù)據(jù)內(nèi)容
    create [-s] [-e] path data acl // 創(chuàng)建節(jié)點(diǎn)
    addauth scheme auth
    quit 
    getAcl path // 獲取ACL
    close 
    connect host:port

從命令中可以看到,更新ZooKeeper操作是有限制的。delete或setData必須明確要更新的Znode的版本號(hào),我們可以調(diào)用exists找到。如果版本號(hào)不匹配,更新將會(huì)失敗。

更新ZooKeeper操作是非阻塞式的。因此客戶端如果失去了一個(gè)更新(由于另一個(gè)進(jìn)程在同時(shí)更新這個(gè)Znode),他可以在不阻塞其他進(jìn)程執(zhí)行的情況下,選擇重新嘗試或進(jìn)行其他操作。

四、Sessions

在 ZooKeeper 中,一個(gè)客戶端連接是指客戶端和服務(wù)器之間的一個(gè) TCP 長(zhǎng)連接??蛻舳藛?dòng)的時(shí)候,首先會(huì)與服務(wù)器建立一個(gè) TCP 連接,從第一次連接建立開始,客戶端會(huì)話的生命周期也開始了。通過(guò)這個(gè)連接,客戶端能夠通過(guò)心跳檢測(cè)與服務(wù)器保持有效的會(huì)話,也能夠向Zookeeper服務(wù)器發(fā)送請(qǐng)求并接受響應(yīng),同時(shí)還能夠通過(guò)該連接接收來(lái)自服務(wù)器的Watch事件通知。

客戶端以特定的時(shí)間間隔發(fā)送心跳以保持會(huì)話有效。如果ZooKeeper Server Ensembles在超過(guò)服務(wù)器開啟時(shí)指定的期間(會(huì)話超時(shí))都沒(méi)有從客戶端接收到心跳,則它會(huì)判定客戶端死機(jī)。

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

五、Watches

在我看來(lái),Watches - 監(jiān)聽事件,是Zookeeper中一個(gè)很重要的特性,也是實(shí)現(xiàn)Zookeeper大多數(shù)功能的核心特性之一。簡(jiǎn)單來(lái)說(shuō), Zookeeper允許Client端在指定節(jié)點(diǎn)上注冊(cè)Watches,在某些特定事件觸發(fā)的時(shí)候,Zookeeper服務(wù)端會(huì)將事件異步通知到感興趣(即注冊(cè)了Watches)的客戶端上去??梢岳斫獬梢粋€(gè)訂閱/發(fā)布系統(tǒng),是不是。

Znode更改是與znode相關(guān)的數(shù)據(jù)的修改或znode的子項(xiàng)中的更改。只觸發(fā)一次watches。如果客戶端想要再次通知,則必須通過(guò)另一個(gè)讀取操作來(lái)完成。當(dāng)連接會(huì)話過(guò)期時(shí),客戶端將與服務(wù)器斷開連接,相關(guān)的watches也將被刪除。

下面說(shuō)完簡(jiǎn)單的,來(lái)說(shuō)點(diǎn)復(fù)雜的部分。

幾個(gè)特性先了解下:

One-time trigger 一次watch時(shí)間只會(huì)被觸發(fā)一遍,如果節(jié)點(diǎn)再次發(fā)生變化,除非之前有重新設(shè)置過(guò)watches,不然會(huì)收到通知;

Sent to Client 當(dāng)watch的對(duì)象狀態(tài)發(fā)生改變時(shí),將會(huì)觸發(fā)此對(duì)象上watch所對(duì)應(yīng)的事件。watch事件將被異步地發(fā)送給客戶端,并且ZooKeeper為watch機(jī)制提供了有序的一致性保證(Ordering guarantee)。

The data for which the watch was set 發(fā)送給客戶端的數(shù)據(jù)信息,實(shí)際上就是你這個(gè)watch監(jiān)視的類型,見下文介紹

Zookeeper的Watches 分為兩種,數(shù)據(jù)監(jiān)聽器(Data Watches)和子節(jié)點(diǎn)監(jiān)聽器(Children Watches)。即你可以對(duì)某個(gè)節(jié)點(diǎn)的Data設(shè)置watches,也可以對(duì)某個(gè)子節(jié)點(diǎn)設(shè)置watches。

可以看下Zookeeper Java 客戶端 Zkclient 中的設(shè)置watches的代碼:

// listener 監(jiān)聽器
// path 節(jié)點(diǎn)路徑

// 子節(jié)點(diǎn)監(jiān)聽器
private List addTargetChildListener(String path, IZkChildListener listener) {
    return client.subscribeChildChanges(path, listener);
}

// 節(jié)點(diǎn)數(shù)據(jù)的監(jiān)聽器
public void addChildDataListener(String path, IZkDataListener listener) {
    try {
        // 遞歸創(chuàng)建節(jié)點(diǎn)
        client.subscribeDataChanges(path, listener);
    } catch (ZkNodeExistsException e) {
    }
}

作為開發(fā)者,需要知道監(jiān)控節(jié)點(diǎn)的什么操作會(huì)觸發(fā)你設(shè)置的watches。

一個(gè)成功的setData操作將觸發(fā)Znode的數(shù)據(jù)watches

一個(gè)成功的create操作將觸發(fā)Znode的數(shù)據(jù)watches以及子節(jié)點(diǎn)watches

一個(gè)成功的delete操作將觸發(fā)Znode的數(shù)據(jù)watches和子節(jié)點(diǎn)watches

再看下ZkClient中的數(shù)據(jù)監(jiān)聽器接口IZkDataListener

public interface IZkDataListener {
    // 監(jiān)控節(jié)點(diǎn)數(shù)據(jù)更新的時(shí)候會(huì)觸發(fā) 這段邏輯
    public void handleDataChange(String dataPath, Object data) throws Exception;
    // 監(jiān)控節(jié)點(diǎn)被刪除的時(shí)候會(huì)觸發(fā) 這段邏輯
    public void handleDataDeleted(String dataPath) throws Exception;
}

再看下ZkClient中的子節(jié)點(diǎn)監(jiān)聽器接口IZkChildListener

public interface IZkChildListener {

    /**
     * Called when the children of the given path changed.
     * 監(jiān)控節(jié)點(diǎn)的子節(jié)點(diǎn)列表改變時(shí)會(huì)觸發(fā)這段邏輯
     * 
     * @param parentPath
     *            The parent path
     * @param currentChilds
     *            The children or null if the root node (parent path) was deleted.
     * @throws Exception
     */
    public void handleChildChange(String parentPath, List currentChilds) throws Exception;
}

實(shí)際上看到這就能聯(lián)想到,Zookeeper是可以當(dāng)做分布式配置中心來(lái)使用的,只不過(guò)你需要自己擴(kuò)展他異步通知節(jié)點(diǎn)數(shù)據(jù)變化之后的邏輯,更新你的配置。在后面的章節(jié)會(huì)更新相關(guān)demo。

關(guān)于Watches 詳細(xì)介紹可以參考官網(wǎng)的介紹:

ZooKeeper Watches

https://zookeeper.apache.org/...

六、 總結(jié)

本章內(nèi)容算是Zookeeper系列的開篇,介紹了Zookeeper的幾個(gè)基礎(chǔ)概念,并且給出了相關(guān)實(shí)例,助于理解。

現(xiàn)在我們?cè)倩剡^(guò)頭來(lái)看看Zookeeper的特性:

① 順序一致性
從同一個(gè)客戶端發(fā)起的事務(wù)請(qǐng)求,最終將會(huì)嚴(yán)格按照其發(fā)起順序被應(yīng)用到ZooKeeper中。

② 原子性
所有事務(wù)請(qǐng)求的結(jié)果在集群中所有機(jī)器上的應(yīng)用情況是一致的,也就是說(shuō)要么整個(gè)集群所有集群都成功應(yīng)用了某一個(gè)事務(wù),要么都沒(méi)有應(yīng)用,一定不會(huì)出現(xiàn)集群中部分機(jī)器應(yīng)用了該事務(wù),而另外一部分沒(méi)有應(yīng)用的情況。

③ 單一視圖
無(wú)論客戶端連接的是哪個(gè)ZooKeeper服務(wù)器,其看到的服務(wù)端數(shù)據(jù)模型都是一致的。

④ 可靠性
一旦服務(wù)端成功地應(yīng)用了一個(gè)事務(wù),并完成對(duì)客戶端的響應(yīng),那么該事務(wù)所引起的服務(wù)端狀態(tài)變更將會(huì)被一直保留下來(lái),除非有另一個(gè)事務(wù)又對(duì)其進(jìn)行了變更。

⑤ 實(shí)時(shí)性
通常人們看到實(shí)時(shí)性的第一反應(yīng)是,一旦一個(gè)事務(wù)被成功應(yīng)用,那么客戶端能夠立即從服務(wù)端上讀取到這個(gè)事務(wù)變更后的最新數(shù)據(jù)狀態(tài)。這里需要注意的是,ZooKeeper僅僅保證在一定的時(shí)間段內(nèi),客戶端最終一定能夠從服務(wù)端上讀取到最新的數(shù)據(jù)狀態(tài)。

今天的內(nèi)容中,順序一致性是通過(guò)ZXid來(lái)實(shí)現(xiàn)的,全局唯一,順序遞增,同一個(gè)session中請(qǐng)求是FIFO的;可靠性的描述也可以通過(guò)今天的知識(shí)進(jìn)行理解,一次事務(wù)的應(yīng)用,服務(wù)端狀態(tài)的變更會(huì)以Zxid、Znode數(shù)據(jù)版本、數(shù)據(jù)、節(jié)點(diǎn)路徑的形式保存下來(lái)。剩下的幾種特性是怎么實(shí)現(xiàn)的,在學(xué)習(xí)完Zookeeper集群相關(guān)的內(nèi)容之后應(yīng)該就能理解。

本篇文章中借鑒了網(wǎng)上幾篇優(yōu)秀的文章,并且結(jié)合了我本人一些思考和實(shí)踐。希望能對(duì)你學(xué)習(xí)了解Zookeeper起到一些幫助。

下一章,我會(huì)介紹Zookeeper集群方面的知識(shí),CAP理論在Zookeeper中的實(shí)踐,以及如何搭建Zookeeper的集群。

參考

[1] https://zookeeper.apache.org/... 官方文檔(強(qiáng)烈推薦)

[2] https://www.cnblogs.com/sundd... 作者應(yīng)該是對(duì)官方文檔有比較深的了解,我發(fā)現(xiàn)他的文章的脈絡(luò)和官網(wǎng)有很相似的地方。寫的非常好

[3] https://www.jianshu.com/p/a17... 作者對(duì)Zookeeper做了一個(gè)易懂的總體介紹

[4] https://www.w3cschool.cn/zook... w3cSchool tutorial

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74192.html

相關(guān)文章

  • Zookeeper學(xué)習(xí)系列【三】Zookeeper 集群架構(gòu)、讀寫機(jī)制以及致性原理(ZAB協(xié)議)

    摘要:協(xié)議是為分布式協(xié)調(diào)服務(wù)專門設(shè)計(jì)的一種支持崩潰恢復(fù)的一致性協(xié)議,這個(gè)機(jī)制保證了各個(gè)之間的同步。選主是協(xié)議中最為重要和復(fù)雜的過(guò)程。以實(shí)際效果而言,分區(qū)相當(dāng)于對(duì)通信的時(shí)限要求。參考官方文檔阿里巴巴為什么不用做服務(wù)發(fā)現(xiàn)定理的含義阮一峰 前言 同學(xué)們,在上一章中,我們主要講了Zookeeper兩種啟動(dòng)模式以及具體如何搭建。本章內(nèi)容主要講的是集群相關(guān)的原理內(nèi)容,第一章可以當(dāng)做是Zookeeper原...

    Olivia 評(píng)論0 收藏0
  • 快速了解zookeeper

    摘要:之后服務(wù)器等待其他服務(wù)器的反饋,一旦超過(guò)半數(shù)的服務(wù)器進(jìn)行了正確的反饋,那么就會(huì)再次向所有的服務(wù)器分發(fā)消息,要求其將前一個(gè)進(jìn)行提交。協(xié)議包括兩種基本的模式,分別是崩潰恢復(fù)和消息廣播。 前言 zookeeper本質(zhì)上就是一個(gè)分布式協(xié)調(diào)服務(wù),用來(lái)解決分布式一致性的問(wèn)題。 本文適合有一定分布式基礎(chǔ)的讀者閱讀。什么叫相關(guān)的基礎(chǔ)呢?起碼你得知道系統(tǒng)架構(gòu)為何從集中式演變成了分布式,分布式有哪些優(yōu)點(diǎn)...

    imccl 評(píng)論0 收藏0
  • 高并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)??梢娝氖褂?,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來(lái),我們一步一步來(lái)?yè)羝魄皟蓚€(gè)名詞,今天我們首先來(lái)說(shuō)說(shuō)分布式。 探究...

    supernavy 評(píng)論0 收藏0
  • 高并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見它的使用,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來(lái),我們一步一步來(lái)?yè)羝魄皟蓚€(gè)名詞,今天我們首先來(lái)說(shuō)說(shuō)分布式。 探究...

    ddongjian0000 評(píng)論0 收藏0
  • 高并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見它的使用,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來(lái),我們一步一步來(lái)?yè)羝魄皟蓚€(gè)名詞,今天我們首先來(lái)說(shuō)說(shuō)分布式。 探究...

    wangdai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<