摘要:當服務端的一些操作觸發了事件監聽,就會向指定的客戶端發送事件通知。因此,使用的監聽機制實現的發布訂閱系統使用的推拉結合的方式。
本文主要對zookeeper的數據模型Znode進行的簡要說明 主要內容:
1. zk的主要應用場景 2. zk的數據節點的概述
數據節點的類型
節點的數據結構
節點上的監聽機制
1. zk的主要應用場景數據的發布與訂閱
負載均衡
統一命名服務
分布式協調與通知
集群管理
master選舉
分布式鎖與分布式隊列
具體將在后續的文章中給出具體的應用介紹。
2. zk的數據節點的概述在介紹數據節點之前,先給大家說明一下zk中事務的概念。zk中的事務指的是能夠改變zk服務器狀態的操作,包括
數據節點的刪除,創建和內容更新等
客戶端會話的創建與失效
zk中還有一個事務id的概念,會為每次事務請求分配一個全局唯一的id,關于事務id的特點簡要說明如下:
2.1 zk數據節點的類型64位數字
高32是Leader統治時期的標識,說明該事務是在哪個Leader時期進行的
低32位是事務的id號
通過這64位數字可以確定一個事務請求的全局唯一的順序
zk中的數據節點是有生命周期的概念的,根據生命周期的不同可以劃分為兩種類型的節點
2.2 節點的數據結構持久節點(Persistent)
最常見的一種節點類型,也叫做regular節點。數據節點一旦被創建,就會一直存在于zk服務器上,直到有刪除事務操作主動清除該節點
臨時節點(Ephemeral)
臨時節點的生命周期是和客戶端會話綁定在一起的,只要客戶端會話失效,那么臨時節點就會被清除。這里的客戶端會話失效和客戶端tcp連接斷開是不一樣的。
臨時節點只能是leaf節點順序節點(Sequential)
zk會給創建的節點自動加上一個數字后綴,作為一個完整的節點名稱,這種方式可以維護節點之間的一種順序性
持久節點+順序節點
臨時節點+順序節點
數據節點的類結構代碼如下:
public class DataNode implements Record { byte data[]; //節點上存儲的數據 Long acl; //權限控制列表版本號 public StatPersisted stat; //節點狀態信息 private Setchildren = null; //節點的子節點列表 }
StatPersisted stat是該節點的狀態信息類,類結構代碼如下:
public class StatPersisted implements Record { private long czxid; //創建該節點的事務id private long mzxid; //最后一次修改節點的事務id private long ctime; //節點的創建時間 private long mtime; //最后一次更新節點內容的時間 private int version; //數據節點的版本號,version=0表示該節點被創建之后,更新過0次,在實現樂觀鎖的時候有用 private int cversion; //子節點的版本號,只有當子節點列表被更改后,才會+1 private int aversion; //子節點的acl列表版本號 private long ephemeralOwner; //如果是臨時節點,該值表示創建該節點的臨時會話的sessionID,如果是持久節點的話,該值為0 private long pzxid; //子節點列表最后一次被修改時的事務id,一定是子節點列表被修改,子節點的內容被修改是不會改變這個屬性的值的 }2.3 節點上的監聽機制
zookeeper允許客戶端對象在數據節點上注冊事件監聽,可以實現數據的發布與訂閱。
當zk服務端的一些操作觸發了事件監聽Watcher,就會向指定的客戶端發送事件通知。
zk中的事件監聽機制由三部分組成:
zk服務端
客戶端線程
客戶端的WatcherManager
客戶端線程在zk服務器上注冊事件監聽之后,會將這個watcher對象存儲在WatcherManager中,當zk服務器觸發這個事件之后,會向客戶端發送通知,客戶端線程會從WatcherManager中取出對應的Watcher對象來執行回調邏輯。
監聽器的接口類Watcher代碼如下public interface Watcher{ public interface Event{ public enum KeeperState{ Disconnected(0), //斷開連接 SyncConnected(3), //此時客戶端與zk服務器處于連接狀態 AuthFailed(4), //權限檢查失敗 ConnectedReadOnly(5) //客戶端和一臺只讀server處于連接狀態,what is readonly server? 就是只和集群中的一小部分服務器處于連接的服務器 Expired(-122) //會話超時 } public enum EventType{ None (-1), NodeCreated (1), //watcher監聽的數據節點被創建 NodeDeleted (2), //watcher監聽的數據節點被刪除 NodeDataChanged (3), //watcher監聽的數據節點內容被更新 NodeChildrenChanged (4), //watcher監聽的數據節點的子節點列表被更新了 DataWatchRemoved (5), ChildWatchRemoved (6); } } public enum WatcherType{ Children (1), Data (2), Any (3); } abstract public void process(WatchedEvent event); }
主要有以下幾個部分組成
Watcher.Event.KeeperState: 表示通知狀態
Watcher.Event.EventType: 表示通知的事件類型
Watcher.WatcherType: 監聽器的類型
process(WatchedEvent event) 事件的回調函數
在處理監聽事件的回調函數process中,參數event是一個org.apache.zookeeper.WatchedEvent類型的參數。WatchedEvent說明如下
public class WatchedEvent { final private KeeperState keeperState; //通知的狀態 final private EventType eventType; //事件類型 private String path; //參與該事件的節點路徑 /** *實現WatchedEvent到WatcherEvent的轉換 */ public WatcherEvent getWrapper() { return new WatcherEvent(eventType.getIntValue(), keeperState.getIntValue(), path); } /** *實現WatcherEvent到WatchedEvent的轉換 */ public WatchedEvent(WatcherEvent eventMessage) { keeperState = KeeperState.fromInt(eventMessage.getState()); eventType = EventType.fromInt(eventMessage.getType()); path = eventMessage.getPath(); } }
從WatchedEvent的代碼中可以看出一個監聽事件由三個部分組成的:
Watcher.Event.KeeperState:通知狀態
Watcher.Event.EventType:通知類型
String path:參與該事件的節點路徑
并且,與WatchedEvent對應的還有一個類WatcherEvent,這個WatcherEvent和WatchedEvent相比,只是實現了序列化,方便通過網絡在服務端和客戶端之間傳輸。
序列化使用的是jute
客戶端在服務器數據節點上注冊相應的監聽事件Watcher,注冊的方式后面闡述
服務端操作觸發該事件,生成WatchedEvent事件對象
調用getWrapper方法將WatchedEvent包裝稱為一個實現序列化的、可在網絡上傳輸的WatcherEvent對象
通過網絡將WatcherEvent對象發送到client
client將WatcherEvent對象還原成為一個WatchedEvent對象,并傳遞給process方法進行處理
客戶端接受到的服務器傳送過來的監聽事件的格式如下:
KeeperState:SyncConnected EventType:NodeDataChanged Path: /zk-book
顯然,從接收到的事件中,客戶端是無法獲取到該節點在更新前后的數據的,因此客戶端是要主動再向服務器獲取數據。因此,使用zk的監聽機制實現的發布訂閱系統使用的"推拉"結合的方式。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74052.html
摘要:的設計目標是將那些復雜且容易出錯的分布式一致性服務封裝起來,構成一個高效可靠的原語集,并以一系列簡單易用的接口提供給用戶使用。具有不可分割性即原語的執行必須是連續的,在執行過程中不允許被中斷。 該文已加入開源文檔:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識)。地址:https://github.com/Snailclimb... showImg(https:...
摘要:協調服務的功能在分布式架構中,每個服務器或者服務之間信息的協調和管理是非常有必要的常見的分布式協調服務有的,的因為谷歌的是不開源的,后來雅虎模仿它開發了,并捐贈給,并將其開源供大家使用我們先從的幾個功能來了解名稱服務什么是名稱服務比如將域名 協調服務的功能 在分布式架構中,每個服務器或者服務之間信息的協調和管理是非常有必要的 常見的分布式協調服務有Google的Chubby,Apach...
摘要:除此之外,它嚴格的序列訪問控制意味著復雜的控制原語可以應用在客戶端上。版本號對節點的每一個操作都將致使這個節點的版本號增加。事件是一次性的觸發器,當的對象狀態發生改變時,將會觸發此對象上所對應的事件。節點事件節點的建立,刪除,數據的修改。 目錄 一、ZooKeeper概述 二、ZooKeeper數據模型 三、ZooKeeper服務中操作 四、Watch觸發器 五、ZooKeeper應用...
摘要:具有不可分割性即原語的執行必須是連續的,在執行過程中不允許被中斷。提供服務主要就是通過數據結構原語集機制達到的。子節點的版本號數據節點版本號版本號創建該節點的會話的。后位則為遞增序列。 前言 最近加入了部門的技術興趣小組,被分配了Zookeeper的研究任務。在研究過程當中,發現Zookeeper由于其開源的特性和其卓越的性能特點,在業界使用廣泛,有很多的應用場景,而這些不同的應用場景...
摘要:之后服務器等待其他服務器的反饋,一旦超過半數的服務器進行了正確的反饋,那么就會再次向所有的服務器分發消息,要求其將前一個進行提交。協議包括兩種基本的模式,分別是崩潰恢復和消息廣播。 前言 zookeeper本質上就是一個分布式協調服務,用來解決分布式一致性的問題。 本文適合有一定分布式基礎的讀者閱讀。什么叫相關的基礎呢?起碼你得知道系統架構為何從集中式演變成了分布式,分布式有哪些優點...
閱讀 2458·2021-11-19 09:40
閱讀 3586·2021-11-17 17:08
閱讀 3784·2021-09-10 10:50
閱讀 2214·2019-08-27 10:56
閱讀 1942·2019-08-27 10:55
閱讀 2638·2019-08-26 12:14
閱讀 994·2019-08-26 11:58
閱讀 1493·2019-08-26 10:43