Zookeeper基礎及集羣搭建

Zookeeper簡介

打開Zookeeper的官網,http://zookeeper.apache.org/,可以看到這樣一句話


ZooKeeper是一種集中式服務,用於維護配置信息,命名,提供分佈式同步和提供組服務所有這些類型的服務都以分佈式應用程序的某種形式使用。每次實施它們都需要做很多工作來修復不可避免的錯誤和競爭條件。由於難以實現這些類型的服務,應用程序最初通常會吝嗇它們,這使得它們在變化的情況下變得脆弱並且難以管理。即使正確完成,這些服務的不同實現也會在部署應用程序時導致管理複雜性。

注紅的一句話基本上概括了Zookeeper可以提供什麼功能.

1.命名服務   2.配置管理   3.集羣管理   4.分佈式鎖  5.隊列管理

Zookeeper數據結構

1.Zookeeper維護一個類似文件系統的數據結構:

                                                          zookeeper簡介

 圖中的每個節點稱爲一個znode. 每個znode由3部分組成:

1.stat:此爲狀態信息, 描述該znode的版本, 權限等信息.

2.data:與該znode關聯的數據.

3.children:該znode下的子節點.


        每個子目錄項如 NameService 都被稱作爲 znode,和文件系統一樣,我們能夠自由的增加、刪除znode,在一個znode下增加、刪除子znode,唯一的不同在於znode是可以存儲數據的。

有四種類型的znode:

1、PERSISTENT-持久化目錄節點

客戶端與zookeeper斷開連接後,該節點依舊存在

2、 PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點

客戶端與zookeeper斷開連接後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號

3、EPHEMERAL-臨時目錄節點

客戶端與zookeeper斷開連接後,該節點被刪除

4、EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點

客戶端與zookeeper斷開連接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號

另外,需要注意是,ZooKeeper的臨時節點不允許擁有子節點。

2.通知機制(watch)

 客戶端註冊監聽它關心的目錄節點,當目錄節點發生變化(數據改變、被刪除、子目錄節點增加刪除)時,zookeeper會通知客戶端。 

3.znode節點操作

在ZooKeeper中有9個基本操作,如下圖所示:

更新ZooKeeper操作是有限制的。delete或setData必須明確要更新的Znode的版本號,我們可以調用exists找到。如果版本號不匹配,更新將會失敗。

更新ZooKeeper操作是非阻塞式的。因此客戶端如果失去了一個更新(由於另一個進程在同時更新這個Znode),他可以在不阻塞其他進程執行的情況下,選擇重新嘗試或進行其他操作。

儘管ZooKeeper可以被看做是一個文件系統,但是處於便利,摒棄了一些文件系統地操作原語。因爲文件非常的小並且使整體讀寫的,所以不需要打開、關閉或是尋地的操作。


Zookeeper可以實現的功能

從簡介裏面已經大致概括了Zookeeper提供的功能.

1.命名服務.

通過四種類型的znode節點了解,我們可以通過約定在同一個/path 目錄下創建順序編號的節點,通過path即能探索發現.

2.統一配置管理

程序總是需要配置的,如果程序分散部署在多臺機器上,要逐個改變配置就變得困難.約定把所有需要配置的信息存放到某一節點下,然後所有相關應用程序對這個目錄節點進行監聽,通過Zookeeper的通知機制,一旦配置信息發生變化,每個應用程序就會收到 Zookeeper 的通知,然後從 Zookeeper 獲取新的配置信息應用到系統中就好。


3.集羣管理

所謂集羣管理無在乎兩點:是否有機器退出和加入、選舉master。(同樣也是利用Zookeeper的znode的特性判斷某個znode是否存在.)

所有機器約定在父目錄GroupMembers下創建臨時目錄節點,然後監聽父目錄節點的子節點變化消息。一旦有機器掛掉,該機器與 zookeeper的連接斷開,其所創建的臨時目錄節點被刪除,所有其他機器都收到通知.master的選舉約定創建臨時順序編號目錄節點,每次選取編號最小的機器作爲master。

4.Zookeeper分佈式鎖

1: 當這兩個線程去mysql更新數據之前, 先到zookeeper/locks(永久節點)下面註冊一個臨時有序節點, 這樣每個線程都註冊了一個臨時節點, 兩個臨時節點肯定是有序的。
  線程1: /locks/000000002 線程2: /locks/000000001

  2: 當每個線程註冊完節點之後, 需要嘗試獲取鎖, 這個時候, 哪個節點最小, 哪個線程就獲取到鎖, 這個時候, 線程2註冊的節點最小, 所以線程就獲取到鎖, 執行更新數據庫的代碼, 更新完
  成之後, 刪除自己註冊的臨時節點。同時線程1會判斷自己不是最小的, 所以就會監控比自己小1的那個節點, 當發現那個節點消失的話, 也就意味着它的節點就是最小的節點, 獲取鎖, 執行更新數據庫的代碼 .  



5.Zookeeper隊列管理

兩種類型的隊列:
1、同步隊列,當一個隊列的成員都聚齊時,這個隊列纔可用,否則一直等待所有成員到達。 
2、隊列按照 FIFO(先進xian) 方式進行入隊和出隊操作。 

第一類,在約定目錄下創建臨時目錄節點,監聽節點數目是否是我們要求的數目。 

Zookeeper的選舉機制及工作流程可以參考末尾的文章連接,在此不做贅述.


Zookeeper的安裝

windows下安裝比較簡單,官網下載壓縮包解壓即可.這裏介紹下linux下安裝Zookeeper.

下載壓縮包
[root@localhost home]# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz 
解壓:

[root@localhost home]# tar -zxvf zookeeper-3.4.12.tar.gz 
解壓之後進入conf目錄修改配置文件
[root@localhost home]# cd zookeeper-3.4.12/conf
[root@localhost home]# cp zoo_sample.cfg zoo.cfg 
修改內容:
# The number of milliseconds of each tick  
tickTime=2000  
# The number of ticks that the initial  
# synchronization phase can take  
initLimit=10  
# The number of ticks that can pass between  
# sending a request and getting an acknowledgement  
syncLimit=5  
# the directory where the snapshot is stored.  
dataDir=/usr/zookeeper  
dataLogDir=/usr/zookeeper/log  
# the port at which the clients will connect  
clientPort=2181  

其中主要修改的是端口號和serverid.

然後就是啓動客戶端:

[root@localhost home]# cd /home/zookeeper-3.4.12/bin
[root@localhost home]# ./zkServer.sh start

Zookeeper集羣安裝

Zookeeper在linux和windows上安裝大同小異,這裏示例在win環境下安裝Zookeeper集羣.

在解壓Zookeeper的安裝包後,進入conf目錄複製三份(只有客戶端數量爲2n+1個數時才能進行leader選舉)配置文件


其中每個配置文件需修改的地方如下


除了3相同外其他需不一樣,同時也要創建相應的目錄.



最後需要在data的每個子目錄中創建一個沒有擴展名且名爲myid的文件,文件內容與目錄名保持一直


其他幾個文件夾類似.

最後在bin中同樣複製三個服務端啓動程序


命名區分開就行.然後就以記事本打開修改編輯

在 set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain 這一行下面添加

set ZOOCFG=..\conf\zoo.cfg 

@echo off
REM Licensed to the Apache Software Foundation (ASF) under one or more
REM contributor license agreements.  See the NOTICE file distributed with
REM this work for additional information regarding copyright ownership.
REM The ASF licenses this file to You under the Apache License, Version 2.0
REM (the "License"); you may not use this file except in compliance with
REM the License.  You may obtain a copy of the License at
REM
REM     http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.

setlocal
call "%~dp0zkEnv.cmd"

set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
set ZOOCFG=..\conf\zoo.cfg
echo on
call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*

endlocal

設置的配置文件即爲前面複製的三個配置文件名稱zoo.cfg,zoo1.cfg,zoo2.cfg.

最後就是雙擊運行.應該Zookeeper的leader選舉機制,在Zookeeper服務器少於三個時會報異常,可以不用管.

運行完所有的服務段腳本後.雙擊zkCli.cmd客戶端,可以輸入命令查看


--------------------------------------------------------------------------------------------------

以上即爲Zookeeper的一些基礎知識和僞集羣的搭建,如有錯誤,歡迎之處,共同學習.

更多知識請參考文末鏈接.

參考文獻:

更詳細的介紹及應用建議參考:

https://blog.csdn.net/tswisdom/article/details/41522069

https://www.cnblogs.com/zlslch/p/7242381.html?utm_source=itdadao&utm_medium=referral

--------結尾語

             有志者、事竟成,破釜沉舟,百二秦關終屬楚;
          苦心人、天不負,臥薪嚐膽,三千越甲可吞吳。
 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章