zookeeper分佈式鎖思路(無代碼)

什麼是分佈式鎖

想必大家肯定很熟悉多線程之間的鎖,他們屬於同一個jvm,才能實現資源的共享,保證數據一致性,但是,如果在分佈式的機器中,我們如何保證數據的一致性呢,這裏就需要用到分佈式鎖的問題。

分佈式讀寫數據庫的分佈式鎖

假設有以下場景。
1. 一個WEB應用,部署到多臺服務器中,其中通過nginx等一些手段進行負載均衡,每個用戶的請求數據,都會負載均衡的由多臺服務器處理。
2. 如果多臺服務器同時對數據庫進行修改的時候,如何保證數據的一致性呢?

上面的例子我們可以看到,肯定數據庫也做了集羣模式。例如主從複製,當某個服務器的數據庫實例進行修改之後,會update到其餘的多臺服務器中,保證數據的一致性。但是我們可能會出現這樣一種情況。服務器A收到一條數據庫請求,需要對user表的某條數據的年齡字段進行+1操作,服務器B也收到一條數據庫請求,也需要對這條數據進行年齡+1的操作在,這個時候,假如之前的年齡是10,服務器A加1,變成了11,服務器B在A對數據庫寫之前在本地也得到了年齡爲10,然後服務器B操作後,數據還是11,導致了數據的不一致問題。因爲我們想要的卻是年齡應該變成12。這時候我們應該有這樣的想法,服務器A在操作這個年齡更新的時候,需要加一把鎖,讓其他機器不能操作,當A操作完後,數據庫內部進行數據同步之後,其他的服務器才能進行這個年齡更新的操作。這個當然可以使用zookeeper來實現分佈式鎖的功能。
簡單思考一下解決方案
1. 對某個ID的數據進行操作的時候,在zookeeper上,建立一個znode,名稱爲這個ID 。
2. 服務器需要操作某條數據的時候,先去zookeeper get一下這個ID,看看能不能get到,如果get不到才能進行數據的操作,負責就等待,直到這個能get到爲止
3. 上面說的比較淺顯,但是大概的思路就是這樣,利用一個第三方的工具,來判斷某個數據是否正在被操作,從而實現分佈式的功能。

zookeeper分佈式的一個流程圖

發佈了137 篇原創文章 · 獲贊 211 · 訪問量 59萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章