zookeeper的分布式鎖

2021-09-27 05:55:40 字數 1161 閱讀 6575

分布式鎖就是多台機器,分布在不同的jvm中,這些不同jvm內的方法需要獲取乙個唯一鎖,比如獲取鎖之後要把資料寫入資料庫,保證資料在同一時刻只有一台機器寫入資料庫。

分布式鎖的實現有多種實現方法,除了今天聊到的zk實現的分布式鎖還有redis通過setnxpx或lua指令碼實現,還可以通過資料庫的鎖實現,但今天咱們主要聊一下zk的分布式鎖的原理實現。

zookeeper可以建立兩種節點,一種是永久型的,一種是臨時型還可以是有序的,當機器與zk失去連線的時候臨時節點會自動刪除,這個功能非常強大以至於很多功能都是基於此,比如leader選舉等。現在直接上一張我自己畫的圖:

首先會有乙個永久節點\locks,然後每個客戶端請求的時候會建立乙個臨時有序節點,在這時每個都是有序的,最小的節點就意味著獲取了鎖。

在此圖上顯然clientc獲取了鎖,其他的鎖獲取的節點不是最小的,但是他們之前會有乙個鏈結,就是lock_00000001在雖然沒有獲取鎖,但是會需要監聽lock_00000000的,因為如果監聽所有節點的話會浪費很多的資源。相應的大的節點都會watch比自己小的節點,當比自己節點小的節點釋放之後然後就可以繼續處理了。

interprocessmutex lock = new interprocessmutex(client, lockpath);

try catch (exception e) finally

1. 如果zk集群出問題了,如何處理?

2. 如果方法呼叫的太頻繁,這樣會出現連線zk被拒絕,比如乙個應用連線數超過60個。

我能想到的第1點就是採用多個集群,比如兩個集群,在寫入資料的時候同時寫入到兩個集群中(保證資料一致),如果有乙個群集中超過一半不能使用的時候,那麼整個集群不能用了,這時可以切換到另乙個群集,保證訪問的高可用。

關於第2點,每個連線zk群集的ip會被記錄下來,這樣乙個ip連線zk集群的最大預設數量60個,如果超過60個的話會被拒絕連線,防止ddos攻擊。所以在每個應用的方法呼叫的時候需要加入synchronized關鍵字,這樣每個應用在同一時刻有乙個執行緒在進行處理,其他的執行緒可以等待或者直接去做別的處理。還有另乙個方案就是調整這個數變大,這樣也可以解決一下,但是如果調整的話還需要多做一些測試,保證這個數字是最佳的。

zookeeper分布式鎖

方案1 演算法思路 利用名稱唯一性,加鎖操作時,只需要所有客戶端一起建立 test lock節點,只有乙個建立成功,成功者獲得鎖。解鎖時,只需刪除 test lock節點,其餘客戶端再次進入競爭建立節點,直到所有客戶端都獲得鎖。特點 這種方案的正確性和可靠性是zookeeper機制保證的,實現簡單。...

zookeeper分布式鎖

zookeeper節點有4個型別 1.持久型 2.瞬時型 3.持久自動排序型 4.瞬時自動排序型 分布式鎖利用的就是zookeeper中瞬時自動排序型節點特性。一 瞬時自動排序節點 瞬時特點為,當客戶端斷開連線的時候,該節點自動消除。自動排序則為,如果節點名字重複,則自動在該節點名字後新增數字,該數...

zookeeper 分布式鎖

分布式鎖肯定是用在分布式環境下。在分布式環境下,使用分布式鎖的目的也是保證同一時刻只有乙個執行緒來修改共享變數,修改共享快取 前景 jdk提供的鎖只能保證執行緒間的安全性,但分布式環境下,各節點之間的執行緒同步執行卻得不到保障,分布式鎖由此誕生。實現方式有以下幾種 基於資料庫實現分布式鎖 基於快取 ...