新聞中心
Zookeeper用例:ready znode與配置改變
站在用戶的角度思考問題,與客戶深入溝通,找到開封網(wǎng)站設(shè)計與開封網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋開封地區(qū)。
ZooKeeper中,新的leader可以將某個path指定為ready znode。 其他節(jié)點將僅在該znode存在時使用配置。
當(dāng)leader 重建配置之后,會通知其他副本重建配置,并新建ready znode.
副本為了防止出現(xiàn)不一致,必須在重建配置時,處理完其之前的所有事務(wù)。保證所有服務(wù)的狀態(tài)一致。
任何一個副本更新失敗,都不能夠應(yīng)用都需要進(jìn)行重試。
Zookeeper用例:鎖
下面的偽代碼向我們鎖的實現(xiàn)。通過create試圖持有鎖,如果鎖已經(jīng)被其他的client持有,則通過watch方式監(jiān)控鎖的釋放。
acquire lock:
retry:
r = create("app/lock", "", empheral)
if r:
return
else:
getData("app/lock", watch=True)
watch_event:
goto retry
release lock:
delete("app/lock")
由于上面的偽代碼可能會出現(xiàn)羊群效應(yīng),可以嘗試下面的方式
znode下方的children中,序號最低的的是持有鎖的
其他在等待的client只watch前一個znode的變化,避免了羊群效應(yīng)
acquire lock:
n = create("app/lock/request-", "", empheral|sequential)
retry:
requests = getChildren(l, false)
if n is lowest znode in requests:
return
p = "request-%d" % n - 1
if exists(p, watch = True)
goto retry
watch_event:
goto retry
Zookeeper簡化程序構(gòu)建但其不是最終的解決方案
應(yīng)用程序還有許多需要解決的問題
例如如果我們要在GFS中使用Zookeeper,那么我們還需要
chunks的副本方案
primary失敗的協(xié)議
…
但是使用了Zookeeper,至少可以使master容錯,不會發(fā)生網(wǎng)絡(luò)分區(qū)腦裂的問題
Zookeeper實現(xiàn)細(xì)節(jié)
和lab3相似,具有兩層
ZooKeeper 服務(wù)層 (K/V 層)
ZAB 層 (Raft 層)
Start() 在底層執(zhí)行插入操作
隨后,ops從每個副本服務(wù)器的底層彈出,這些操作按照彈出的順序提交(commited),在lab3中使用apply channel,在ZAB層中,通過調(diào)用abdeliver()
挑戰(zhàn):處理重復(fù)的客戶端請求
場景:primary收到客戶端請求后,返回失敗,客戶端進(jìn)行重試
在lab3中,我們使用了map來解決重復(fù)的請求問題,但是每一個客戶端是堵塞的,只能夠等待完成才能進(jìn)行下一個
在Zookeeper中,在一段時間內(nèi)的操作是冪等的,以最后一次操作為準(zhǔn)
挑戰(zhàn): 讀取操作的效率
大部分的操作都是讀取操作,他們不修改狀態(tài)
讀取操作是否必須通過ZAB層?
任何副本服務(wù)器都可以執(zhí)行讀取操作?
如果讀取操作通過Raft/ZAB層,則性能會降低
讀取操作如果不通過Raft/ZAB層、可能會返回過時的數(shù)據(jù)
Zookeeper解決方案:允許返回過時的數(shù)據(jù)
讀取可以由任何副本執(zhí)行
讀取吞吐量隨著服務(wù)器數(shù)量的增加而增加
讀取返回它看到的最后一個zxid
只有sync-read() 保證數(shù)據(jù)不過時
read操作會返回zxid,zxid包含了部分客戶端對于此read請求相對應(yīng)的write請求的順序,從而客戶端能夠了解此server操作是否落后于client。
心跳檢測以及建立session時都會返回zxid,當(dāng)客戶端連接服務(wù)器時,通過zxid對比保證client與server的狀態(tài)足夠接近
總結(jié)
Zookeeper通過將wait-free對象(znode對象)暴露給客戶端解決分布式系統(tǒng)中的進(jìn)程協(xié)調(diào)問題
Zookeeper保證了write操作的線性一致性以及客戶端操作的FIFO順序
Zookeeper通過允許讀取操作返回過時數(shù)據(jù)實現(xiàn)了每秒數(shù)十萬次操作的吞吐量值,適用于多讀而少些的場景
Zookeeper仍然提供了保證讀一致性的sync操作
Zookeeper具有強(qiáng)大的API功能用于多樣的應(yīng)用場景,并且內(nèi)在提供主從容錯機(jī)制,在包括雅虎在內(nèi)的多家公司廣泛應(yīng)用
網(wǎng)頁標(biāo)題:Zookeeper的應(yīng)用場景
新聞來源:http://www.dlmjj.cn/article/ghigpp.html