zookeeper入門與安裝
zookeeper是一個分布式的統一文件協調管理系統管理系統。它的數據類型與linux、unix類似,是一棵樹的結構。在日常的生產開發生產中,它具有以下的作用。
1、集群管理,保證集群中的數據的強一致性。
如下圖,就是一個zookeeper的集群模型,它有三個節點分別是xx,yy,zz。xx為集群中的master,yy和zz分為為slave1和slave2.三個節點中的數據保持一致性,現在加入說master節點掛掉了,那麽yy和zz就會進行master的選舉。如果說zz被選中,那麽它就會成為新的master節點,yy則仍然為slave1節點。那麽集群模式就會變成如下圖右所示的模式。加入說這個時候之前掛掉的master節點重啟了或者被運維人員修復了,那麽它就會變成新的salve2節點。
2、統一文件配置管理
ZooKeeper 中特有 Watcher 註冊與異步通知機制,能夠很好的實現分布式環境下不同機器,甚至不同系統之間的通知與協調,從而實現對數據變更的實時處理。使用方法通常是不同的客戶端如果 機器節點 發生了變化,那麽所有訂閱的客戶端都能夠接收到相應的Watcher通知,並做出相應的處理。
ZooKeeper的分布式協調/通知,是一種通用的分布式系統機器間的通信方式。
3、發布訂閱,類似於mq。dubbo把消息存放在znode上,訂閱者讀取這個消息。
數據發布與訂閱,即所謂的配置中心,顧名思義就是發布者將數據發布到 ZooKeeper 節點上,供訂閱者進行數據訂閱,進而達到動態獲取數據的目的,實現配置信息的集中式管理和動態更新。
這樣的全局配置信息就可以發布到 ZooKeeper上,讓客戶端(集群的機器)去訂閱該消息。
發布/訂閱系統一般有兩種設計模式,分別是推(Push)和拉(Pull)模式。
- 推模式
服務端主動將數據更新發送給所有訂閱的客戶端 -
拉模式
客戶端主動發起請求來獲取最新數據,通常客戶端都采用定時輪詢拉取的方式
ZooKeeper 采用的是推拉相結合的方式:
客戶端想服務端註冊自己需要關註的節點,一旦該節點的數據發生變更,那麽服務端就會向相應的客戶端發送Watcher事件通知,客戶端接收到這個消息通知後,需要主動到服務端獲取最新的數據
4、提供分布式鎖,分布式環境中不同進程之間進行資源爭奪,類似於多線程之間的鎖。排它鎖
ZooKeeper如何實現排它鎖?
定義鎖
ZooKeeper 上的一個 機器節點 可以表示一個鎖
獲得鎖
把ZooKeeper上的一個節點看作是一個鎖,獲得鎖就通過創建臨時節點的方式來實現。
ZooKeeper 會保證在所有客戶端中,最終只有一個客戶端能夠創建成功,那麽就可以
認為該客戶端獲得了鎖。同時,所有沒有獲取到鎖的客戶端就需要到/exclusive_lock
節點上註冊一個子節點變更的Watcher監聽,以便實時監聽到lock節點的變更情況。
釋放鎖
因為鎖是一個臨時節點,釋放鎖有兩種方式
當前獲得鎖的客戶端機器發生宕機或重啟,那麽該臨時節點就會被刪除,釋放鎖正常執行完業務邏輯後,客戶端就會主動將自己創建的臨時節點刪除,釋放鎖。無論在什麽情況下移除了lock節點,ZooKeeper 都會通知所有在 /exclusive_lock 節點上註冊了節點變更 Watcher 監聽的客戶端。這些客戶端在接收到通知後,再次重新發起分布式鎖獲取,即重復『獲取鎖』過程。
ZooKeeper如何實現共享鎖
共享鎖在同一個進程中很容易實現,但是在跨進程或者在不同 Server 之間就不好實現了。Zookeeper 卻很容易實現這個功能,實現方式也是需要獲得鎖的 Server 創建一個EPHEMERAL_SEQUENTIAL 目錄節點,然後調用 getChildren方法獲取當前的目錄節點列表中最小的目錄節點是不是就是自己創建的目錄節點,如果正是自己創建的,那麽它就獲得了這個鎖,如果不是那麽它就調用 exists(String path, boolean watch) 方法並監控Zookeeper 上目錄節點列表的變化,一直到自己創建的節點是列表中最小編號的目錄節點,從而獲得鎖,釋放鎖很簡單,只要刪除前面它自己所創建的目錄節點就行了。
5、節點選舉
針對 Master 選舉的需求,通常情況下,我們可以選擇常見的關系型數據庫中的主鍵特性來實現:希望成為 Master 的機器都向數據庫中插入一條相同主鍵ID的記錄,數據庫會幫我們進行主鍵沖突檢查,也就是說,只有一臺機器能插入成功——那麽,我們就認為向數據庫中成功插入數據的客戶端機器成為Master。
依靠關系型數據庫的主鍵特性確實能夠很好地保證在集群中選舉出唯一的一個Master。 但是,如果當前選舉出的 Master 掛了,那麽該如何處理?誰來告訴我 Master 掛了呢?
顯然,關系型數據庫無法通知我們這個事件。但是,ZooKeeper 可以做到!
利用 ZooKeepr 的強一致性,能夠很好地保證在分布式高並發情況下節點的創建一定能夠保證全局唯一性,即 ZooKeeper 將會保證客戶端無法創建一個已經存在的 數據單元節點。
也就是說,如果同時有多個客戶端請求創建同一個臨時節點,那麽最終一定只有一個客戶端請求能夠創建成功。利用這個特性,就能很容易地在分布式環境中進行 Master 選舉了。
成功創建該節點的客戶端所在的機器就成為了 Master。同時,其他沒有成功創建該節點的客戶端,都會在該節點上註冊一個子節點變更的 Watcher,用於監控當前 Master 機器是否存活,一旦發現當前的Master掛了,那麽其他客戶端將會重新進行 Master 選舉。
這樣就實現了 Master 的動態選舉。
二、zookeeper單機集群部署
安裝zookeeper需要安裝jdk,因此首先我們先安裝jdk。
1、官網下載jdk,上傳到服務器上。
2、[root@nlfd home]# mv jdk-8u201-linux-x64.tar.gz /usr/local/
[root@nlfd local]# tar -zxvf jdk-8u201-linux-x64.tar.gz
3、配置環境變量
[root@nlfd jdk1.8.0_201]# vi /etc/profile
增加如下幾行
export JAVA_HOME=/usr/local/jdk1.8.0_201
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile
4、java -version
安裝zookeeper
1、下載zookeeper安裝包上傳到服務器。
2、[root@nlfd local]# tar -zxvf zookeeper-3.4.9.tar.gz
[root@nlfd local]# mv zookeeper-3.4.9 zookeeper
3、vi /etc/profile 配置環境變量,加入如下內容
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin:${JAVA_HOME}/bin
source /etc/profile
4、zookeeper配置
[root@nlfd zookeeper]# cd /usr/local/zookeeper/conf/
[root@nlfd conf]# cp zoo_sample.cfg ./zoo.cfg
[root@nlfd conf]# vi zoo.cfg
dataDir=/usr/local/zookeeper/dataDir
dataLogDir=/usr/local/zookeeper/dataLogDir
[root@nlfd zookeeper]# cd /usr/local/zookeeper
[root@nlfd zookeeper]# mkdir dataDir
[root@nlfd zookeeper]# mkdir dataLogDir
[root@nlfd zookeeper]# cd /usr/local/zookeeper/dataDir/
[root@nlfd dataDir]# vim myid
設置為1
5、拷貝兩份zookeeper分別命名為zookeeper02和zookeeper03
[root@nlfd local]# cp zookeeper zookeeper02 -rf
[root@nlfd local]# cp zookeeper zookeeper03 -rf
6、修改配置文件
[root@nlfd local]# cd /usr/local/zookeeper/conf/
![](https://s1.51cto.com/images/blog/201903/03/e6e3e4266b73b8cb5ccebba5c8578658.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
[root@nlfd conf]# vi /usr/local/zookeeper02/conf/zoo.cfg
修改如下配置:
[root@nlfd dataDir]# cd /usr/local/zookeeper02/dataDir/
[root@nlfd dataDir]# vi myid
設置為2
[root@nlfd conf]# vi /usr/local/zookeeper03/conf/zoo.cfg
修改如下配置:
[root@nlfd dataDir]# cd /usr/local/zookeeper03/dataDir/
[root@nlfd dataDir]# vi myid
設置為3
7、啟動
[root@nlfd dataDir]# cd /usr/local/zookeeper/bin/
[root@nlfd bin]# ./zkServer.sh start
[root@nlfd bin]# cd /usr/local/zookeeper02/bin/
[root@nlfd bin]# ./zkServer.sh start
[root@nlfd bin]# cd /usr/local/zookeeper03/bin/
[root@nlfd bin]# ./zkServer.sh start
8、檢驗
連接第一臺節點
./zkCli.sh -server 192.168.0.104:2181
設置一個node值
[zk: localhost:2181(CONNECTED) 1] create /testAsync helloworld
[zk: localhost:2181(CONNECTED) 5] ls /
[testAsycn, zookeeper]
連接第二臺節點
./zkCli.sh -server 192.168.0.104:2182
連接第三臺節點
./zkCli.sh -server 192.168.0.104:2183
至此,簡單的單機版三節點zookeeper集群已經安裝成功。至於選舉模式的配置安裝,後續再研究。
zookeeper入門與安裝