您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關zookeeper機制的原理是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
zookeeper機原理(長連接):
Zookeeper 并不是用來專門存儲數據的,它的作用主要是用來維護和監控你存儲的數據的狀態變化。通過監控這些數據狀態的變化,從而可以達到基于數據的集群管。當對目錄節點監控狀態打開時,一旦目錄節點的狀態發生變化,Watcher 對象的 process 方法就會被調用。
(任何實現org.apache.zookeeper.Watcher類,持有zookeeper實例對象,只要調用zookeeper的方法,并且監控相應節點類型,
那么zookeeper服務端該節點發生變化會通知到觀察者(觀察者重寫方法process會被調用))
zk = new ZooKeeper(zookeeperQuorum, sessionTimeout, this);
zookeeperQuorum=IP+端口(xxx.xxx.xxx.xxx:2181,xxx.xxx.xxx.xxx:2181,xxx.xxx.xxx.xxx:2181)多個逗號隔開
可以設置觀察的操作:exists,getChildren,getData
可以觸發觀察的操作:create,delete,setData
zookeeper觀察機制;
服務端只存儲事件的信息,客戶端存儲事件的信息和Watcher的執行邏輯.ZooKeeper客戶端是線程安全的每一個應用只需要實例化一個ZooKeeper客戶端即可,同一個ZooKeeper客戶端實例可以在不同的線程中使用。ZooKeeper客戶端會將這個Watcher對應Path路徑存儲在ZKWatchManager中,同時通知ZooKeeper服務器記錄該Client對應的Session中的Path下注冊的事件類型。當ZooKeeper服務器發生了指定的事件后,ZooKeeper服務器將通知ZooKeeper客戶端哪個節點下發生事件類型,ZooKeeper客戶端再從ZKWatchManager中找到相應Path,取出相應watcher引用執行其回調函數process。
源碼分析如:
zookeeper.java
wcb = new DataWatchRegistration(watcher, clientPath);//將觀察者引用和節點路徑綁定
ZKWatchManager.java
public void register(int rc) {
if (shouldAddWatch(rc)) {
Map<String, Set<Watcher>> watches = getWatches(rc);
synchronized(watches) {
Set<Watcher> watchers = watches.get(clientPath);
if (watchers == null) {
watchers = new HashSet<Watcher>();
watches.put(clientPath, watchers);//key為path,value為watcher引用
}
watchers.add(watcher);
}
}
}
znode存儲數據量最大:jute.maxbuffer默認1M
通知注意點:
1.一次性觸發器(可以通過定時調用方法 get() 或者 exists()獲取觸發事件,手動訪問觸發,)
client在一個節點上設置watch,隨后節點內容改變,client將獲取事件。當節點內容再次改變,client不會獲取這個事件,除非它又執行了一次讀操作并設置watch
2.發送至client,watch事件延遲
watch事件異步發送至觀察者。比如說client執行一次寫操作,節點數據內容發生變化,操作返回后,而watch事件可能還在發往client的路上。這種情況下,zookeeper提供有序保證:client不會得知數據變化,直到它獲取watch事件。網絡延遲或其他因素可能導致不同client在不同時刻獲取watch事件和操作返回值。
循環調用:
Watcher watcher = loopWatch?this:null;
byte[] newdata = keeper.getData(path, watcher, null);//實現改變再次提醒!!
應用場景:
Zookeeper 從設計模式角度來看,是一個基于觀察者模式設計的分布式服務管理框架,它負責存儲和管理大家都關心的數據,然后接受觀察者的注冊,一旦這些數據的狀態發生變化,Zookeeper 就將負責通知已經在 Zookeeper 上注冊的那些觀察者做出相應的反應。
通知者模式:
發布者持有訂閱者的句柄引用,一單狀態變化,調用訂閱者接口,實現通知模式調用。
zookeeper 操作API:
客戶端要連接 Zookeeper 服務器可以通過創建 org.apache.zookeeper. ZooKeeper 的一個實例對象,然后調用這個類提供的接口來和服務器交互
ZooKeeper 主要是用來維護和監控一個目錄節點樹中存儲的數據的狀態。
目錄節點類型:
PERSISTENT:持久化目錄節點,這個目錄節點存儲的數據不會丟失
PERSISTENT_SEQUENTIAL:順序自動編號的目錄節點,這種目錄節點會根據當前已近存在的節點數自動加 1
EPHEMERAL:臨時目錄節點,一旦創建這個節點的客戶端與服務器端口也就是 session 超時或者斷口,這種節點會被自動刪除
EPHEMERAL_SEQUENTIAL:臨時自動編號節點
節點狀態(Stat):
private long czxid;
private long mzxid;
private long ctime;
private long mtime;
private int version;
private int cversion;
private int aversion;
private long ephemeralOwner;
private int dataLength;
private int numChildren;
private long pzxid;
ZOO_CREATED_EVENT:節點創建事件,需要watch一個不存在的節點,當節點被創建時觸發,此watch通過zoo_exists()設置
ZOO_DELETED_EVENT:節點刪除事件,此watch通過zoo_exists()或zoo_get()設置
ZOO_CHANGED_EVENT:節點數據改變事件,此watch通過zoo_exists()或zoo_get()設置
ZOO_CHILD_EVENT:子節點列表改變事件,此watch通過zoo_get_children()或zoo_get_children2()設置
ZOO_SESSION_EVENT:會話失效事件,客戶端與服務端斷開或重連時觸發
ZOO_NOTWATCHING_EVENT:watch移除事件,服務端出于某些原因不再為客戶端watch節點時觸發
一:集群管理:
1 監控服務器健康
它們的實現方式都是在 Zookeeper 上創建一個 EPHEMERAL 類型的目錄節點,然后每個 Server 在它們創建目錄節點的父目錄節點上調用 getChildren(String path, boolean watch) 方法并設置 watch 為 true,由于是 EPHEMERAL 目錄節點,當創建它的 Server 死去,這個目錄節點也隨之被刪除,所以 Children 將會變化,這時 getChildren上的 Watch 將會被調用,所以其它 Server 就知道已經有某臺 Server 死去了。新增 Server 也是同樣的原理。
2 Master選舉
Zookeeper 如何實現 Leader Election,也就是選出一個 Master Server。和前面的一樣每臺 Server 創建一個 EPHEMERAL 目錄節點,不同的是它還是一個 SEQUENTIAL 目錄節點,所以它是個 EPHEMERAL_SEQUENTIAL 目錄節點。之所以它是 EPHEMERAL_SEQUENTIAL 目錄節點,是因為我們可以給每臺 Server 編號,我們可以選擇當前是最小編號的 Server 為 Master,假如這個最小編號的 Server 死去,由于是 EPHEMERAL 節點,死去的 Server 對應的節點也被刪除,所以當前的節點列表中又出現一個最小編號的節點,我們就選擇這個節點為當前 Master。這樣就實現了動態選擇 Master,避免了傳統意義上單 Master 容易出現單點故障的問題。
二:分布式鎖
在同一個進程中很容易實現,但是在跨進程或者在不同 Server 之間就不好實現了。Zookeeper 卻很容易實現這個功能,實現方式也是需要獲得鎖的 Server 創建一個 EPHEMERAL_SEQUENTIAL 目錄節點,然后調用 getChildren方法獲取當前的目錄節點列表中最小的目錄節點是不是就是自己創建的目錄節點,如果正是自己創建的,那么它就獲得了這個鎖,如果不是那么它就調用 exists(String path, boolean watch) 方法并監控 Zookeeper 上目錄節點列表的變化,一直到自己創建的節點是列表中最小編號的目錄節點,從而獲得鎖,釋放鎖很簡單,只要刪除前面它自己所創建的目錄節點就行了 n> Server 也是同樣的原理。
看完上述內容,你們對zookeeper機制的原理是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。