ZK分布式鎖

2021-08-31 07:33:48 字數 2171 閱讀 4791

分布式鎖是控制分布式系統之間同步訪問共享資源的一種方式。如果不同的系統或者是同乙個系統的不同主機之間共享了乙個或者一組資源,那麼訪問這些資源的時候,往往需要一些互斥手段來防止彼此之間的干擾,以保證一致性,在這種情況下,就需要分布式鎖了

zookeeper中有一種節點叫做順序節點,假如我們在/lock/目錄下建立節3個點,zookeeper集群會按照提起建立的順序來建立節點,節點分別為/lock/0000000001、/lock/0000000002、/lock/0000000003。

zookeeper中還有一種名為臨時節點的節點,臨時節點由某個客戶端建立,當客戶端與zookeeper集群斷開連線,則開節點自動被刪除。

ephemeral_sequential為臨時順序節點

實現分布式鎖的基本邏輯:

釋放鎖的過程相對比較簡單,就是刪除自己建立的那個子節點即可。

以下為流程圖

還有乙個共享鎖,和排他鎖一樣,同樣是通過zk上的資料節點來表示乙個鎖,是乙個類似於/shared_lock/[hostname]-請求型別-序號「的臨時節點,例如//shared_lock/192.168.1.1-r-0000001,那麼這個就代表了乙個共享鎖

步驟:1 客戶端呼叫create()方法建立乙個類似於「/shared_lock/[hostname]-請求型別-序號的臨時順序節點

2 客戶端呼叫getchildren()介面來獲取所有已經建立的字節點列表,注意這裡不註冊任何的wather

3 如果無法獲得獲取共享鎖,那麼就呼叫exist()來對比自己小的那個節點註冊wather

如果是讀請求:向比自己小的最後乙個寫請求節點註冊watcher監聽

如果是寫請求:向比自己序號小的最後乙個節點註冊watcher監聽

4等待watcher通知,繼續進入步驟2

以下為流程圖

封裝了zk的客戶端,其分布式實現方式和上面的基本相同。同時還提供了不同的鎖型別:

可重入鎖:實現類為interprocessmutex,將執行緒物件,節點,鎖物件相關聯。interprocessmutex內部維護了乙個使用執行緒為key,為值的map,所以對不同的執行緒和請求加鎖的節點進行一一對應。提供方法acquire 和 release。

不可重入鎖:實現類為interprocesssemaphoremutex,類似interprocessmutex,只是沒有維護執行緒的map。

使用時首先建立乙個interprocessreadwritelock例項,然後再根據你的需求得到讀鎖或者寫鎖, 讀寫鎖的型別是interprocesslock

讀寫鎖的實現與互斥鎖類似,不同的地方在於建立自節點時讀鎖和寫鎖要區分型別。例如讀鎖的字首可以設定為read,寫鎖的字首可以設定為write。建立讀鎖的時候,檢查是否有編號小於自己的寫鎖存在,若存在則對編號剛好小於自己的寫鎖節點進行監聽。建立寫鎖時,檢查建立的節點編號是否為最小,如不是最小,則需要對編號剛好小於自己的節點進行監聽(此時不區分讀鎖和寫鎖)

還有訊號量和多鎖物件。

node節點擊擇為ephemeral_sequential很重要。

自增長的特性,可以方便構建乙個基於fair特性的鎖,前乙個節點喚醒後乙個節點,形成乙個鏈式的觸發過程。可以有效的避免"驚群效應"(乙個鎖釋放,所有等待的執行緒都被喚醒),有針對性的喚醒,提公升效能。

選擇乙個ephemeral臨時節點的特性。因為和zookeeper互動是乙個網路操作,不可控因素過多,比如網路斷了,上乙個節點釋放鎖的操作會失敗。臨時節點是和對應的session掛接的,session一旦超時或者異常退出其節點就會消失,類似於reentrantlock中等待佇列thread的被中斷處理

獲取lock操作是乙個阻塞的操作,而對應的watcher是乙個非同步事件,所以需要使用互斥訊號共享鎖booleanmutex進行通知,可以比較方便的解決鎖重入的問題。(鎖重入可以理解為多次讀操作,鎖釋放為寫搶占操作)

2 使用ephemeral會引出乙個風險:在非正常情況下,網路延遲比較大會出現session timeout,zookeeper就會認為該client已關閉,從而銷毀其id標示,競爭資源的下乙個id就可以獲取鎖。這時可能會有兩個process同時拿到鎖在跑任務,所以設定好session timeout很重要

優點:缺點:

zk分布式鎖

zk 分布式鎖,其實可以做的比較簡單,就是某個節點嘗試建立臨時 znode,此時建立成功了就獲取了這個鎖 這個時候別的客戶端來建立鎖會失敗,只能註冊個 監聽這個鎖。釋放鎖就是刪除這個 znode,一旦釋放掉就會通知客戶端,然後有乙個等待著的客戶端就可以再次重新加鎖。zookeepersession ...

zk實現分布式鎖

前言 2016春節之後一直比較忙,因此部落格n個沒有更新,現在也是忙裡偷閒,偷偷的更新一篇!一 分布式鎖介紹 分布式鎖主要用於在分布式環境中保護跨程序 跨主機 跨網路的共享資源實現互斥訪問,以達到保證資料的一致性。二 架構介紹 在介紹使用zookeeper實現分布式鎖之前,首先看當前的系統架構圖 解...

redis與zk實現分布式鎖

概述 那麼這個時候,如果你需要加個鎖,讓多個分布式的機器在訪問共享資源的時候序列起來 那麼這個時候,那個鎖,多個不同機器上的服務共享的鎖,就是分布式鎖 分布式鎖當然有很多種不同的實現方案,redis分布式鎖,zookeeper分布式鎖對比 資料庫鎖 優點 直接使用資料庫,使用簡單。缺點 分布式系統大...