Linux Zookeeper安裝

zookeeper簡介

ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、名字服務、分佈式同步、組服務等。
ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
ZooKeeper包含一個簡單的原語集,提供Java和C的接口。ZooKeeper源代碼中,提供了分佈式獨享鎖、選舉、隊列的接口,代碼在zookeeper-x.x.x\src\recipes。其中分佈鎖和隊列有Java和C兩個版本,選舉只有Java版本。html

zookeeper的原理

ZooKeeper是以Fast Paxos算法爲基礎的,paxos算法存在活鎖的問題,即當有多個proposer交錯提交時,有可能互相排斥致使沒有一個proposer能提交成功,而Fast Paxos做了一些優化,經過選舉產生一個leader,只有leader才能提交propose。=。所以要想弄懂ZooKeeper首先得對Fast Paxos有所瞭解。java

ZooKeeper的基本運轉流程:node

  1. 選舉Leader。
  2. 同步數據。
  3. 選舉Leader過程當中算法有不少,但要達到的選舉標準是一致的。
  4. Leader要具備最高的zxid。
  5. 集羣中大多數的機器獲得響應並follow選出的Leader

zookeeper的特色

在Zookeeper中,znode是一個跟Unix文件系統路徑類似的節點,能夠往這個節點存儲或獲取數據。若是在建立znode時Flag設置爲EPHEMERAL,那麼當建立這個znode的節點和Zookeeper失去鏈接後,這個znode將再也不存在在Zookeeper裏,Zookeeper使用Watcher察覺事件信息。當客戶端接收到事件信息,好比鏈接超時、節點數據改變、子節點改變,能夠調用相應的行爲來處理數據。Zookeeper的Wiki頁面展現瞭如何使用Zookeeper來處理事件通知,隊列,優先隊列,鎖,共享鎖,可撤銷的共享鎖,兩階段提交。那麼Zookeeper能做什麼事情呢,簡單的例子:假設咱們有20個搜索引擎的服務器(每一個負責總索引中的一部分的搜索任務)和一個總服務器(負責向這20個搜索引擎的服務器發出搜索請求併合並結果集),一個備用的總服務器(負責當總服務器宕機時替換總服務器),一個web的cgi(向總服務器發出搜索請求)。搜索引擎的服務器中的15個服務器提供搜索服務,5個服務器正在生成索引。這20個搜索引擎的服務器常常要讓正在提供搜索服務的服務器中止提供服務開始生成索引,或生成索引的服務器已經把索引生成完成能夠搜索提供服務了。使用Zookeeper能夠保證總服務器自動感知有多少提供搜索引擎的服務器並向這些服務器發出搜索請求,當總服務器宕機時自動啓用備用的總服務器。linux

安裝

準備工做
在安裝zookeeper以前咱們要確保本身主機上已經有了Java環境,建議安裝Oracle JDK8.xweb

環境 版本
RHEL/CentOS 7.x
Java 8.x
Zookeeper 3.4.x
# 檢查java環境
[thinktik@localhost ~]$ java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
[thinktik@localhost ~]$ ls
apache-maven-3.6.0-bin.tar.gz  httpd-2.4.37.tar.gz         jenkins.war      sonarqube-6.7.5.tar
httpd                          java8                       maven            zookeeper-3.4.13.tar.gz
httpd-2.4.37                   jdk-8u191-linux-x64.tar.gz  sonarqube-6.7.5
# 解壓
[thinktik@localhost ~]$ tar -zxvf zookeeper-3.4.13.tar.gz

[thinktik@localhost ~]$ ls
apache-maven-3.6.0-bin.tar.gz  httpd-2.4.37.tar.gz         jenkins.war      sonarqube-6.7.5.tar
httpd                          java8                       maven            zookeeper-3.4.13
httpd-2.4.37                   jdk-8u191-linux-x64.tar.gz  sonarqube-6.7.5  zookeeper-3.4.13.tar.gz
[thinktik@localhost ~]$ cd zookeeper-3.4.13
[thinktik@localhost zookeeper-3.4.13]$ ls
bin        dist-maven       lib          README_packaging.txt  zookeeper-3.4.13.jar.asc
build.xml  docs             LICENSE.txt  recipes               zookeeper-3.4.13.jar.md5
conf       ivysettings.xml  NOTICE.txt   src                   zookeeper-3.4.13.jar.sha1
contrib    ivy.xml          README.md    zookeeper-3.4.13.jar
# 建立data文件夾保持數據
[thinktik@localhost zookeeper-3.4.13]$ mkdir data
# 建立logs文件夾保存日誌
[thinktik@localhost zookeeper-3.4.13]$ mkdir logs
[thinktik@localhost zookeeper-3.4.13]$ pwd
/home/thinktik/zookeeper-3.4.13
[thinktik@localhost zookeeper-3.4.13]$ cd conf/
[thinktik@localhost conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
# 將樣例配置文件複製一份爲zoo.cfg
[thinktik@localhost conf]$ cp zoo_sample.cfg zoo.cfg 
# 修改配置文件
[thinktik@localhost conf]$ vim zoo.cfg

配置文件參考(這裏我將dataDir和dataLogDir路徑改成了我剛纔建立文件夾)
算法

單機版啓動apache

[thinktik@localhost conf]$ cd ..
[thinktik@localhost zookeeper-3.4.13]$ ls
bin        dist-maven       LICENSE.txt           recipes                   zookeeper-3.4.13.jar.sha1
build.xml  docs             logs                  src
conf       ivysettings.xml  NOTICE.txt            zookeeper-3.4.13.jar
contrib    ivy.xml          README.md             zookeeper-3.4.13.jar.asc
data       lib              README_packaging.txt  zookeeper-3.4.13.jar.md5
[thinktik@localhost zookeeper-3.4.13]$ cd bin/
[thinktik@localhost bin]$ ls
README.txt    zkCli.cmd  zkEnv.cmd  zkServer.cmd  zkTxnLogToolkit.cmd
zkCleanup.sh  zkCli.sh   zkEnv.sh   zkServer.sh   zkTxnLogToolkit.sh
# 啓動
[thinktik@localhost bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# 狀態查詢爲正在運行,單例模式
[thinktik@localhost bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: standalone

# 檢查端口監聽ok
[thinktik@localhost bin]$ netstat -nlp | grep 2181
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp6       0      0 :::2181                 :::*                    LISTEN      1958/java  
# 檢查運行線程ok
[thinktik@localhost bin]$ ps -ef |grep zoo
thinktik  1958     1  0 11:17 pts/0    00:00:00 java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /home/thinktik/zookeeper-3.4.13/bin/../build/classes:/home/thinktik/zookeeper-3.4.13/bin/../build/lib/*.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/slf4j-log4j12-1.7.25.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/slf4j-api-1.7.25.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/netty-3.10.6.Final.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/log4j-1.2.17.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/jline-0.9.94.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/audience-annotations-0.5.0.jar:/home/thinktik/zookeeper-3.4.13/bin/../zookeeper-3.4.13.jar:/home/thinktik/zookeeper-3.4.13/bin/../src/java/lib/*.jar:/home/thinktik/zookeeper-3.4.13/bin/../conf: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
thinktik  1978  1890  0 11:19 pts/0    00:00:00 grep --color=auto zoo
# 客戶端鏈接ok
[thinktik@localhost bin]$ ./zkCli.sh 
Connecting to localhost:2181
2018-11-11 11:48:15,274 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
2018-11-11 11:48:15,277 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=localhost
2018-11-11 11:48:15,277 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_191
2018-11-11 11:48:15,279 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2018-11-11 11:48:15,279 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/home/thinktik/java8/jre
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/home/thinktik/zookeeper-3.4.13/bin/../build/classes:/home/thinktik/zookeeper-3.4.13/bin/../build/lib/*.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/slf4j-log4j12-1.7.25.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/slf4j-api-1.7.25.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/netty-3.10.6.Final.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/log4j-1.2.17.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/jline-0.9.94.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/audience-annotations-0.5.0.jar:/home/thinktik/zookeeper-3.4.13/bin/../zookeeper-3.4.13.jar:/home/thinktik/zookeeper-3.4.13/bin/../src/java/lib/*.jar:/home/thinktik/zookeeper-3.4.13/bin/../conf:
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Linux
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=amd64
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=3.10.0-862.el7.x86_64
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=thinktik
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/home/thinktik
2018-11-11 11:48:15,281 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/home/thinktik/zookeeper-3.4.13/bin
2018-11-11 11:48:15,282 [myid:] - INFO  [main:ZooKeeper@442] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@25f38edc
2018-11-11 11:48:15,320 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1029] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
Welcome to ZooKeeper!
JLine support is enabled
2018-11-11 11:48:15,489 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@879] - Socket connection established to localhost/127.0.0.1:2181, initiating session
[zk: localhost:2181(CONNECTING) 0] 2018-11-11 11:48:15,829 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1303] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x100003dc9010000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

[zk: localhost:2181(CONNECTED) 0] 
[zk: localhost:2181(CONNECTED) 0]

這裏Zookeeper單機版就安裝完成了vim

Zookeeper集羣

單機模式的zk進程雖然便於開發與測試,但並不適合在生產環境使用。在生產環境下,咱們須要使用集羣模式來對zk進行部署。api

注意在集羣模式下,建議至少部署3個zk進程,或者部署奇數個zk進程。若是隻部署2個zk進程,當其中一個zk進程掛掉後,剩下的一個進程並不能構成一個quorum的大多數。所以,部署2個進程甚至比單機模式更不可靠,由於2個進程其中一個不可用的可能性比一個進程不可用的可能性還大。bash

我繼續按單機版的安裝方式在例外的兩個虛擬機上安裝2個zookeeper,並互相開放防火牆。

主機 IP
CentOS01 192.168.50.186
CentOS02 192.168.50.164
CentOS03 192.168.50.30

關鍵點是你將全部的zookeeper節點都寫在配置文件裏面去,並在這些主機上開發端口。我開的是2181,2888,3888三個端口,3個主機都開。

個人集羣配置添加以下3個節點配置(記得Linux打開端口):

server.1=192.168.50.186:2888:3888
server.2=192.168.50.164:2888:3888
server.3=192.168.50.30:2888:3888

同時不要忘了在這3個主機安裝的zookeeper的dataDir創建各自的myid文件並填入本身的id.

# 我以3號zookeeper爲例
[thinktik@localhost zookeeper]$ cd data/
[thinktik@localhost data]$ pwd
/home/thinktik/zookeeper/data
# 這個zookeeper配置dataDir下面我創建了myid
[thinktik@localhost data]$ ls
myid  version-2  zookeeper_server.pid
# myid裏面寫上了它的id,id好與server.x的x對應。例如三號機是server.3=192.168.50.30:2888:3888那麼myid裏面填3
[thinktik@localhost data]$ cat myid 
3

啓動集羣,這裏3個zookeeper隨便啓動就能夠,沒什麼前後順序,每一個zookeeper啓動後會找本身其餘節點的。

# 1號zookeeper我先啓動。 2,3號我接着起
[thinktik@localhost bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[thinktik@localhost bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
[thinktik@localhost bin]$ vim ../conf/zoo.cfg 
[thinktik@localhost bin]$ vim ../data/myid 
[thinktik@localhost bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

# 1,2,3都起後查看狀態,1號成了leader
[thinktik@localhost bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: leader
# 啓動2,3號
[thinktik@localhost bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[thinktik@localhost bin]$ vim ../data/myid 
bash: vim: command not found
[thinktik@localhost bin]$ vi ../data/myid 
[thinktik@localhost bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

# 1,2,3都起後查看狀態,2,3號成了leader
[thinktik@localhost bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper/bin/../conf/zoo.cfg
Mode: follower

驗證下集羣的功能

leader:

[zk: localhost:2181(CONNECTED) 0] ls/
ZooKeeper -server host:port cmd args
    stat path [watch]
    set path data [version]
    ls path [watch]
    delquota [-n|-b] path
    ls2 path [watch]
    setAcl path acl
    setquota -n|-b val path
    history 
    redo cmdno
    printwatches on|off
    delete path [version]
    sync path
    listquota path
    rmr path
    get path [watch]
    create [-s] [-e] path data acl
    addauth scheme auth
    quit 
    getAcl path
    close 
    connect host:port
# 建立節點
[zk: localhost:2181(CONNECTED) 1] create /testNode '測試'
Created /testNode
# 節點已建立
[zk: localhost:2181(CONNECTED) 2] ls /
[zookeeper, testNode]

follower

# 查詢節點,發現leader的節點已經同步,一致性沒問題
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper, testNode]
# 查看這個節點的內容,也沒毛病
[zk: localhost:2181(CONNECTED) 3] get /testNode
測試
cZxid = 0x100000002
ctime = Sun Nov 11 13:28:20 CST 2018
mZxid = 0x100000002
mtime = Sun Nov 11 13:28:20 CST 2018
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0

這裏基本集羣就ok了。

本文原創連接:Linux Zookeeper安裝

本文除了閱讀了Zookeeper官方文檔還參考的其餘人寫的文章:

相關文章
相關標籤/搜索