ZooKeeper 配置與安裝

ZooKeeper 配置與安裝

標籤(空格分隔): ZooKeeper

ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,它包含一個簡單的原語集,分佈式應用程序可以基於它實現同步服務,配置維護和命名服務等。Zookeeper是hadoop的一個子項目,其發展歷程無需贅述。在分佈式應用中,由於工程師不能很好地使用鎖機制,以及基於消息的協調機制不適合在某些應用中使用,因此需要有一種可靠的、可擴展的、分佈式的、可配置的協調機制來統一系統的狀態。Zookeeper的目的就在於此。

一、Zookeeper的基本概念

角色

Zookeeper中的角色主要有以下三類,如下表所示:
image_1ba9ihq1b9u6sjsql617a0ta413.png-94.4kB

系統模型如圖所示:

image_1ba9iio371rr35641hgj16id1m0120.png-137.8kB

設計目的

  • 最終一致性:client不論連接到哪個Server,展示給它都是同一個視圖,這是zookeeper最重要的性能。
  • 可靠性:具有簡單、健壯、良好的性能,如果消息m被到一臺服務器接受,那麼它將被所有的服務器接受。
  • 實時性:Zookeeper保證客戶端將在一個時間間隔範圍內獲得服務器的更新信息,或者服務器失效的信息。但由於網絡延時等原因,Zookeeper不能保證兩個客戶端能同時得到剛更新的數據,如果需要最新數據,應該在讀數據之前調用sync()接口。
  • 等待無關(wait-free):慢的或者失效的client不得干預快速的client的請求,使得每個client都能有效的等待。
  • 原子性:更新只能成功或者失敗,沒有中間狀態。
  • 順序性:包括全局有序和偏序兩種:全局有序是指如果在一臺服務器上消息a在消息b前發佈,則在所有Server上消息a都將在消息b前被髮布;偏序是指如果一個消息b在消息a後被同一個發送者發佈,a必將排在b前面。

二、ZooKeeper的工作原理

Zookeeper的核心是原子廣播,這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab協議。Zab協議有兩種模式,它們分別是恢復模式(選主)和廣播模式(同步)。當服務啓動或者在領導者崩潰後,Zab就進入了恢復模式,當領導者被選舉出來,且大多數Server完成了和leader的狀態同步以後,恢復模式就結束了。狀態同步保證了leader和Server具有相同的系統狀態。

爲了保證事務的順序一致性,zookeeper採用了遞增的事務id號(zxid)來標識事務。所有的提議(proposal)都在被提出的時候加上了zxid。實現中zxid是一個64位的數字,它高32位是epoch用來標識leader關係是否改變,每次一個leader被選出來,它都會有一個新的epoch,標識當前屬於那個leader的統治時期。低32位用於遞增計數。

每個Server在工作過程中有三種狀態:

LOOKING:當前Server不知道leader是誰,正在搜尋
LEADING:當前Server即爲選舉出來的leader
FOLLOWING:leader已經選舉出來,當前Server與之同步

參考:
zookeeper原理(轉)
zookeeper官方文檔

三、安裝ZooKeeper

安裝JDK(tomcat環境都需要)

下載JDK地址:下載地址

[root@abcdocker ~]# tar xf jdk-8u121-linux-x64.tar.gz -C /usr/local/
[root@abcdocker ~]# ln -s /usr/local/jdk1.8.0_121/ /usr/local/jdk

[root@abcdocker ~]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

[root@abcdocker ~]# . /etc/profile

[root@abcdocker ~]# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

環境準備

[root@abcdocker ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 

[root@abcdocker ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            976         595          79           6         301         205
Swap:             0           0           0

[root@abcdocker ~]# getenforce 
Disabled

下載
下載zookeeper安裝包之後,解壓到合適目錄,進入zookeeper目錄下的conf子目錄,創建zoo.cfg或者複製模板文件並修改

[root@abcdocker ~]# wget http://www-eu.apache.org/dist/zookeeper/zookeeper-3.5.0-alpha/zookeeper-3.5.0-alpha.tar.gz
[root@abcdocker ~]# tar xf zookeeper-3.5.0-alpha.tar.gz -C /usr/local/
[root@abcdocker ~]# ln -s /usr/local/zookeeper-3.5.0 /usr/local/zookeeper

配置zookeeper

[root@abcdocker ~]# cd /usr/local/zookeeper-3.5.0-alpha/conf/
[root@abcdocker conf]# cp zoo_sample.cfg zoo.cfg
[root@abcdocker conf]# mkdir ../data        #創建用於存儲數據庫目錄
[root@abcdocker conf]# mkdir /var/log/zookeeper

[root@abcdocker conf]# vim zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data/
dataLogDir=/var/log/zookeeper/
clientPort=2181

參數解釋:
tickTime: zookeeper中使用的基本時間單位, 毫秒值.
dataDir: 數據目錄. 可以是任意目錄.
dataLogDir: log目錄, 同樣可以是任意目錄. 如果沒有設置該參數, 將使用和dataDir相同的設置.
clientPort: 監聽client連接的端口號.
initLimit:LF初始通信時限,集羣中的follower服務器(F)與leader服務器(L)之間初始連接時能容忍的最多心跳數(tickTime的數量)。
syncLimit:LF同步通信時限,集羣中的follower服務器與leader服務器之間請求和應答之間能容忍的最多心跳數(tickTime的數量)。

啓動

[root@abcdocker ~]# /usr/local/zookeeper/bin/zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

查看進程

[root@abcdocker conf]# ps -ef|grep zook
root       2875      1  9 12:31 pts/1    00:00:00 /usr/local/jdk/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /usr/local/zookeeper/bin/../build/classes:/usr/local/zookeeper/bin/../build/lib/*.jar:/usr/local/zookeeper/bin/../lib/slf4j-log4j12-1.7.5.jar:/usr/local/zookeeper/bin/../lib/slf4j-api-1.7.5.jar:/usr/local/zookeeper/bin/../lib/servlet-api-2.5-20081211.jar:/usr/local/zookeeper/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper/bin/../lib/jline-2.11.jar:/usr/local/zookeeper/bin/../lib/jetty-util-6.1.26.jar:/usr/local/zookeeper/bin/../lib/jetty-6.1.26.jar:/usr/local/zookeeper/bin/../lib/javacc.jar:/usr/local/zookeeper/bin/../lib/jackson-mapper-asl-1.9.11.jar:/usr/local/zookeeper/bin/../lib/jackson-core-asl-1.9.11.jar:/usr/local/zookeeper/bin/../lib/commons-cli-1.2.jar:/usr/local/zookeeper/bin/../zookeeper-3.5.0-alpha.jar:/usr/local/zookeeper/bin/../src/java/lib/*.jar:/usr/local/zookeeper/bin/../conf:........:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:/usr/local/jdk/lib/tools.jar:/application/jdk/lib:/application/jdk/jre/lib:/application/jdk/lib/tools.jar:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:/usr/local/jdk/lib/tools.jar:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:/usr/local/jdk/lib/tools.jar:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:/usr/local/jdk/lib/tools.jar:/application/jdk/lib:/application/jdk/jre/lib:/application/jdk/lib/tools.jar:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:/usr/local/jdk/lib/tools.jar:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:/usr/local/jdk/lib/tools.jar -Xmx1000m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /usr/local/zookeeper/bin/../conf/zoo.cfg

ZooKeeper服務命令:

  • 啓動ZK服務: sh bin/zkServer.sh start
  • 查看ZK服務狀態: sh bin/zkServer.sh status
  • 停止ZK服務: sh bin/zkServer.sh stop
  • 重啓ZK服務: sh bin/zkServer.sh restart

參考
zookeeper入門(2)解讀zookeeper的配置項

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