在平時的實際專案開發中,可以依賴關係型資料庫固有的排他性來實現不同程序間的互斥。然而,目前絕大數大型分布式系統的效能瓶頸都集中在資料庫操作上,如果上層業務再給資料庫新增一些額外的鎖,例如行鎖等,會讓資料庫更加不堪重負。
定義鎖在zookeeper中,通過資料節點來表示乙個鎖,例如/exclusive_lock/lock節點就可以被定義為乙個鎖。
獲取鎖在需要獲取鎖的情況下,尤其是在高併發情況下,所有的客戶端都會呼叫create()介面,建立/exclusive_lock/lock**臨時**節點,而zookeeper會保證在所有的客戶端中,最終只會有乙個客戶端能夠建立成功,即獲取到該排他鎖。
同時,沒有獲取到鎖的客戶端需要到節點上註冊乙個子節點變更的watcher監聽,一旦鎖節點被釋放,就可以再次嘗試獲取鎖。
釋放鎖/exclusive_lock/lock是乙個臨時節點,因此在以下兩種情況,都有可能釋放鎖。
在lock節點被移除之後,zookeeper都會通知所有在/exclusive_lock節點上註冊了子節點變更watcher監聽的客戶端。接收到通知的客戶端,會再次重新發起分布式鎖的獲取,即重複「獲取鎖」過程。
定義鎖和排他鎖一樣,通過zookeeper上的資料節點來表示乙個鎖,是乙個「/shared_lock/[host-name]-請求型別-序號」格式的臨時順序節點。
獲取鎖根據共享鎖的定義,事務對同一物件有讀讀共享,讀寫互斥,寫寫互斥的原則。通過zookeeper的節點來確定分布式讀寫順序:
接收到watcher通知後,重複開始步驟1
釋放鎖釋放鎖的邏輯與排他鎖是一致的。
羊群效應:
分布式鎖中的羊群效應,簡單地來說,就是在整個分布式鎖的競爭過程中,大量的「watcher通知」和「子節點列表的獲取」兩個操作重複執行,並且大多數節點的執行結果都是判斷出自己並不是當前序號最小的節點,從而繼續等待下一次通知,而不是執行業務邏輯。
結果是,造成zookeeper伺服器巨大的效能影響和網路衝擊,更甚的是如果同一時間多個節點對應的客戶端完成事務或是事務中斷引起節點消失,zookeeper伺服器就會在短時間內向其餘客戶端傳送大量的事件通知。
主要改動:每個鎖競爭者,只需要關注/shared_lock節點下序號比自己小的那個節點是否存在即可。具體實現如下:
等待watcher通知,重複步驟2
在集群規模不大、網路資源豐富的情況下,使用第一種分布式鎖的實現方式是簡單實用的選擇;反之,可以使用改進改的分布式鎖能夠精細化地控制分布式鎖機制。
ZooKeeper典型應用場景
zookeeper 是乙個開源的高可用的分布式資料管理與系統協調框架,基於對 paxos 演算法的實現,保證了分布式環境中資料的強一致性。發布與訂閱模型 發布者發布資料到 zk 節點上,供訂閱者動態獲取資料。在資料量很少,但是資料更新快的場景下 訊息中介軟體中的發布者和訂閱者的負載均衡,linked...
ZooKeeper的典型應用場景 資料發布 訂閱
資料發布 訂閱系統,即所謂的配置中心 發布者將資料發布到zookeeper的乙個或一系列節點上,供訂閱者進行資料訂閱,進而達到動態獲取資料的目的,實現配置資訊的集中式管理和資料的動態更新。zookeeper採用的是推拉相結合的方式 客戶端向伺服器端註冊自己需要關注的節點,一旦該服務端節點的資料發生變...
ZooKeeper典型應用場景一覽
b 資料發布與訂閱 配置中心 b 發布與訂閱模型,即所謂的配置中心,顧名思義就是發布者將資料發布到zk節點上,供訂閱者動態獲取資料,實現配置資訊的集中式管理和動態更新。例如全域性的配置資訊,服務式服務框架的服務位址列表等就非常適合使用。應用中用到的一些配置資訊放到zk上進行集中管理。這類場景通常是這...