0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度解析Zookeeper五個(gè)最核心知識(shí)點(diǎn)

FPGA之家 ? 來(lái)源:sowhat1412 ? 作者:sowhat1412 ? 2021-06-10 17:40 ? 次閱讀

1 ZooKeeper簡(jiǎn)介

ZooKeeper 是一個(gè)開(kāi)源的分布式協(xié)調(diào)框架,它的定位是為分布式應(yīng)用提供一致性服務(wù),是整個(gè)大數(shù)據(jù)體系的管理員。ZooKeeper 會(huì)封裝好復(fù)雜易出錯(cuò)的關(guān)鍵服務(wù),將高效、穩(wěn)定、易用的服務(wù)提供給用戶(hù)使用。

如果上面的官方言語(yǔ)你不太理解,你可以認(rèn)為 ZooKeeper = 文件系統(tǒng) + 監(jiān)聽(tīng)通知機(jī)制。

1.1 文件系統(tǒng)

Zookeeper維護(hù)一個(gè)類(lèi)似文件系統(tǒng)的樹(shù)狀數(shù)據(jù)結(jié)構(gòu),這種特性使得 Zookeeper 不能用于存放大量的數(shù)據(jù),每個(gè)節(jié)點(diǎn)的存放數(shù)據(jù)上限為1M。每個(gè)子目錄項(xiàng)如 NameService 都被稱(chēng)作為 znode(目錄節(jié)點(diǎn))。和文件系統(tǒng)一樣,我們能夠自由的增加、刪除znode,在一個(gè)znode下增加、刪除子znode,唯一的不同在于znode是可以存儲(chǔ)數(shù)據(jù)的。默認(rèn)有四種類(lèi)型的znode:

持久化目錄節(jié)點(diǎn) PERSISTENT:客戶(hù)端與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)依舊存在。

持久化順序編號(hào)目錄節(jié)點(diǎn) PERSISTENT_SEQUENTIAL:客戶(hù)端與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)依舊存在,只是Zookeeper給該節(jié)點(diǎn)名稱(chēng)進(jìn)行順序編號(hào)。

臨時(shí)目錄節(jié)點(diǎn) EPHEMERAL:客戶(hù)端與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)被刪除。

臨時(shí)順序編號(hào)目錄節(jié)點(diǎn) EPHEMERAL_SEQUENTIAL:客戶(hù)端與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)被刪除,只是Zookeeper給該節(jié)點(diǎn)名稱(chēng)進(jìn)行順序編號(hào)。

1.2 監(jiān)聽(tīng)通知機(jī)制

Watcher 監(jiān)聽(tīng)機(jī)制是 Zookeeper 中非常重要的特性,我們基于 Zookeeper 上創(chuàng)建的節(jié)點(diǎn),可以對(duì)這些節(jié)點(diǎn)綁定監(jiān)聽(tīng)事件,比如可以監(jiān)聽(tīng)節(jié)點(diǎn)數(shù)據(jù)變更、節(jié)點(diǎn)刪除、子節(jié)點(diǎn)狀態(tài)變更等事件,通過(guò)這個(gè)事件機(jī)制,可以基于 Zookeeper 實(shí)現(xiàn)分布式鎖、集群管理等功能。

Watcher 特性:

當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候, Zookeeper 會(huì)產(chǎn)生一個(gè) Watcher 事件,并且會(huì)發(fā)送到客戶(hù)端。但是客戶(hù)端只會(huì)收到一次通知。如果后續(xù)這個(gè)節(jié)點(diǎn)再次發(fā)生變化,那么之前設(shè)置 Watcher 的客戶(hù)端不會(huì)再次收到消息。(Watcher 是一次性的操作)??梢酝ㄟ^(guò)循環(huán)監(jiān)聽(tīng)去達(dá)到永久監(jiān)聽(tīng)效果。

ZooKeeper 的 Watcher 機(jī)制,總的來(lái)說(shuō)可以分為三個(gè)過(guò)程:

客戶(hù)端注冊(cè) Watcher,注冊(cè) watcher 有 3 種方式,getData、exists、getChildren。

服務(wù)器處理 Watcher 。

客戶(hù)端回調(diào) Watcher 客戶(hù)端。

監(jiān)聽(tīng)流程:

首先要有一個(gè)main()線(xiàn)程

在main線(xiàn)程中創(chuàng)建Zookeeper客戶(hù)端,這時(shí)就會(huì)創(chuàng)建兩個(gè)線(xiàn)程,一個(gè)負(fù)責(zé)網(wǎng)絡(luò)連接通信(connet),一個(gè)負(fù)責(zé)監(jiān)聽(tīng)(listener)。

通過(guò)connect線(xiàn)程將注冊(cè)的監(jiān)聽(tīng)事件發(fā)送給Zookeeper。

在Zookeeper的注冊(cè)監(jiān)聽(tīng)器列表中將注冊(cè)的監(jiān)聽(tīng)事件添加到列表中。

Zookeeper監(jiān)聽(tīng)到有數(shù)據(jù)或路徑變化,就會(huì)將這個(gè)消息發(fā)送給listener線(xiàn)程。

listener線(xiàn)程內(nèi)部調(diào)用了process()方法。

1.3 Zookeeper 特點(diǎn)

集群:Zookeeper是一個(gè)領(lǐng)導(dǎo)者(Leader),多個(gè)跟隨者(Follower)組成的集群。

高可用性:集群中只要有半數(shù)以上節(jié)點(diǎn)存活,Zookeeper集群就能正常服務(wù)。

全局?jǐn)?shù)據(jù)一致:每個(gè)Server保存一份相同的數(shù)據(jù)副本,Client無(wú)論連接到哪個(gè)Server,數(shù)據(jù)都是一致的。

更新請(qǐng)求順序進(jìn)行:來(lái)自同一個(gè)Client的更新請(qǐng)求按其發(fā)送順序依次執(zhí)行。

數(shù)據(jù)更新原子性:一次數(shù)據(jù)更新要么成功,要么失敗。

實(shí)時(shí)性:在一定時(shí)間范圍內(nèi),Client能讀到最新數(shù)據(jù)。

從設(shè)計(jì)模式角度來(lái)看,zk是一個(gè)基于觀察者設(shè)計(jì)模式的框架,它負(fù)責(zé)管理跟存儲(chǔ)大家都關(guān)心的數(shù)據(jù),然后接受觀察者的注冊(cè),數(shù)據(jù)反生變化zk會(huì)通知在zk上注冊(cè)的觀察者做出反應(yīng)。

Zookeeper是一個(gè)分布式協(xié)調(diào)系統(tǒng),滿(mǎn)足CP性,跟SpringCloud中的Eureka滿(mǎn)足AP不一樣。

分布式協(xié)調(diào)系統(tǒng):Leader會(huì)同步數(shù)據(jù)到follower,用戶(hù)請(qǐng)求可通過(guò)follower得到數(shù)據(jù),這樣不會(huì)出現(xiàn)單點(diǎn)故障,并且只要同步時(shí)間無(wú)限短,那這就是個(gè)好的 分布式協(xié)調(diào)系統(tǒng)。

CAP原則又稱(chēng)CAP定理,指的是在一個(gè)分布式系統(tǒng)中,一致性(Consistency)、可用性(Availability)、分區(qū)容錯(cuò)性(Partition tolerance)。CAP 原則指的是,這三個(gè)要素最多只能同時(shí)實(shí)現(xiàn)兩點(diǎn),不可能三者兼顧。

2 Zookeeper 提供的功能

通過(guò)對(duì) Zookeeper 中豐富的數(shù)據(jù)節(jié)點(diǎn)進(jìn)行交叉使用,配合 Watcher 事件通知機(jī)制,可以非常方便的構(gòu)建一系列分布式應(yīng)用中涉及的核心功能,比如 數(shù)據(jù)發(fā)布/訂閱、負(fù)載均衡、命名服務(wù)、分布式協(xié)調(diào)/通知、集群管理、Master 選舉、分布式鎖和分布式隊(duì)列 等功能。

1. 數(shù)據(jù)發(fā)布/訂閱

當(dāng)某些數(shù)據(jù)由幾個(gè)機(jī)器共享,且這些信息經(jīng)常變化數(shù)據(jù)量還小的時(shí)候,這些數(shù)據(jù)就適合存儲(chǔ)到ZK中。

數(shù)據(jù)存儲(chǔ):將數(shù)據(jù)存儲(chǔ)到 Zookeeper 上的一個(gè)數(shù)據(jù)節(jié)點(diǎn)。

數(shù)據(jù)獲?。簯?yīng)用在啟動(dòng)初始化節(jié)點(diǎn)從 Zookeeper 數(shù)據(jù)節(jié)點(diǎn)讀取數(shù)據(jù),并在該節(jié)點(diǎn)上注冊(cè)一個(gè)數(shù)據(jù)變更 Watcher

數(shù)據(jù)變更:當(dāng)變更數(shù)據(jù)時(shí)會(huì)更新 Zookeeper 對(duì)應(yīng)節(jié)點(diǎn)數(shù)據(jù),Zookeeper會(huì)將數(shù)據(jù)變更通知發(fā)到各客戶(hù)端,客戶(hù)端接到通知后重新讀取變更后的數(shù)據(jù)即可。

2. 分布式鎖

關(guān)于分布式鎖其實(shí)在 Redis 中已經(jīng)講過(guò)了,并且Redis提供的分布式鎖是比ZK性能強(qiáng)的?;赯ooKeeper的分布式鎖一般有如下兩種。

保持獨(dú)占

核心思想:在zk中有一個(gè)唯一的臨時(shí)節(jié)點(diǎn),只有拿到節(jié)點(diǎn)的才可以操作數(shù)據(jù),沒(méi)拿到的線(xiàn)程就需要等待。缺點(diǎn):可能引發(fā)羊群效應(yīng),第一個(gè)用完后瞬間有999個(gè)同時(shí)并發(fā)的線(xiàn)程向zk請(qǐng)求獲得鎖。

控制時(shí)序

主要是避免了羊群效應(yīng),臨時(shí)節(jié)點(diǎn)已經(jīng)預(yù)先存在,所有想要獲得鎖的線(xiàn)程在它下面創(chuàng)建臨時(shí)順序編號(hào)目錄節(jié)點(diǎn),編號(hào)最小的獲得鎖,用完刪除,后面的依次排隊(duì)獲取。

3. 負(fù)載均衡

多個(gè)相同的jar包在不同的服務(wù)器上開(kāi)啟相同的服務(wù),可以通過(guò)nginx在服務(wù)端進(jìn)行負(fù)載均衡的配置。也可以通過(guò)ZooKeeper在客戶(hù)端進(jìn)行負(fù)載均衡配置。

多個(gè)服務(wù)注冊(cè)

客戶(hù)端獲取中間件地址集合

從集合中隨機(jī)選一個(gè)服務(wù)執(zhí)行任務(wù)

ZooKeeper負(fù)載均衡和Nginx負(fù)載均衡區(qū)別:

ZooKeeper不存在單點(diǎn)問(wèn)題,zab機(jī)制保證單點(diǎn)故障可重新選舉一個(gè)leader只負(fù)責(zé)服務(wù)的注冊(cè)與發(fā)現(xiàn),不負(fù)責(zé)轉(zhuǎn)發(fā),減少一次數(shù)據(jù)交換(消費(fèi)方與服務(wù)方直接通信),需要自己實(shí)現(xiàn)相應(yīng)的負(fù)載均衡算法。

Nginx存在單點(diǎn)問(wèn)題,單點(diǎn)負(fù)載高數(shù)據(jù)量大,需要通過(guò) KeepAlived + LVS 備機(jī)實(shí)現(xiàn)高可用。每次負(fù)載,都充當(dāng)一次中間人轉(zhuǎn)發(fā)角色,增加網(wǎng)絡(luò)負(fù)載量(消費(fèi)方與服務(wù)方間接通信),自帶負(fù)載均衡算法。

4. 命名服務(wù)

命名服務(wù)是指通過(guò)指定的名字來(lái)獲取資源或者服務(wù)的地址,利用 zk 創(chuàng)建一個(gè)全局唯一的路徑,這個(gè)路徑就可以作為一個(gè)名字,指向集群中的集群,提供的服務(wù)的地址,或者一個(gè)遠(yuǎn)程的對(duì)象等等。

5. 分布式協(xié)調(diào)/通知

對(duì)于系統(tǒng)調(diào)度來(lái)說(shuō),用戶(hù)更改zk某個(gè)節(jié)點(diǎn)的value, ZooKeeper會(huì)將這些變化發(fā)送給注冊(cè)了這個(gè)節(jié)點(diǎn)的 watcher 的所有客戶(hù)端,進(jìn)行通知。

對(duì)于執(zhí)行情況匯報(bào)來(lái)說(shuō),每個(gè)工作進(jìn)程都在目錄下創(chuàng)建一個(gè)攜帶工作進(jìn)度的臨時(shí)節(jié)點(diǎn),那么匯總的進(jìn)程可以監(jiān)控目錄子節(jié)點(diǎn)的變化獲得工作進(jìn)度的實(shí)時(shí)的全局情況。

6. 集群管理

大數(shù)據(jù)體系下的大部分集群服務(wù)好像都通過(guò)ZooKeeper管理的,其實(shí)管理的時(shí)候主要關(guān)注的就是機(jī)器的動(dòng)態(tài)上下線(xiàn)跟Leader選舉。

動(dòng)態(tài)上下線(xiàn):

比如在zookeeper服務(wù)器端有一個(gè)znode叫 /Configuration,那么集群中每一個(gè)機(jī)器啟動(dòng)的時(shí)候都去這個(gè)節(jié)點(diǎn)下創(chuàng)建一個(gè)EPHEMERAL類(lèi)型的節(jié)點(diǎn),比如server1 創(chuàng)建 /Configuration/Server1,server2創(chuàng)建**/Configuration /Server1**,然后Server1和Server2都watch /Configuration 這個(gè)父節(jié)點(diǎn),那么也就是這個(gè)父節(jié)點(diǎn)下數(shù)據(jù)或者子節(jié)點(diǎn)變化都會(huì)通知到該節(jié)點(diǎn)進(jìn)行watch的客戶(hù)端。

Leader選舉:

利用ZooKeeper的強(qiáng)一致性,能夠保證在分布式高并發(fā)情況下節(jié)點(diǎn)創(chuàng)建的全局唯一性,即:同時(shí)有多個(gè)客戶(hù)端請(qǐng)求創(chuàng)建 /Master 節(jié)點(diǎn),最終一定只有一個(gè)客戶(hù)端請(qǐng)求能夠創(chuàng)建成功。利用這個(gè)特性,就能很輕易的在分布式環(huán)境中進(jìn)行集群選舉了。

就是動(dòng)態(tài)Master選舉。這就要用到 EPHEMERAL_SEQUENTIAL類(lèi)型節(jié)點(diǎn)的特性了,這樣每個(gè)節(jié)點(diǎn)會(huì)自動(dòng)被編號(hào)。允許所有請(qǐng)求都能夠創(chuàng)建成功,但是得有個(gè)創(chuàng)建順序,每次選取序列號(hào)最小的那個(gè)機(jī)器作為Master 。

3 Leader選舉

ZooKeeper集群節(jié)點(diǎn)個(gè)數(shù)一定是奇數(shù)個(gè),一般3個(gè)或者5個(gè)就OK。為避免集群群龍無(wú)首,一定要選個(gè)大哥出來(lái)當(dāng)Leader。這是個(gè)高頻考點(diǎn)。

3.1 預(yù)備知識(shí)

3.1.1. 節(jié)點(diǎn)四種狀態(tài)。

LOOKING:尋 找 Leader 狀態(tài)。當(dāng)服務(wù)器處于該狀態(tài)時(shí)會(huì)認(rèn)為當(dāng)前集群中沒(méi)有 Leader,因此需要進(jìn)入 Leader 選舉狀態(tài)。

FOLLOWING:跟隨者狀態(tài)。處理客戶(hù)端的非事務(wù)請(qǐng)求,轉(zhuǎn)發(fā)事務(wù)請(qǐng)求給 Leader 服務(wù)器,參與事務(wù)請(qǐng)求 Proposal(提議) 的投票,參與 Leader 選舉投票。

LEADING:領(lǐng)導(dǎo)者狀態(tài)。事務(wù)請(qǐng)求的唯一調(diào)度和處理者,保證集群事務(wù)處理的順序性,集群內(nèi)部個(gè)服務(wù)器的調(diào)度者(管理follower,數(shù)據(jù)同步)。

OBSERVING:觀察者狀態(tài)。3.0 版本以后引入的一個(gè)服務(wù)器角色,在不影響集群事務(wù)處理能力的基礎(chǔ)上提升集群的非事務(wù)處理能力,處理客戶(hù)端的非事務(wù)請(qǐng)求,轉(zhuǎn)發(fā)事務(wù)請(qǐng)求給 Leader 服務(wù)器,不參與任何形式的投票。

3.1.2 服務(wù)器ID

既Server id,一般在搭建ZK集群時(shí)會(huì)在myid文件中給每個(gè)節(jié)點(diǎn)搞個(gè)唯一編號(hào),編號(hào)越大在Leader選擇算法中的權(quán)重越大,比如初始化啟動(dòng)時(shí)就是根據(jù)服務(wù)器ID進(jìn)行比較。

3.1.3 ZXID

ZooKeeper 采用全局遞增的事務(wù) Id 來(lái)標(biāo)識(shí),所有 proposal(提議)在被提出的時(shí)候加上了ZooKeeper Transaction Id ,zxid是64位的Long類(lèi)型,這是保證事務(wù)的順序一致性的關(guān)鍵。zxid中高32位表示紀(jì)元epoch,低32位表示事務(wù)標(biāo)識(shí)xid。你可以認(rèn)為zxid越大說(shuō)明存儲(chǔ)數(shù)據(jù)越新。

每個(gè)leader都會(huì)具有不同的epoch值,表示一個(gè)紀(jì)元/朝代,用來(lái)標(biāo)識(shí) leader 周期。每個(gè)新的選舉開(kāi)啟時(shí)都會(huì)生成一個(gè)新的epoch,新的leader產(chǎn)生的話(huà)epoch會(huì)自增,會(huì)將該值更新到所有的zkServer的zxid和epoch,

xid是一個(gè)依次遞增的事務(wù)編號(hào)。數(shù)值越大說(shuō)明數(shù)據(jù)越新,所有 proposal(提議)在被提出的時(shí)候加上了zxid,然后會(huì)依據(jù)數(shù)據(jù)庫(kù)的兩階段過(guò)程,首先會(huì)向其他的 server 發(fā)出事務(wù)執(zhí)行請(qǐng)求,如果超過(guò)半數(shù)的機(jī)器都能執(zhí)行并且能夠成功,那么就會(huì)開(kāi)始執(zhí)行。

3.2 Leader選舉

Leader的選舉一般分為啟動(dòng)時(shí)選舉跟Leader掛掉后的運(yùn)行時(shí)選舉。

3.2.1 啟動(dòng)時(shí)Leader選舉

我們以上面的5臺(tái)機(jī)器為例,只有超過(guò)半數(shù)以上,即最少啟動(dòng)3臺(tái)服務(wù)器,集群才能正常工作。

服務(wù)器1啟動(dòng),發(fā)起一次選舉。

服務(wù)器1投自己一票。此時(shí)服務(wù)器1票數(shù)一票,不夠半數(shù)以上(3票),選舉無(wú)法完成,服務(wù)器1狀態(tài)保持為L(zhǎng)OOKING。

服務(wù)器2啟動(dòng),再發(fā)起一次選舉。

服務(wù)器1和2分別投自己一票,此時(shí)服務(wù)器1發(fā)現(xiàn)服務(wù)器2的id比自己大,更改選票投給服務(wù)器2。此時(shí)服務(wù)器1票數(shù)0票,服務(wù)器2票數(shù)2票,不夠半數(shù)以上(3票),選舉無(wú)法完成。服務(wù)器1,2狀態(tài)保持LOOKING。

服務(wù)器3啟動(dòng),發(fā)起一次選舉。

與上面過(guò)程一樣,服務(wù)器1和2先投自己一票,然后因?yàn)榉?wù)器3id最大,兩者更改選票投給為服務(wù)器3。此次投票結(jié)果:服務(wù)器1為0票,服務(wù)器2為0票,服務(wù)器3為3票。此時(shí)服務(wù)器3的票數(shù)已經(jīng)超過(guò)半數(shù)(3票),服務(wù)器3當(dāng)選Leader。服務(wù)器1,2更改狀態(tài)為FOLLOWING,服務(wù)器3更改狀態(tài)為L(zhǎng)EADING;

服務(wù)器4啟動(dòng),發(fā)起一次選舉。

此時(shí)服務(wù)器1、2、3已經(jīng)不是LOOKING狀態(tài),不會(huì)更改選票信息,交換選票信息結(jié)果。服務(wù)器3為3票,服務(wù)器4為1票。此時(shí)服務(wù)器4服從多數(shù),更改選票信息為服務(wù)器3,服務(wù)器4并更改狀態(tài)為FOLLOWING。

服務(wù)器5啟動(dòng),發(fā)起一次選舉

同4一樣投票給3,此時(shí)服務(wù)器3一共5票,服務(wù)器5為0票。服務(wù)器5并更改狀態(tài)為FOLLOWING;

最終

Leader是服務(wù)器3,狀態(tài)為L(zhǎng)EADING。其余服務(wù)器是Follower,狀態(tài)為FOLLOWING。

3.2.2 運(yùn)行時(shí)Leader選舉

運(yùn)行時(shí)候如果Master節(jié)點(diǎn)崩潰了會(huì)走恢復(fù)模式,新Leader選出前會(huì)暫停對(duì)外服務(wù),大致可以分為四個(gè)階段 選舉、發(fā)現(xiàn)、同步、廣播。

每個(gè)Server會(huì)發(fā)出一個(gè)投票,第一次都是投自己,其中投票信息 = (myid,ZXID)

收集來(lái)自各個(gè)服務(wù)器的投票

處理投票并重新投票,處理邏輯:優(yōu)先比較ZXID,然后比較myid。

統(tǒng)計(jì)投票,只要超過(guò)半數(shù)的機(jī)器接收到同樣的投票信息,就可以確定leader,注意epoch的增加跟同步。

改變服務(wù)器狀態(tài)Looking變?yōu)镕ollowing或Leading。

當(dāng) Follower 鏈接上 Leader 之后,Leader 服務(wù)器會(huì)根據(jù)自己服務(wù)器上最后被提交的 ZXID 和 Follower 上的 ZXID 進(jìn)行比對(duì),比對(duì)結(jié)果要么回滾,要么和 Leader 同步,保證集群中各個(gè)節(jié)點(diǎn)的事務(wù)一致。

集群恢復(fù)到廣播模式,開(kāi)始接受客戶(hù)端的寫(xiě)請(qǐng)求。

3.3 腦裂

腦裂問(wèn)題是集群部署必須考慮的一點(diǎn),比如在Hadoop跟Spark集群中。而ZAB為解決腦裂問(wèn)題,要求集群內(nèi)的節(jié)點(diǎn)數(shù)量為2N+1。當(dāng)網(wǎng)絡(luò)分裂后,始終有一個(gè)集群的節(jié)點(diǎn)數(shù)量過(guò)半數(shù),而另一個(gè)節(jié)點(diǎn)數(shù)量小于N+1, 因?yàn)檫x舉Leader需要過(guò)半數(shù)的節(jié)點(diǎn)同意,所以我們可以得出如下結(jié)論:

有了過(guò)半機(jī)制,對(duì)于一個(gè)Zookeeper集群,要么沒(méi)有Leader,要沒(méi)只有1個(gè)Leader,這樣就避免了腦裂問(wèn)題

4 一致性協(xié)議之 ZAB

建議先看下 淺談大數(shù)據(jù)中的2PC、3PC、Paxos、Raft、ZAB ,不然可能看的吃力。

4.1 ZAB 協(xié)議介紹

ZAB (Zookeeper Atomic Broadcast 原子廣播協(xié)議) 協(xié)議是為分布式協(xié)調(diào)服務(wù)ZooKeeper專(zhuān)門(mén)設(shè)計(jì)的一種支持崩潰恢復(fù)的一致性協(xié)議。基于該協(xié)議,ZooKeeper 實(shí)現(xiàn)了一種主從模式的系統(tǒng)架構(gòu)來(lái)保持集群中各個(gè)副本之間的數(shù)據(jù)一致性。

分布式系統(tǒng)中l(wèi)eader負(fù)責(zé)外部客戶(hù)端的寫(xiě)請(qǐng)求。follower服務(wù)器負(fù)責(zé)讀跟同步。這時(shí)需要解決倆問(wèn)題。

Leader 服務(wù)器是如何把數(shù)據(jù)更新到所有的Follower的。

Leader 服務(wù)器突然間失效了,集群咋辦?

因此ZAB協(xié)議為了解決上面兩個(gè)問(wèn)題而設(shè)計(jì)了兩種工作模式,整個(gè) Zookeeper 就是在這兩個(gè)模式之間切換:

原子廣播模式:把數(shù)據(jù)更新到所有的follower。

崩潰恢復(fù)模式:Leader發(fā)生崩潰時(shí),如何恢復(fù)。

4.2 原子廣播模式

你可以認(rèn)為消息廣播機(jī)制是簡(jiǎn)化版的 2PC協(xié)議,就是通過(guò)如下的機(jī)制保證事務(wù)的順序一致性的。

leader從客戶(hù)端收到一個(gè)寫(xiě)請(qǐng)求后生成一個(gè)新的事務(wù)并為這個(gè)事務(wù)生成一個(gè)唯一的ZXID,

leader將將帶有 zxid 的消息作為一個(gè)提案(proposal)分發(fā)給所有 FIFO隊(duì)列。

FIFO隊(duì)列取出隊(duì)頭proposal給follower節(jié)點(diǎn)。

當(dāng) follower 接收到 proposal,先將 proposal 寫(xiě)到硬盤(pán),寫(xiě)硬盤(pán)成功后再向 leader 回一個(gè) ACK。

FIFO隊(duì)列把ACK返回給Leader。

當(dāng)leader收到超過(guò)一半以上的follower的ack消息,leader會(huì)進(jìn)行commit請(qǐng)求,然后再給FIFO發(fā)送commit請(qǐng)求。

當(dāng)follower收到commit請(qǐng)求時(shí),會(huì)判斷該事務(wù)的ZXID是不是比歷史隊(duì)列中的任何事務(wù)的ZXID都小,如果是則提交,如果不是則等待比它更小的事務(wù)的commit(保證順序性)

4.3 崩潰恢復(fù)

消息廣播過(guò)程中,Leader 崩潰了還能保證數(shù)據(jù)一致嗎?當(dāng) Leader 崩潰會(huì)進(jìn)入崩潰恢復(fù)模式。其實(shí)主要是對(duì)如下兩種情況的處理。

Leader 在復(fù)制數(shù)據(jù)給所有 Follwer 之后崩潰,咋搞?

Leader 在收到 Ack 并提交了自己,同時(shí)發(fā)送了部分 commit 出去之后崩潰咋辦?

針對(duì)此問(wèn)題,ZAB 定義了 2 個(gè)原則:

ZAB 協(xié)議確保執(zhí)行那些已經(jīng)在 Leader 提交的事務(wù)最終會(huì)被所有服務(wù)器提交。

ZAB 協(xié)議確保丟棄那些只在 Leader 提出/復(fù)制,但沒(méi)有提交的事務(wù)。

至于如何實(shí)現(xiàn)確保提交已經(jīng)被 Leader 提交的事務(wù),同時(shí)丟棄已經(jīng)被跳過(guò)的事務(wù)呢?關(guān)鍵點(diǎn)就是依賴(lài)上面說(shuō)到過(guò)的 ZXID了。

4.4 ZAB 特性

一致性保證

可靠提交(Reliable delivery) :如果一個(gè)事務(wù) A 被一個(gè)server提交(committed)了,那么它最終一定會(huì)被所有的server提交

全局有序(Total order)

假設(shè)有A、B兩個(gè)事務(wù),有一臺(tái)server先執(zhí)行A再執(zhí)行B,那么可以保證所有server上A始終都被在B之前執(zhí)行

因果有序(Causal order)

如果發(fā)送者在事務(wù)A提交之后再發(fā)送B,那么B必將在A之后執(zhí)行

高可用性

只要大多數(shù)(法定數(shù)量)節(jié)點(diǎn)啟動(dòng),系統(tǒng)就行正常運(yùn)行

可恢復(fù)性

當(dāng)節(jié)點(diǎn)下線(xiàn)后重啟,它必須保證能恢復(fù)到當(dāng)前正在執(zhí)行的事務(wù)

4.5 ZAB 和 Paxos 對(duì)比

相同點(diǎn):

兩者都存在一個(gè)類(lèi)似于 Leader 進(jìn)程的角色,由其負(fù)責(zé)協(xié)調(diào)多個(gè) Follower 進(jìn)程的運(yùn)行。

Leader 進(jìn)程都會(huì)等待超過(guò)半數(shù)的 Follower 做出正確的反饋后,才會(huì)將一個(gè)提案進(jìn)行提交。

ZAB 協(xié)議中,每個(gè) Proposal 中都包含一個(gè) epoch 值來(lái)代表當(dāng)前的 Leader周期,Paxos 中名字為 Ballot

不同點(diǎn):

ZAB 用來(lái)構(gòu)建高可用的分布式數(shù)據(jù)主備系統(tǒng)(Zookeeper),Paxos 是用來(lái)構(gòu)建分布式一致性狀態(tài)機(jī)系統(tǒng)。

5 ZooKeeper 零散知識(shí)

5.1 常見(jiàn)指令

Zookeeper 有三種部署模式:

單機(jī)部署:一臺(tái)機(jī)器上運(yùn)行。

集群部署:多臺(tái)機(jī)器運(yùn)行。

偽集群部署:一臺(tái)機(jī)器啟動(dòng)多個(gè) Zookeeper 實(shí)例運(yùn)行。

部署完畢后常見(jiàn)指令如下:

命令基本語(yǔ)法功能描述

help顯示所有操作命令

ls path [watch]顯示所有操作命令

ls path [watch]查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)并能看到更新次數(shù)等數(shù)據(jù)

create普通創(chuàng)建, -s 含有序列,

-e 臨時(shí)(重啟或者超時(shí)消失)

get path [watch]獲得節(jié)點(diǎn)的值

set設(shè)置節(jié)點(diǎn)的具體值

stat查看節(jié)點(diǎn)狀態(tài)

delete刪除節(jié)點(diǎn)

rmr遞歸刪除節(jié)點(diǎn)

5.2 Zookeeper客戶(hù)端

5.2.1. Zookeeper原生客戶(hù)端

Zookeeper客戶(hù)端是異步的哦!需要引入CountDownLatch 來(lái)確保連接好了再做下面操作。Zookeeper原生api是不支持迭代式的創(chuàng)建跟刪除路徑的,具有如下弊端。

會(huì)話(huà)的連接是異步的;必須用到回調(diào)函數(shù) 。

Watch需要重復(fù)注冊(cè):看一次watch注冊(cè)一次 。

Session重連機(jī)制:有時(shí)session斷開(kāi)還需要重連接。

開(kāi)發(fā)復(fù)雜性較高:開(kāi)發(fā)相對(duì)來(lái)說(shuō)比較瑣碎。

5.2.2. ZkClient

開(kāi)源的zk客戶(hù)端,在原生API基礎(chǔ)上封裝,是一個(gè)更易于使用的zookeeper客戶(hù)端,做了如下優(yōu)化。

優(yōu)化一 、在session loss和session expire時(shí)自動(dòng)創(chuàng)建新的ZooKeeper實(shí)例進(jìn)行重連。優(yōu)化二、 將一次性watcher包裝為持久watcher。

5.2.3. Curator

開(kāi)源的zk客戶(hù)端,在原生API基礎(chǔ)上封裝,apache頂級(jí)項(xiàng)目。是Netflix公司開(kāi)源的一套Zookeeper客戶(hù)端框架。了解過(guò)Zookeeper原生API都會(huì)清楚其復(fù)雜度。Curator幫助我們?cè)谄浠A(chǔ)上進(jìn)行封裝、實(shí)現(xiàn)一些開(kāi)發(fā)細(xì)節(jié),包括接連重連、反復(fù)注冊(cè)Watcher和NodeExistsException等。目前已經(jīng)作為Apache的頂級(jí)項(xiàng)目出現(xiàn),是最流行的Zookeeper客戶(hù)端之一。

5.2.4. Zookeeper圖形化客戶(hù)端工具

工具名叫ZooInspector,百度安裝教程即可。

5.3 ACL 權(quán)限控制機(jī)制

ACL全稱(chēng)為Access Control List 即訪問(wèn)控制列表,用于控制資源的訪問(wèn)權(quán)限。zookeeper利用ACL策略控制節(jié)點(diǎn)的訪問(wèn)權(quán)限,如節(jié)點(diǎn)數(shù)據(jù)讀寫(xiě)、節(jié)點(diǎn)創(chuàng)建、節(jié)點(diǎn)刪除、讀取子節(jié)點(diǎn)列表、設(shè)置節(jié)點(diǎn)權(quán)限等。

5.4 Zookeeper使用注意事項(xiàng)

集群中機(jī)器的數(shù)量并不是越多越好,一個(gè)寫(xiě)操作需要半數(shù)以上的節(jié)點(diǎn)ack,所以集群節(jié)點(diǎn)數(shù)越多,整個(gè)集群可以抗掛點(diǎn)的節(jié)點(diǎn)數(shù)越多(越可靠),但是吞吐量越差。集群的數(shù)量必須為奇數(shù)。

zk是基于內(nèi)存進(jìn)行讀寫(xiě)操作的,有時(shí)候會(huì)進(jìn)行消息廣播,因此不建議在節(jié)點(diǎn)存取容量比較大的數(shù)據(jù)。

dataDir目錄、dataLogDir兩個(gè)目錄會(huì)隨著時(shí)間推移變得龐大,容易造成硬盤(pán)滿(mǎn)了。建議自己編寫(xiě)或使用自帶的腳本保留最新的n個(gè)文件。

默認(rèn)最大連接數(shù) 默認(rèn)為60,配置maxClientCnxns參數(shù),配置單個(gè)客戶(hù)端機(jī)器創(chuàng)建的最大連接數(shù)。

編輯:jq

1 ZooKeeper簡(jiǎn)介

ZooKeeper 是一個(gè)開(kāi)源的分布式協(xié)調(diào)框架,它的定位是為分布式應(yīng)用提供一致性服務(wù),是整個(gè)大數(shù)據(jù)體系的管理員。ZooKeeper 會(huì)封裝好復(fù)雜易出錯(cuò)的關(guān)鍵服務(wù),將高效、穩(wěn)定、易用的服務(wù)提供給用戶(hù)使用。

如果上面的官方言語(yǔ)你不太理解,你可以認(rèn)為 ZooKeeper = 文件系統(tǒng) + 監(jiān)聽(tīng)通知機(jī)制。

1.1 文件系統(tǒng)

Zookeeper維護(hù)一個(gè)類(lèi)似文件系統(tǒng)的樹(shù)狀數(shù)據(jù)結(jié)構(gòu),這種特性使得 Zookeeper 不能用于存放大量的數(shù)據(jù),每個(gè)節(jié)點(diǎn)的存放數(shù)據(jù)上限為1M。每個(gè)子目錄項(xiàng)如 NameService 都被稱(chēng)作為 znode(目錄節(jié)點(diǎn))。和文件系統(tǒng)一樣,我們能夠自由的增加、刪除znode,在一個(gè)znode下增加、刪除子znode,唯一的不同在于znode是可以存儲(chǔ)數(shù)據(jù)的。默認(rèn)有四種類(lèi)型的znode:

持久化目錄節(jié)點(diǎn) PERSISTENT:客戶(hù)端與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)依舊存在。

持久化順序編號(hào)目錄節(jié)點(diǎn) PERSISTENT_SEQUENTIAL:客戶(hù)端與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)依舊存在,只是Zookeeper給該節(jié)點(diǎn)名稱(chēng)進(jìn)行順序編號(hào)。

臨時(shí)目錄節(jié)點(diǎn) EPHEMERAL:客戶(hù)端與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)被刪除。

臨時(shí)順序編號(hào)目錄節(jié)點(diǎn) EPHEMERAL_SEQUENTIAL:客戶(hù)端與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)被刪除,只是Zookeeper給該節(jié)點(diǎn)名稱(chēng)進(jìn)行順序編號(hào)。

1.2 監(jiān)聽(tīng)通知機(jī)制

Watcher 監(jiān)聽(tīng)機(jī)制是 Zookeeper 中非常重要的特性,我們基于 Zookeeper 上創(chuàng)建的節(jié)點(diǎn),可以對(duì)這些節(jié)點(diǎn)綁定監(jiān)聽(tīng)事件,比如可以監(jiān)聽(tīng)節(jié)點(diǎn)數(shù)據(jù)變更、節(jié)點(diǎn)刪除、子節(jié)點(diǎn)狀態(tài)變更等事件,通過(guò)這個(gè)事件機(jī)制,可以基于 Zookeeper 實(shí)現(xiàn)分布式鎖、集群管理等功能。

Watcher 特性:

當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候, Zookeeper 會(huì)產(chǎn)生一個(gè) Watcher 事件,并且會(huì)發(fā)送到客戶(hù)端。但是客戶(hù)端只會(huì)收到一次通知。如果后續(xù)這個(gè)節(jié)點(diǎn)再次發(fā)生變化,那么之前設(shè)置 Watcher 的客戶(hù)端不會(huì)再次收到消息。(Watcher 是一次性的操作)??梢酝ㄟ^(guò)循環(huán)監(jiān)聽(tīng)去達(dá)到永久監(jiān)聽(tīng)效果。

ZooKeeper 的 Watcher 機(jī)制,總的來(lái)說(shuō)可以分為三個(gè)過(guò)程:

客戶(hù)端注冊(cè) Watcher,注冊(cè) watcher 有 3 種方式,getData、exists、getChildren。

服務(wù)器處理 Watcher 。

客戶(hù)端回調(diào) Watcher 客戶(hù)端。

監(jiān)聽(tīng)流程:

首先要有一個(gè)main()線(xiàn)程

在main線(xiàn)程中創(chuàng)建Zookeeper客戶(hù)端,這時(shí)就會(huì)創(chuàng)建兩個(gè)線(xiàn)程,一個(gè)負(fù)責(zé)網(wǎng)絡(luò)連接通信(connet),一個(gè)負(fù)責(zé)監(jiān)聽(tīng)(listener)。

通過(guò)connect線(xiàn)程將注冊(cè)的監(jiān)聽(tīng)事件發(fā)送給Zookeeper。

在Zookeeper的注冊(cè)監(jiān)聽(tīng)器列表中將注冊(cè)的監(jiān)聽(tīng)事件添加到列表中。

Zookeeper監(jiān)聽(tīng)到有數(shù)據(jù)或路徑變化,就會(huì)將這個(gè)消息發(fā)送給listener線(xiàn)程。

listener線(xiàn)程內(nèi)部調(diào)用了process()方法。

1.3 Zookeeper 特點(diǎn)

集群:Zookeeper是一個(gè)領(lǐng)導(dǎo)者(Leader),多個(gè)跟隨者(Follower)組成的集群。

高可用性:集群中只要有半數(shù)以上節(jié)點(diǎn)存活,Zookeeper集群就能正常服務(wù)。

全局?jǐn)?shù)據(jù)一致:每個(gè)Server保存一份相同的數(shù)據(jù)副本,Client無(wú)論連接到哪個(gè)Server,數(shù)據(jù)都是一致的。

更新請(qǐng)求順序進(jìn)行:來(lái)自同一個(gè)Client的更新請(qǐng)求按其發(fā)送順序依次執(zhí)行。

數(shù)據(jù)更新原子性:一次數(shù)據(jù)更新要么成功,要么失敗。

實(shí)時(shí)性:在一定時(shí)間范圍內(nèi),Client能讀到最新數(shù)據(jù)。

從設(shè)計(jì)模式角度來(lái)看,zk是一個(gè)基于觀察者設(shè)計(jì)模式的框架,它負(fù)責(zé)管理跟存儲(chǔ)大家都關(guān)心的數(shù)據(jù),然后接受觀察者的注冊(cè),數(shù)據(jù)反生變化zk會(huì)通知在zk上注冊(cè)的觀察者做出反應(yīng)。

Zookeeper是一個(gè)分布式協(xié)調(diào)系統(tǒng),滿(mǎn)足CP性,跟SpringCloud中的Eureka滿(mǎn)足AP不一樣。

分布式協(xié)調(diào)系統(tǒng):Leader會(huì)同步數(shù)據(jù)到follower,用戶(hù)請(qǐng)求可通過(guò)follower得到數(shù)據(jù),這樣不會(huì)出現(xiàn)單點(diǎn)故障,并且只要同步時(shí)間無(wú)限短,那這就是個(gè)好的 分布式協(xié)調(diào)系統(tǒng)。

CAP原則又稱(chēng)CAP定理,指的是在一個(gè)分布式系統(tǒng)中,一致性(Consistency)、可用性(Availability)、分區(qū)容錯(cuò)性(Partition tolerance)。CAP 原則指的是,這三個(gè)要素最多只能同時(shí)實(shí)現(xiàn)兩點(diǎn),不可能三者兼顧。

2 Zookeeper 提供的功能

通過(guò)對(duì) Zookeeper 中豐富的數(shù)據(jù)節(jié)點(diǎn)進(jìn)行交叉使用,配合 Watcher 事件通知機(jī)制,可以非常方便的構(gòu)建一系列分布式應(yīng)用中涉及的核心功能,比如 數(shù)據(jù)發(fā)布/訂閱、負(fù)載均衡、命名服務(wù)、分布式協(xié)調(diào)/通知、集群管理、Master 選舉、分布式鎖和分布式隊(duì)列 等功能。

1. 數(shù)據(jù)發(fā)布/訂閱

當(dāng)某些數(shù)據(jù)由幾個(gè)機(jī)器共享,且這些信息經(jīng)常變化數(shù)據(jù)量還小的時(shí)候,這些數(shù)據(jù)就適合存儲(chǔ)到ZK中。

數(shù)據(jù)存儲(chǔ):將數(shù)據(jù)存儲(chǔ)到 Zookeeper 上的一個(gè)數(shù)據(jù)節(jié)點(diǎn)。

數(shù)據(jù)獲?。簯?yīng)用在啟動(dòng)初始化節(jié)點(diǎn)從 Zookeeper 數(shù)據(jù)節(jié)點(diǎn)讀取數(shù)據(jù),并在該節(jié)點(diǎn)上注冊(cè)一個(gè)數(shù)據(jù)變更 Watcher

數(shù)據(jù)變更:當(dāng)變更數(shù)據(jù)時(shí)會(huì)更新 Zookeeper 對(duì)應(yīng)節(jié)點(diǎn)數(shù)據(jù),Zookeeper會(huì)將數(shù)據(jù)變更通知發(fā)到各客戶(hù)端,客戶(hù)端接到通知后重新讀取變更后的數(shù)據(jù)即可。

2. 分布式鎖

關(guān)于分布式鎖其實(shí)在 Redis 中已經(jīng)講過(guò)了,并且Redis提供的分布式鎖是比ZK性能強(qiáng)的?;赯ooKeeper的分布式鎖一般有如下兩種。

保持獨(dú)占

核心思想:在zk中有一個(gè)唯一的臨時(shí)節(jié)點(diǎn),只有拿到節(jié)點(diǎn)的才可以操作數(shù)據(jù),沒(méi)拿到的線(xiàn)程就需要等待。缺點(diǎn):可能引發(fā)羊群效應(yīng),第一個(gè)用完后瞬間有999個(gè)同時(shí)并發(fā)的線(xiàn)程向zk請(qǐng)求獲得鎖。

控制時(shí)序

主要是避免了羊群效應(yīng),臨時(shí)節(jié)點(diǎn)已經(jīng)預(yù)先存在,所有想要獲得鎖的線(xiàn)程在它下面創(chuàng)建臨時(shí)順序編號(hào)目錄節(jié)點(diǎn),編號(hào)最小的獲得鎖,用完刪除,后面的依次排隊(duì)獲取。

3. 負(fù)載均衡

多個(gè)相同的jar包在不同的服務(wù)器上開(kāi)啟相同的服務(wù),可以通過(guò)nginx在服務(wù)端進(jìn)行負(fù)載均衡的配置。也可以通過(guò)ZooKeeper在客戶(hù)端進(jìn)行負(fù)載均衡配置。

多個(gè)服務(wù)注冊(cè)

客戶(hù)端獲取中間件地址集合

從集合中隨機(jī)選一個(gè)服務(wù)執(zhí)行任務(wù)

ZooKeeper負(fù)載均衡和Nginx負(fù)載均衡區(qū)別:

ZooKeeper不存在單點(diǎn)問(wèn)題,zab機(jī)制保證單點(diǎn)故障可重新選舉一個(gè)leader只負(fù)責(zé)服務(wù)的注冊(cè)與發(fā)現(xiàn),不負(fù)責(zé)轉(zhuǎn)發(fā),減少一次數(shù)據(jù)交換(消費(fèi)方與服務(wù)方直接通信),需要自己實(shí)現(xiàn)相應(yīng)的負(fù)載均衡算法。

Nginx存在單點(diǎn)問(wèn)題,單點(diǎn)負(fù)載高數(shù)據(jù)量大,需要通過(guò) KeepAlived + LVS 備機(jī)實(shí)現(xiàn)高可用。每次負(fù)載,都充當(dāng)一次中間人轉(zhuǎn)發(fā)角色,增加網(wǎng)絡(luò)負(fù)載量(消費(fèi)方與服務(wù)方間接通信),自帶負(fù)載均衡算法。

4. 命名服務(wù)

命名服務(wù)是指通過(guò)指定的名字來(lái)獲取資源或者服務(wù)的地址,利用 zk 創(chuàng)建一個(gè)全局唯一的路徑,這個(gè)路徑就可以作為一個(gè)名字,指向集群中的集群,提供的服務(wù)的地址,或者一個(gè)遠(yuǎn)程的對(duì)象等等。

5. 分布式協(xié)調(diào)/通知

對(duì)于系統(tǒng)調(diào)度來(lái)說(shuō),用戶(hù)更改zk某個(gè)節(jié)點(diǎn)的value, ZooKeeper會(huì)將這些變化發(fā)送給注冊(cè)了這個(gè)節(jié)點(diǎn)的 watcher 的所有客戶(hù)端,進(jìn)行通知。

對(duì)于執(zhí)行情況匯報(bào)來(lái)說(shuō),每個(gè)工作進(jìn)程都在目錄下創(chuàng)建一個(gè)攜帶工作進(jìn)度的臨時(shí)節(jié)點(diǎn),那么匯總的進(jìn)程可以監(jiān)控目錄子節(jié)點(diǎn)的變化獲得工作進(jìn)度的實(shí)時(shí)的全局情況。

6. 集群管理

大數(shù)據(jù)體系下的大部分集群服務(wù)好像都通過(guò)ZooKeeper管理的,其實(shí)管理的時(shí)候主要關(guān)注的就是機(jī)器的動(dòng)態(tài)上下線(xiàn)跟Leader選舉。

動(dòng)態(tài)上下線(xiàn):

比如在zookeeper服務(wù)器端有一個(gè)znode叫 /Configuration,那么集群中每一個(gè)機(jī)器啟動(dòng)的時(shí)候都去這個(gè)節(jié)點(diǎn)下創(chuàng)建一個(gè)EPHEMERAL類(lèi)型的節(jié)點(diǎn),比如server1 創(chuàng)建 /Configuration/Server1,server2創(chuàng)建**/Configuration /Server1**,然后Server1和Server2都watch /Configuration 這個(gè)父節(jié)點(diǎn),那么也就是這個(gè)父節(jié)點(diǎn)下數(shù)據(jù)或者子節(jié)點(diǎn)變化都會(huì)通知到該節(jié)點(diǎn)進(jìn)行watch的客戶(hù)端。

Leader選舉:

利用ZooKeeper的強(qiáng)一致性,能夠保證在分布式高并發(fā)情況下節(jié)點(diǎn)創(chuàng)建的全局唯一性,即:同時(shí)有多個(gè)客戶(hù)端請(qǐng)求創(chuàng)建 /Master 節(jié)點(diǎn),最終一定只有一個(gè)客戶(hù)端請(qǐng)求能夠創(chuàng)建成功。利用這個(gè)特性,就能很輕易的在分布式環(huán)境中進(jìn)行集群選舉了。

就是動(dòng)態(tài)Master選舉。這就要用到 EPHEMERAL_SEQUENTIAL類(lèi)型節(jié)點(diǎn)的特性了,這樣每個(gè)節(jié)點(diǎn)會(huì)自動(dòng)被編號(hào)。允許所有請(qǐng)求都能夠創(chuàng)建成功,但是得有個(gè)創(chuàng)建順序,每次選取序列號(hào)最小的那個(gè)機(jī)器作為Master 。

3 Leader選舉

ZooKeeper集群節(jié)點(diǎn)個(gè)數(shù)一定是奇數(shù)個(gè),一般3個(gè)或者5個(gè)就OK。為避免集群群龍無(wú)首,一定要選個(gè)大哥出來(lái)當(dāng)Leader。這是個(gè)高頻考點(diǎn)。

3.1 預(yù)備知識(shí)

3.1.1. 節(jié)點(diǎn)四種狀態(tài)。

LOOKING:尋 找 Leader 狀態(tài)。當(dāng)服務(wù)器處于該狀態(tài)時(shí)會(huì)認(rèn)為當(dāng)前集群中沒(méi)有 Leader,因此需要進(jìn)入 Leader 選舉狀態(tài)。

FOLLOWING:跟隨者狀態(tài)。處理客戶(hù)端的非事務(wù)請(qǐng)求,轉(zhuǎn)發(fā)事務(wù)請(qǐng)求給 Leader 服務(wù)器,參與事務(wù)請(qǐng)求 Proposal(提議) 的投票,參與 Leader 選舉投票。

LEADING:領(lǐng)導(dǎo)者狀態(tài)。事務(wù)請(qǐng)求的唯一調(diào)度和處理者,保證集群事務(wù)處理的順序性,集群內(nèi)部個(gè)服務(wù)器的調(diào)度者(管理follower,數(shù)據(jù)同步)。

OBSERVING:觀察者狀態(tài)。3.0 版本以后引入的一個(gè)服務(wù)器角色,在不影響集群事務(wù)處理能力的基礎(chǔ)上提升集群的非事務(wù)處理能力,處理客戶(hù)端的非事務(wù)請(qǐng)求,轉(zhuǎn)發(fā)事務(wù)請(qǐng)求給 Leader 服務(wù)器,不參與任何形式的投票。

3.1.2 服務(wù)器ID

既Server id,一般在搭建ZK集群時(shí)會(huì)在myid文件中給每個(gè)節(jié)點(diǎn)搞個(gè)唯一編號(hào),編號(hào)越大在Leader選擇算法中的權(quán)重越大,比如初始化啟動(dòng)時(shí)就是根據(jù)服務(wù)器ID進(jìn)行比較。

3.1.3 ZXID

ZooKeeper 采用全局遞增的事務(wù) Id 來(lái)標(biāo)識(shí),所有 proposal(提議)在被提出的時(shí)候加上了ZooKeeper Transaction Id ,zxid是64位的Long類(lèi)型,這是保證事務(wù)的順序一致性的關(guān)鍵。zxid中高32位表示紀(jì)元epoch,低32位表示事務(wù)標(biāo)識(shí)xid。你可以認(rèn)為zxid越大說(shuō)明存儲(chǔ)數(shù)據(jù)越新。

每個(gè)leader都會(huì)具有不同的epoch值,表示一個(gè)紀(jì)元/朝代,用來(lái)標(biāo)識(shí) leader 周期。每個(gè)新的選舉開(kāi)啟時(shí)都會(huì)生成一個(gè)新的epoch,新的leader產(chǎn)生的話(huà)epoch會(huì)自增,會(huì)將該值更新到所有的zkServer的zxid和epoch,

xid是一個(gè)依次遞增的事務(wù)編號(hào)。數(shù)值越大說(shuō)明數(shù)據(jù)越新,所有 proposal(提議)在被提出的時(shí)候加上了zxid,然后會(huì)依據(jù)數(shù)據(jù)庫(kù)的兩階段過(guò)程,首先會(huì)向其他的 server 發(fā)出事務(wù)執(zhí)行請(qǐng)求,如果超過(guò)半數(shù)的機(jī)器都能執(zhí)行并且能夠成功,那么就會(huì)開(kāi)始執(zhí)行。

3.2 Leader選舉

Leader的選舉一般分為啟動(dòng)時(shí)選舉跟Leader掛掉后的運(yùn)行時(shí)選舉。

3.2.1 啟動(dòng)時(shí)Leader選舉

我們以上面的5臺(tái)機(jī)器為例,只有超過(guò)半數(shù)以上,即最少啟動(dòng)3臺(tái)服務(wù)器,集群才能正常工作。

服務(wù)器1啟動(dòng),發(fā)起一次選舉。

服務(wù)器1投自己一票。此時(shí)服務(wù)器1票數(shù)一票,不夠半數(shù)以上(3票),選舉無(wú)法完成,服務(wù)器1狀態(tài)保持為L(zhǎng)OOKING。

服務(wù)器2啟動(dòng),再發(fā)起一次選舉。

服務(wù)器1和2分別投自己一票,此時(shí)服務(wù)器1發(fā)現(xiàn)服務(wù)器2的id比自己大,更改選票投給服務(wù)器2。此時(shí)服務(wù)器1票數(shù)0票,服務(wù)器2票數(shù)2票,不夠半數(shù)以上(3票),選舉無(wú)法完成。服務(wù)器1,2狀態(tài)保持LOOKING。

服務(wù)器3啟動(dòng),發(fā)起一次選舉。

與上面過(guò)程一樣,服務(wù)器1和2先投自己一票,然后因?yàn)榉?wù)器3id最大,兩者更改選票投給為服務(wù)器3。此次投票結(jié)果:服務(wù)器1為0票,服務(wù)器2為0票,服務(wù)器3為3票。此時(shí)服務(wù)器3的票數(shù)已經(jīng)超過(guò)半數(shù)(3票),服務(wù)器3當(dāng)選Leader。服務(wù)器1,2更改狀態(tài)為FOLLOWING,服務(wù)器3更改狀態(tài)為L(zhǎng)EADING;

服務(wù)器4啟動(dòng),發(fā)起一次選舉。

此時(shí)服務(wù)器1、2、3已經(jīng)不是LOOKING狀態(tài),不會(huì)更改選票信息,交換選票信息結(jié)果。服務(wù)器3為3票,服務(wù)器4為1票。此時(shí)服務(wù)器4服從多數(shù),更改選票信息為服務(wù)器3,服務(wù)器4并更改狀態(tài)為FOLLOWING。

服務(wù)器5啟動(dòng),發(fā)起一次選舉

同4一樣投票給3,此時(shí)服務(wù)器3一共5票,服務(wù)器5為0票。服務(wù)器5并更改狀態(tài)為FOLLOWING;

最終

Leader是服務(wù)器3,狀態(tài)為L(zhǎng)EADING。其余服務(wù)器是Follower,狀態(tài)為FOLLOWING。

3.2.2 運(yùn)行時(shí)Leader選舉

運(yùn)行時(shí)候如果Master節(jié)點(diǎn)崩潰了會(huì)走恢復(fù)模式,新Leader選出前會(huì)暫停對(duì)外服務(wù),大致可以分為四個(gè)階段 選舉、發(fā)現(xiàn)、同步、廣播。

每個(gè)Server會(huì)發(fā)出一個(gè)投票,第一次都是投自己,其中投票信息 = (myid,ZXID)

收集來(lái)自各個(gè)服務(wù)器的投票

處理投票并重新投票,處理邏輯:優(yōu)先比較ZXID,然后比較myid。

統(tǒng)計(jì)投票,只要超過(guò)半數(shù)的機(jī)器接收到同樣的投票信息,就可以確定leader,注意epoch的增加跟同步。

改變服務(wù)器狀態(tài)Looking變?yōu)镕ollowing或Leading。

當(dāng) Follower 鏈接上 Leader 之后,Leader 服務(wù)器會(huì)根據(jù)自己服務(wù)器上最后被提交的 ZXID 和 Follower 上的 ZXID 進(jìn)行比對(duì),比對(duì)結(jié)果要么回滾,要么和 Leader 同步,保證集群中各個(gè)節(jié)點(diǎn)的事務(wù)一致。

集群恢復(fù)到廣播模式,開(kāi)始接受客戶(hù)端的寫(xiě)請(qǐng)求。

3.3 腦裂

腦裂問(wèn)題是集群部署必須考慮的一點(diǎn),比如在Hadoop跟Spark集群中。而ZAB為解決腦裂問(wèn)題,要求集群內(nèi)的節(jié)點(diǎn)數(shù)量為2N+1。當(dāng)網(wǎng)絡(luò)分裂后,始終有一個(gè)集群的節(jié)點(diǎn)數(shù)量過(guò)半數(shù),而另一個(gè)節(jié)點(diǎn)數(shù)量小于N+1, 因?yàn)檫x舉Leader需要過(guò)半數(shù)的節(jié)點(diǎn)同意,所以我們可以得出如下結(jié)論:

有了過(guò)半機(jī)制,對(duì)于一個(gè)Zookeeper集群,要么沒(méi)有Leader,要沒(méi)只有1個(gè)Leader,這樣就避免了腦裂問(wèn)題

4 一致性協(xié)議之 ZAB

建議先看下 淺談大數(shù)據(jù)中的2PC、3PC、Paxos、Raft、ZAB ,不然可能看的吃力。

4.1 ZAB 協(xié)議介紹

ZAB (Zookeeper Atomic Broadcast 原子廣播協(xié)議) 協(xié)議是為分布式協(xié)調(diào)服務(wù)ZooKeeper專(zhuān)門(mén)設(shè)計(jì)的一種支持崩潰恢復(fù)的一致性協(xié)議。基于該協(xié)議,ZooKeeper 實(shí)現(xiàn)了一種主從模式的系統(tǒng)架構(gòu)來(lái)保持集群中各個(gè)副本之間的數(shù)據(jù)一致性。

分布式系統(tǒng)中l(wèi)eader負(fù)責(zé)外部客戶(hù)端的寫(xiě)請(qǐng)求。follower服務(wù)器負(fù)責(zé)讀跟同步。這時(shí)需要解決倆問(wèn)題。

Leader 服務(wù)器是如何把數(shù)據(jù)更新到所有的Follower的。

Leader 服務(wù)器突然間失效了,集群咋辦?

因此ZAB協(xié)議為了解決上面兩個(gè)問(wèn)題而設(shè)計(jì)了兩種工作模式,整個(gè) Zookeeper 就是在這兩個(gè)模式之間切換:

原子廣播模式:把數(shù)據(jù)更新到所有的follower。

崩潰恢復(fù)模式:Leader發(fā)生崩潰時(shí),如何恢復(fù)。

4.2 原子廣播模式

你可以認(rèn)為消息廣播機(jī)制是簡(jiǎn)化版的 2PC協(xié)議,就是通過(guò)如下的機(jī)制保證事務(wù)的順序一致性的。

leader從客戶(hù)端收到一個(gè)寫(xiě)請(qǐng)求后生成一個(gè)新的事務(wù)并為這個(gè)事務(wù)生成一個(gè)唯一的ZXID,

leader將將帶有 zxid 的消息作為一個(gè)提案(proposal)分發(fā)給所有 FIFO隊(duì)列。

FIFO隊(duì)列取出隊(duì)頭proposal給follower節(jié)點(diǎn)。

當(dāng) follower 接收到 proposal,先將 proposal 寫(xiě)到硬盤(pán),寫(xiě)硬盤(pán)成功后再向 leader 回一個(gè) ACK。

FIFO隊(duì)列把ACK返回給Leader。

當(dāng)leader收到超過(guò)一半以上的follower的ack消息,leader會(huì)進(jìn)行commit請(qǐng)求,然后再給FIFO發(fā)送commit請(qǐng)求。

當(dāng)follower收到commit請(qǐng)求時(shí),會(huì)判斷該事務(wù)的ZXID是不是比歷史隊(duì)列中的任何事務(wù)的ZXID都小,如果是則提交,如果不是則等待比它更小的事務(wù)的commit(保證順序性)

4.3 崩潰恢復(fù)

消息廣播過(guò)程中,Leader 崩潰了還能保證數(shù)據(jù)一致嗎?當(dāng) Leader 崩潰會(huì)進(jìn)入崩潰恢復(fù)模式。其實(shí)主要是對(duì)如下兩種情況的處理。

Leader 在復(fù)制數(shù)據(jù)給所有 Follwer 之后崩潰,咋搞?

Leader 在收到 Ack 并提交了自己,同時(shí)發(fā)送了部分 commit 出去之后崩潰咋辦?

針對(duì)此問(wèn)題,ZAB 定義了 2 個(gè)原則:

ZAB 協(xié)議確保執(zhí)行那些已經(jīng)在 Leader 提交的事務(wù)最終會(huì)被所有服務(wù)器提交。

ZAB 協(xié)議確保丟棄那些只在 Leader 提出/復(fù)制,但沒(méi)有提交的事務(wù)。

至于如何實(shí)現(xiàn)確保提交已經(jīng)被 Leader 提交的事務(wù),同時(shí)丟棄已經(jīng)被跳過(guò)的事務(wù)呢?關(guān)鍵點(diǎn)就是依賴(lài)上面說(shuō)到過(guò)的 ZXID了。

4.4 ZAB 特性

一致性保證

可靠提交(Reliable delivery) :如果一個(gè)事務(wù) A 被一個(gè)server提交(committed)了,那么它最終一定會(huì)被所有的server提交

全局有序(Total order)

假設(shè)有A、B兩個(gè)事務(wù),有一臺(tái)server先執(zhí)行A再執(zhí)行B,那么可以保證所有server上A始終都被在B之前執(zhí)行

因果有序(Causal order)

如果發(fā)送者在事務(wù)A提交之后再發(fā)送B,那么B必將在A之后執(zhí)行

高可用性

只要大多數(shù)(法定數(shù)量)節(jié)點(diǎn)啟動(dòng),系統(tǒng)就行正常運(yùn)行

可恢復(fù)性

當(dāng)節(jié)點(diǎn)下線(xiàn)后重啟,它必須保證能恢復(fù)到當(dāng)前正在執(zhí)行的事務(wù)

4.5 ZAB 和 Paxos 對(duì)比

相同點(diǎn):

兩者都存在一個(gè)類(lèi)似于 Leader 進(jìn)程的角色,由其負(fù)責(zé)協(xié)調(diào)多個(gè) Follower 進(jìn)程的運(yùn)行。

Leader 進(jìn)程都會(huì)等待超過(guò)半數(shù)的 Follower 做出正確的反饋后,才會(huì)將一個(gè)提案進(jìn)行提交。

ZAB 協(xié)議中,每個(gè) Proposal 中都包含一個(gè) epoch 值來(lái)代表當(dāng)前的 Leader周期,Paxos 中名字為 Ballot

不同點(diǎn):

ZAB 用來(lái)構(gòu)建高可用的分布式數(shù)據(jù)主備系統(tǒng)(Zookeeper),Paxos 是用來(lái)構(gòu)建分布式一致性狀態(tài)機(jī)系統(tǒng)。

5 ZooKeeper 零散知識(shí)

5.1 常見(jiàn)指令

Zookeeper 有三種部署模式:

單機(jī)部署:一臺(tái)機(jī)器上運(yùn)行。

集群部署:多臺(tái)機(jī)器運(yùn)行。

偽集群部署:一臺(tái)機(jī)器啟動(dòng)多個(gè) Zookeeper 實(shí)例運(yùn)行。

部署完畢后常見(jiàn)指令如下:

命令基本語(yǔ)法功能描述

help顯示所有操作命令

ls path [watch]顯示所有操作命令

ls path [watch]查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)并能看到更新次數(shù)等數(shù)據(jù)

create普通創(chuàng)建, -s 含有序列,

-e 臨時(shí)(重啟或者超時(shí)消失)

get path [watch]獲得節(jié)點(diǎn)的值

set設(shè)置節(jié)點(diǎn)的具體值

stat查看節(jié)點(diǎn)狀態(tài)

delete刪除節(jié)點(diǎn)

rmr遞歸刪除節(jié)點(diǎn)

5.2 Zookeeper客戶(hù)端

5.2.1. Zookeeper原生客戶(hù)端

Zookeeper客戶(hù)端是異步的哦!需要引入CountDownLatch 來(lái)確保連接好了再做下面操作。Zookeeper原生api是不支持迭代式的創(chuàng)建跟刪除路徑的,具有如下弊端。

會(huì)話(huà)的連接是異步的;必須用到回調(diào)函數(shù) 。

Watch需要重復(fù)注冊(cè):看一次watch注冊(cè)一次 。

Session重連機(jī)制:有時(shí)session斷開(kāi)還需要重連接。

開(kāi)發(fā)復(fù)雜性較高:開(kāi)發(fā)相對(duì)來(lái)說(shuō)比較瑣碎。

5.2.2. ZkClient

開(kāi)源的zk客戶(hù)端,在原生API基礎(chǔ)上封裝,是一個(gè)更易于使用的zookeeper客戶(hù)端,做了如下優(yōu)化。

優(yōu)化一 、在session loss和session expire時(shí)自動(dòng)創(chuàng)建新的ZooKeeper實(shí)例進(jìn)行重連。優(yōu)化二、 將一次性watcher包裝為持久watcher。

5.2.3. Curator

開(kāi)源的zk客戶(hù)端,在原生API基礎(chǔ)上封裝,apache頂級(jí)項(xiàng)目。是Netflix公司開(kāi)源的一套Zookeeper客戶(hù)端框架。了解過(guò)Zookeeper原生API都會(huì)清楚其復(fù)雜度。Curator幫助我們?cè)谄浠A(chǔ)上進(jìn)行封裝、實(shí)現(xiàn)一些開(kāi)發(fā)細(xì)節(jié),包括接連重連、反復(fù)注冊(cè)Watcher和NodeExistsException等。目前已經(jīng)作為Apache的頂級(jí)項(xiàng)目出現(xiàn),是最流行的Zookeeper客戶(hù)端之一。

5.2.4. Zookeeper圖形化客戶(hù)端工具

工具名叫ZooInspector,百度安裝教程即可。

5.3 ACL 權(quán)限控制機(jī)制

ACL全稱(chēng)為Access Control List 即訪問(wèn)控制列表,用于控制資源的訪問(wèn)權(quán)限。zookeeper利用ACL策略控制節(jié)點(diǎn)的訪問(wèn)權(quán)限,如節(jié)點(diǎn)數(shù)據(jù)讀寫(xiě)、節(jié)點(diǎn)創(chuàng)建、節(jié)點(diǎn)刪除、讀取子節(jié)點(diǎn)列表、設(shè)置節(jié)點(diǎn)權(quán)限等。

5.4 Zookeeper使用注意事項(xiàng)

集群中機(jī)器的數(shù)量并不是越多越好,一個(gè)寫(xiě)操作需要半數(shù)以上的節(jié)點(diǎn)ack,所以集群節(jié)點(diǎn)數(shù)越多,整個(gè)集群可以抗掛點(diǎn)的節(jié)點(diǎn)數(shù)越多(越可靠),但是吞吐量越差。集群的數(shù)量必須為奇數(shù)。

zk是基于內(nèi)存進(jìn)行讀寫(xiě)操作的,有時(shí)候會(huì)進(jìn)行消息廣播,因此不建議在節(jié)點(diǎn)存取容量比較大的數(shù)據(jù)。

dataDir目錄、dataLogDir兩個(gè)目錄會(huì)隨著時(shí)間推移變得龐大,容易造成硬盤(pán)滿(mǎn)了。建議自己編寫(xiě)或使用自帶的腳本保留最新的n個(gè)文件。

默認(rèn)最大連接數(shù) 默認(rèn)為60,配置maxClientCnxns參數(shù),配置單個(gè)客戶(hù)端機(jī)器創(chuàng)建的最大連接數(shù)。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6761

    瀏覽量

    88619
  • 開(kāi)源
    +關(guān)注

    關(guān)注

    3

    文章

    3185

    瀏覽量

    42241
  • 監(jiān)聽(tīng)器
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    14424
  • zookeeper
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    3656

原文標(biāo)題:講解 Zookeeper 的五個(gè)核心知識(shí)點(diǎn)

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    模擬電子技術(shù)知識(shí)點(diǎn)問(wèn)題總結(jié)概覽

    給大家分享模擬電子技術(shù)知識(shí)點(diǎn)問(wèn)題總結(jié)。
    的頭像 發(fā)表于 05-08 15:16 ?1037次閱讀
    模擬電子技術(shù)<b class='flag-5'>知識(shí)點(diǎn)</b>問(wèn)題總結(jié)概覽

    深度解析汽車(chē)傳感器核心知識(shí)點(diǎn)

    敏感元件指?jìng)鞲衅髦心苤苯痈惺芑蝽憫?yīng)被測(cè)量的部分,是傳感器的核心,它的作用是直接感受被測(cè)物理量,并將信號(hào)進(jìn)行必要的轉(zhuǎn)換輸出。 轉(zhuǎn)換元件指?jìng)鞲衅髦心軐⒚舾性惺芑蝽憫?yīng)的被測(cè)量轉(zhuǎn)換成適于傳輸或測(cè)量的電信號(hào)部分。
    <b class='flag-5'>深度</b><b class='flag-5'>解析</b>汽車(chē)傳感器<b class='flag-5'>核心知識(shí)點(diǎn)</b>

    收藏!IGBT7系列分立器件核心知識(shí)點(diǎn)最全整理!

    英飛凌IGBT7單管系列,作為目前炙手可熱的光儲(chǔ)應(yīng)用新星產(chǎn)品,正受到眾多玩家的追捧。本篇文章特地為大家貼心整理該系列產(chǎn)品的核心知識(shí)大全,希望大家買(mǎi)得放心,用得順手~ 更全型號(hào)選擇,總有一款適合你
    的頭像 發(fā)表于 03-13 15:14 ?396次閱讀
    收藏!IGBT7系列分立器件<b class='flag-5'>核心知識(shí)點(diǎn)</b>最全整理!

    IGBT7系列分立器件核心知識(shí)點(diǎn)最全整理!

    英飛凌IGBT7單管系列,作為目前炙手可熱的光儲(chǔ)應(yīng)用新星產(chǎn)品,正受到眾多玩家的追捧。本篇文章特地為大家貼心整理該系列產(chǎn)品的核心知識(shí)大全,希望大家買(mǎi)得放心,用得順手~更全型號(hào)選擇,總有一款適合你
    的頭像 發(fā)表于 02-23 08:13 ?416次閱讀
    IGBT7系列分立器件<b class='flag-5'>核心知識(shí)點(diǎn)</b>最全整理!

    淺談初級(jí)電工必備知識(shí)點(diǎn)

    對(duì)于初學(xué)電工的朋友來(lái)說(shuō),掌握一些基礎(chǔ)且實(shí)用的知識(shí)點(diǎn)是非常重要的。本文旨在分享初級(jí)電工應(yīng)該掌握的核心知識(shí),幫助新手電工更好地入門(mén)和提升技能。
    的頭像 發(fā)表于 12-26 10:44 ?952次閱讀

    TCP協(xié)議面試常問(wèn)知識(shí)點(diǎn)總結(jié)

    TCP 作為傳輸層的協(xié)議,是一個(gè)IT工程師素養(yǎng)的體現(xiàn),也是面試中經(jīng)常被問(wèn)到的知識(shí)點(diǎn)。在此,我將 TCP 核心的一些問(wèn)題梳理了一下,希望能幫到各位。
    的頭像 發(fā)表于 12-15 10:38 ?711次閱讀
    TCP協(xié)議面試常問(wèn)<b class='flag-5'>知識(shí)點(diǎn)</b>總結(jié)

    SQL核心知識(shí)點(diǎn)總結(jié)

    SQL:Structure Query Language。(結(jié)構(gòu)化查詢(xún)語(yǔ)言),通過(guò)sql操作數(shù)據(jù)庫(kù)(操作數(shù)據(jù)庫(kù),操作表,操作數(shù)據(jù))
    的頭像 發(fā)表于 12-13 10:28 ?1229次閱讀
    SQL<b class='flag-5'>核心知識(shí)點(diǎn)</b>總結(jié)

    開(kāi)關(guān)模式下的電源電流如何檢測(cè)?這12個(gè)電路&amp;10個(gè)知識(shí)點(diǎn)講明白了

    開(kāi)關(guān)模式下的電源電流如何檢測(cè)?這12個(gè)電路&10個(gè)知識(shí)點(diǎn)講明白了
    的頭像 發(fā)表于 12-06 16:04 ?718次閱讀
    開(kāi)關(guān)模式下的電源電流如何檢測(cè)?這12<b class='flag-5'>個(gè)</b>電路&amp;10<b class='flag-5'>個(gè)</b><b class='flag-5'>知識(shí)點(diǎn)</b>講明白了

    zookeeper核心配置文件是什么

    Zookeeper是一個(gè)常用的分布式協(xié)調(diào)服務(wù),它被廣泛應(yīng)用于大型分布式系統(tǒng)中。Zookeeper核心配置文件是zoo.cfg,它包含了Zookee
    的頭像 發(fā)表于 12-04 10:33 ?650次閱讀

    zookeeper引入什么機(jī)制

    Zookeeper是一個(gè)開(kāi)源的分布式協(xié)調(diào)服務(wù),被廣泛應(yīng)用于構(gòu)建分布式系統(tǒng)和大規(guī)模集群的管理。作為一個(gè)分布式協(xié)調(diào)服務(wù),Zookeeper引入了一系列機(jī)制來(lái)提供可靠的協(xié)調(diào)和一致性服務(wù)。在這
    的頭像 發(fā)表于 12-03 16:38 ?769次閱讀

    數(shù)字電位計(jì)知識(shí)點(diǎn)

    電子發(fā)燒友網(wǎng)站提供《數(shù)字電位計(jì)知識(shí)點(diǎn).pdf》資料免費(fèi)下載
    發(fā)表于 11-24 16:08 ?7次下載
    數(shù)字電位計(jì)<b class='flag-5'>知識(shí)點(diǎn)</b>

    三菱和西門(mén)子PLC輸入接線(xiàn)知識(shí)點(diǎn)

    三菱和西門(mén)子PLC輸入接線(xiàn)知識(shí)點(diǎn)
    的頭像 發(fā)表于 11-21 10:01 ?670次閱讀
    三菱和西門(mén)子PLC輸入接線(xiàn)<b class='flag-5'>知識(shí)點(diǎn)</b>

    OFDM技術(shù)知識(shí)點(diǎn)

    電子發(fā)燒友網(wǎng)站提供《OFDM技術(shù)知識(shí)點(diǎn).rar》資料免費(fèi)下載
    發(fā)表于 11-18 14:25 ?0次下載
    OFDM技術(shù)<b class='flag-5'>知識(shí)點(diǎn)</b>

    Linux文件系統(tǒng)知識(shí)點(diǎn)詳解

    今天浩道跟大家分享關(guān)于Linux文件及目錄屬性知識(shí)點(diǎn)的硬核干貨,可以說(shuō)只要你認(rèn)真看完這篇文章內(nèi)容,其相關(guān)知識(shí)點(diǎn)都不在話(huà)下,感興趣又想快速掌握的小伙伴們,可以收藏起來(lái)隨時(shí)查看!
    的頭像 發(fā)表于 11-02 09:29 ?597次閱讀
    Linux文件系統(tǒng)<b class='flag-5'>知識(shí)點(diǎn)</b>詳解

    51單片機(jī)的知識(shí)點(diǎn)

    電子發(fā)燒友網(wǎng)站提供《51單片機(jī)的知識(shí)點(diǎn).pdf》資料免費(fèi)下載
    發(fā)表于 11-01 17:32 ?2次下載