ZooKeeper分布式鎖淺談(一)
一.概述
清明節的時候寫了一篇分布式鎖概述,裡面介紹了分布式鎖實現的幾種方式,其實那時候我一直沉迷於使用redis的悲觀鎖和樂觀鎖來實現分布式鎖,直到一個血案的引發才讓我重新認識了redis分布式鎖的弊端,所以才痛定思痛潛心研究Zookeeper;自己裝了三台Centos虛擬機,搭建了ZooKeeper集群。
二.ZooKeeper基本概念
1.前言
ZooKeeper 是一個開源的分布式協調服務,由雅虎創建,是 Google Chubby 的開源實現。分布式應用程序可以基於 ZooKeeper 實現諸如數據發布/訂閱、負載均衡、命名服務、分布式協調/通知、集群管理、Master 選舉、分布式鎖和分布式隊列等功能。
2.ZooKeeper角色
在 ZooKeeper 中,有三種角色:
Leader
Follower
Observer
一個 ZooKeeper 集群同一時刻只會有一個 Leader,其他都是 Follower 或 Observer。當Leader奔潰後會從Follower重新選舉一個出來,讀者可以自行參考Zab協議。
3.節點介紹
1、PERSISTENT-持久化目錄節點
客戶端與Zookeeper斷開連接後,該節點依舊存在
2、PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點
客戶端與Zookeeper斷開連接後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號
3、EPHEMERAL-臨時目錄節點
客戶端與Zookeeper斷開連接後,該節點被刪除
4、EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點
客戶端與Zookeeper斷開連接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號
三.Zookeeper分布式鎖的實現
Zookeeper實現分布式鎖是通過節點和臨時順序節點來實現的:主要有一下步驟:
1. 在構造函數裡面啟動的時候建立一個節點,假如命名為:lock。節點類型為持久節點(PERSISTENT)【ZooKeeper裡面的znode節點會自動同步的,而且是強一致性,創建一個節點後只有ZooKeeper集群同步完成後算成功】
2. 每當進程需要訪問共享資源時,會在lock節點下面建立響應的順序子節點,節點類型為臨時順序節點(EPHEMERAL_SEQUENTIAL)
3. 在建立子節點之後,判斷剛剛建立的子節點順序號是否為最小節點,如果是最小節點,則可以獲得該鎖對資源進行訪問。(臨時子節點建立會自動生成一個序號的)
4. 如果不是該節點,就獲得該節點的上一順序節點,並給該節點是否存在註冊監聽事件。同時在這裡阻塞。等待監聽事件的發生。獲得控制權(實現watch介面,並且重寫process方法,在process裡面實現監聽)
5. 當完成之後,關閉ZooKeeper連接,進而可以應發監聽事件,釋放該鎖(客戶端關閉ZooKeeper連接之後會刪除當前的臨時節點)
下一篇將貼上代碼基於代碼進行詳細介紹。
※一不小心,陷入TCP的性能問題
※javascript痛點之一變數作用域
※react router 4.0以上的路由應用
※Java 8 新特性1-函數式介面
TAG:科技優家 |
※Zookeeper+Hadoop+Hbase整合平台搭建(全分布模式)全套小白教程
※ZooKeeper 設計原理
※從Paxos到zookeeper分散式一致性原理與實踐-Zookeeper與Paxos
※緩存架構SpringBoot集成Curator實現zookeeper分散式鎖
※《ZooKeeper分散式專題與Dubbo微服務入門》
※Redis Zookeeper 添加本地服務
※分散式系統中的冪等性-zookeeper與dubbo
※docker zookeeper 集群搭建
※漫畫:什麼是 ZooKeeper?
※ZooKeeper運維部署的一些經驗
※Facebook為何放棄ZooKeeper轉用自研配置管理系統?
※zookeeper 實現分散式鎖安全用法
※zookeeper之acl 張飛的繡花針
※大數據開發系列之Zookeeper
※zookeeper入門系列:概述
※詳解分散式應用程序協調服務Zookeeper
※雲伺服器-安裝zookeeper單機環境
※可能是全網把 ZooKeeper 概念講的最清楚的一篇文章
※阿里巴巴為什麼不用 ZooKeeper 做服務發現?
※深入淺析zookeeper的一致性模型及其實現