這些Server組成了Zookeeper service鹅颊,他們必須相互知道尸昧。只有要大于半數(shù)的server存活直焙,那么Zookeeper service就能提供服務(wù)袒啼。
Data model and the hierarchical namespace(數(shù)據(jù)模型和分層的namespace)
這些Server組成了Zookeeper service锉试,他們必須相互知道。只有要大于半數(shù)的server存活揍移,那么Zookeeper service就能提供服務(wù)次和。
Data model and the hierarchical namespace(數(shù)據(jù)模型和分層的namespace)
Zookeeper提供的namespace和標準的file system很相識,每一個path元素都是通過一個/分隔那伐,在zookeeper中的namespace都是一個唯一踏施。
與文件系統(tǒng)不同的是,Zookeeper的namespace能夠存儲數(shù)據(jù)罕邀,并且可以有子節(jié)點畅形;和文件系統(tǒng)相同的是可以做為一個目錄。
Zookeeper被設(shè)計用來存儲系統(tǒng)數(shù)據(jù)诉探,eg: 狀態(tài)信息日熬,配置信息,定位信息…阵具,所以這些數(shù)據(jù)通常都非常的小碍遍。
ZooKeeper目錄樹中每一個節(jié)點對應(yīng)一個Znode定铜。每個Znode維護著一個屬性結(jié)構(gòu),它包含著版本號(dataVersion)怕敬,時間戳(ctime,mtime)等狀態(tài)信息揣炕。ZooKeeper正是使用節(jié)點的這些特性來實現(xiàn)它的某些特定功能。每當Znode的數(shù)據(jù)改變時东跪,他相應(yīng)的版本號將會增加畸陡。每當客戶端檢索數(shù)據(jù)時,它將同時檢索數(shù)據(jù)的版本號虽填。并且如果一個客戶端執(zhí)行了某個節(jié)點的更新或刪除操作丁恭,他也必須提供要被操作的數(shù)據(jù)版本號。如果所提供的數(shù)據(jù)版本號與實際不匹配斋日,那么這個操作將會失敗牲览。
Znode是客戶端訪問ZooKeeper的主要實體,它包含以下幾個特征:
(1)Watches
客戶端可以在節(jié)點上設(shè)置watch(我們稱之為監(jiān)視器)恶守。當節(jié)點狀態(tài)發(fā)生改變時(數(shù)據(jù)的增第献、刪、改)將會觸發(fā)watch所對應(yīng)的操作兔港。當watch被觸發(fā)時庸毫,ZooKeeper將會向客戶端發(fā)送且僅發(fā)送一條通知,因為watch只能被觸發(fā)一次衫樊。
(2)數(shù)據(jù)訪問
ZooKeeper中的每個節(jié)點存儲的數(shù)據(jù)要被原子性的操作飒赃。也就是說讀操作將獲取與節(jié)點相關(guān)的所有數(shù)據(jù),寫操作也將替換掉節(jié)點的所有數(shù)據(jù)科侈。另外载佳,每一個節(jié)點都擁有自己的ACL(訪問控制列表),這個列表規(guī)定了用戶的權(quán)限兑徘,即限定了特定用戶對目標節(jié)點可以執(zhí)行的操作刚盈。
(3)節(jié)點類型
ZooKeeper中的節(jié)點有兩種,分別為臨時節(jié)點和永久節(jié)點挂脑。節(jié)點的類型在創(chuàng)建時即被確定,并且不能改變欲侮。
ZooKeeper的臨時節(jié)點:該節(jié)點的生命周期依賴于創(chuàng)建它們的會話崭闲。一旦會話結(jié)束,臨時節(jié)點將被自動刪除威蕉,當然可以也可以手動刪除刁俭。另外,需要注意是韧涨, ZooKeeper的臨時節(jié)點不允許擁有子節(jié)點牍戚。
ZooKeeper的永久節(jié)點:該節(jié)點的生命周期不依賴于會話侮繁,并且只有在客戶端顯示執(zhí)行刪除操作的時候,他們才能被刪除如孝。
(4)順序節(jié)點(唯一性的保證)
當創(chuàng)建Znode的時候宪哩,用戶可以請求在ZooKeeper的路徑結(jié)尾添加一個遞增的計數(shù)。這個計數(shù)對于此節(jié)點的父節(jié)點來說是唯一的第晰,它的格式為”%10d”(10位數(shù)字锁孟,沒有數(shù)值的數(shù)位用0補充,例如”0000000001”)茁瘦。當計數(shù)值大于232-1時品抽,計數(shù)器將溢出。