ZooKeeper系列(1):安裝搭建ZooKeeper環境

ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zkhtml

 


ZooKeeper有三種安裝模式:單機安裝(standalone)、僞集羣模式、集羣模式:java

  • standalone模式:只在一臺機器上安裝ZooKeeper,並只啓動一個ZooKeeper實例。
  • 僞集羣:在一臺機器上開啓多個ZooKeeper實例來模擬集羣。經過加載不一樣配置文件,分配不一樣數據目錄來實現這種模式。由於在同一機器上運行,因此機器宕機,整個ZooKeeper就掛了。基本上不會佈置這樣的ZooKeeper集羣。
  • 集羣模式:在至少3臺機器上安裝ZooKeeper構成集羣,只要故障節點數量在必定範圍內就能保證ZooKeeper服務的可用性。

真正佈置的基本上都是集羣模式,standalone偶爾用來作些測試,它有單點故障,僞集羣模式也有單點故障。node

集羣模式並不是必定至少3臺機器,但用2臺機器比1臺機器更危險,由於隨便故障一臺都沒法知足"大多數"的要求,都會阻塞整個ZooKeeper服務。而2臺機器的故障概率是1臺機器的2倍。因此,也建議採用奇數臺機器來部署ZooKeeper。linux

ZooKeeper下載:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/apache

我下載的是3.4.12版本。windows

1.安裝jdk

ZooKeeper運行在java環境下,因此須要先安裝jdk,且要求版本高於1.6。bash

jdk下載:http://www.oracle.com/technetwork/java/javase/downloads/index.html服務器

以rpm包的爲例。oracle

yum localinstall -y jdk-8u131-linux-x64.rpm

rpm包的安裝路徑爲/usr/java。工具

[root@s1 ~]# ls -l /usr/java/
total 4
lrwxrwxrwx 1 root root   16 Jun 26 22:53 default -> /usr/java/latest
drwxr-xr-x 9 root root 4096 Jun 26 22:53 jdk1.8.0_131
lrwxrwxrwx 1 root root   22 Jun 26 22:53 latest -> /usr/java/jdk1.8.0_131

經過這種軟連接方式,之後有新版jdk要安裝,直接改latest的連接對象便可。

而後再設置JAVA_HOME環境變量並導出java程序所在目錄的PATH環境變量。

echo 'JAVA_HOME=/usr/java/latest' > /etc/profile.d/jdk.sh
echo 'PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/jdk.sh
chmod +x /etc/profile.d/jdk.sh
source /etc/profile.d/jdk.sh

2.StandAlone模式

standalone模式是在單機上安裝ZooKeeper。

先解壓zookeeper-3.4.12.tar.gz。

tar xf zookeeper-3.4.12.tar.gz

再把它移到/usr/local/下方便管理。

mv zookeeper-3.4.12 /usr/local/zookeeper

在ZooKeeper的bin目錄下提供了幾個Windows和Linux下的腳本:

[root@s2 zookeeper]# cd /usr/local/zookeeper
[root@s2 zookeeper]# ls bin
README.txt  zkCleanup.sh  zkCli.cmd  zkCli.sh  zkEnv.cmd  zkEnv.sh  zkServer.cmd  zkServer.sh
  • zkServer:用於啓動、中止ZooKeeper,且能查看ZooKeeper狀態。
zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
  • zkEnv:設置ZooKeeper啓動、關閉時的環境變量。在其他的每一個腳本中都引用了這個腳本。
  • zkCleanup:清除ZooKeeper的事務日誌和快照。
  • zkCli:ZooKeeper的一個命令行客戶端。

設置ZooKeeper的環境變量,這不是必須的,只是爲了方便操做上面的幾個腳本。

echo 'ZOOKEEPER_HOME=/usr/local/zookeeper' >/etc/profile.d/zk.sh
echo 'PATH=$ZOOKEEPER_HOME/bin:$PATH' >> /etc/profile.d/zk.sh
chmod +x /etc/profile.d/zk.sh
source /etc/profile.d/zk.sh

把windows下的腳本刪除:

rm -rf /usr/local/zookeeper/bin/{*.cmd,README.txt}

爲了啓動ZooKeeper,先提供一個配置文件。默認配置文件的路徑爲$ZOOKEEPER_HOME下的conf目錄。在這個目錄下,有幾個文件:

[root@s2 zookeeper]# ls conf
configuration.xsl  log4j.properties  zoo_sample.cfg
  • configuration.xsl:無視它。
  • log4f.properties:是ZooKeeper的日誌配置文件。
  • zoo_sample.cfg:是ZooKeeper的示例配置文件。

zkServer.sh默認的配置文件名爲zoo.cfg。因此,在conf目錄下建立一個zoo.cfg。寫入幾個保證ZooKeeper能正常運行的配置項:

tickTime=2000
dataDir=/usr/local/zookeeper/data1
clientPort=2181

其中:

  • tickTime:ZooKeeper中不少配置項(如心跳時間、鏈接超時時間等)都要用到的時間單位,這裏配置爲2000毫秒,即2秒。
  • dataDir:ZooKeeper實例的數據目錄。
  • clientPort:ZooKeeper向外提供服務的端口。

而後用zkServer.sh來啓動ZooKeeper。

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

也能夠手動指定啓動時讀取的配置文件:

[root@s2 zk]# zkServer.sh start /usr/local/zookeeper/conf/zoo.cfg

查看ZooKeeper的運行狀態:

[root@s2 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: standalone

能夠看到運行模式是"standalone"。

ZooKeeper啓動後,就能夠向外提供ZooKeeper服務了。這裏用ZooKeeper提供的命令行客戶端去鏈接一下ZooKeeper作個簡單的測試。

鏈接ZooKeeper實例:

zkCli.sh -server localhost:2181

鏈接過程當中會輸出一大堆信息。當鏈接成功後,將進入ZooKeeper的交互式模式:

WatchedEvent state:SyncConnected type:None path:null

[zk: localhost:2181(CONNECTED) 0]   # 在這裏輸入ZooKeeper容許的命令

例如,建立一個znode:

[zk: localhost:2181(CONNECTED) 0] create /zk_test mydata1
Created /zk_test
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper, zk_test]

[zk: localhost:2181(CONNECTED) 2] quit

3.配置僞集羣模式

ZooKeeper的僞集羣模式是在一個服務器上運行多個ZooKeeper實例來模擬ZooKeeper集羣。僞集羣模式下,每一個實例的配置文件不一樣、數據目錄不一樣、端口不一樣。通常來講,ZooKeeper集羣至少須要3個服務器節點。

這裏,我配置3個實例的ZooKeeper僞集羣,它們的數據目錄分別爲$ZOOKEEPER_HOME下的data一、data2和data3。由於稍後要向這些目錄中寫myid文件,因此先建立這3個目錄:

mkdir /usr/local/zookeeper/data{1,2,3}

先提供3個實例的配置文件,分別爲$ZOOKEEPER_HOME/conf/{zoo1.cfg,zoo2.cfg,zoo3.cfg}

如下是zoo1.cfg內容,各配置項稍後解釋。

tickTime=2000
dataDir=/usr/local/zookeeper/data1
clientPort=2181
initLimit=5
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

如下是zoo2.cfg內容,各配置項稍後解釋。

tickTime=2000
dataDir=/usr/local/zookeeper/data2
clientPort=2182
initLimit=5
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

如下是zoo3.cfg內容,各配置項稍後解釋。

tickTime=2000
dataDir=/usr/local/zookeeper/data3
clientPort=2183
initLimit=5
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

上面的配置項中:

  • initLimit:當非leader節點(即follower和observer)啓動時,須要先從leader那裏複製數據,以保證全部ZooKeeper節點數據都是同步的。這個選項設置非leader節點從啓動到完成同步的超時時長,它以tickTime爲時間單位,因此上面的超時時長爲5*2=10秒。

    通常來講,ZooKeeper保存的都是協調數據,數據量並不大,因此多數時候能夠忽略這個參數,若是待同步數據真的很大,能夠考慮增長這個超時時間。

  • syncLimit:follower和leader之間數據延遲的最大時間長度。例如,有個節點的更新操做緩慢,它的數據已經嚴重落後於leader,ZooKeeper就會將它從ZooKeeper集羣中踢出去。ZooKeeper使用時間來度量follower和leader之間數據的延遲,這個選項的值依賴於tickTime,例如tickTime=2000,syncLimit=2表示follower比leader延遲了4秒。
  • server.X=[hostname]:port_A:port_B:該選項用來指定ZooKeeper集羣中的服務器節點。其中:
    • X:整數。是ZooKeeper中服務器的一個簡單標識。這個數值須要和dataDir下的myid文件內容一致。在啓動ZooKeeper集羣中的每一個實例時,須要讀取數據目錄中的myid文件,並將該文件中的數值和配置文件中的server.X作匹配,匹配到哪一個就表示是哪一個ZooKeeper服務器節點。
    • hostname:ZooKeeper服務器節點的地址。
    • port_A:這是第一個端口,用於Follower和Leader之間的數據同步和其它通訊。
    • port_B:這是第二個端口,用於Leader選舉過程當中投票通訊。

因此,分別在每一個實例的dataDir下建立對應的myid文件。

echo 1 >/usr/local/zookeeper/data1/myid
echo 2 >/usr/local/zookeeper/data2/myid
echo 3 >/usr/local/zookeeper/data3/myid

而後啓動這3個ZooKeeper實例。

zkServer.sh start /usr/local/zookeeper/conf/zoo1.cfg
zkServer.sh start /usr/local/zookeeper/conf/zoo2.cfg
zkServer.sh start /usr/local/zookeeper/conf/zoo3.cfg

查看當前java進程列表:

[root@s1 zk]# jps -l
5473 org.apache.zookeeper.server.quorum.QuorumPeerMain
5395 org.apache.zookeeper.server.quorum.QuorumPeerMain
5427 org.apache.zookeeper.server.quorum.QuorumPeerMain
5524 sun.tools.jps.Jps

查看這3個實例之間的關係:zoo2.cfg被選爲leader,其它是follower。

[root@s1 zk]# zkServer.sh status /usr/local/zookeeper/conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo3.cfg
Mode: follower

[root@s1 zk]# zkServer.sh status /usr/local/zookeeper/conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo1.cfg
Mode: follower

[root@s1 zk]# zkServer.sh status /usr/local/zookeeper/conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo2.cfg
Mode: leader

能夠用ZooKeeper提供的命令行客戶端工具來測試,寫入其中一個實例的數據,其它實例也能收到。

[root@s1 zk]# zkCli.sh -server localhost:2181 create /my_znode hello
......省略.........
WatchedEvent state:SyncConnected type:None path:null
Created /my_znode


[root@s1 zk]# zkCli.sh -server localhost:2182 ls /
......省略........
WatchedEvent state:SyncConnected type:None path:null
[my_znode, zookeeper]

4.配置ZooKeeper集羣

以3節點的集羣爲例:192.168.100.2一、192.168.100.2二、192.168.100.23。由於前面配置單機ZooKeeper和僞集羣ZooKeeper已經解釋過全部步驟和配置項的意義,因此這裏就直接給步驟。

假設已經在3個節點上都安裝好了jdk(這是前提),並下載好了ZooKeeper。

先解壓zookeeper-3.4.12.tar.gz。

# 3個節點都執行
tar xf zookeeper-3.4.12.tar.gz
mv zookeeper-3.4.12 /usr/local/zookeeper

添加ZooKeeper環境變量,非必須過程,但建議。

# 在3節點上都執行
echo 'ZOOKEEPER_HOME=/usr/local/zookeeper' >/etc/profile.d/zk.sh
echo 'PATH=$ZOOKEEPER_HOME/bin:$PATH' >> /etc/profile.d/zk.sh
chmod +x /etc/profile.d/zk.sh
source /etc/profile.d/zk.sh

提供配置文件。如下是3個節點上的配置文件:

[root@s1 zk]# cat /usr/local/zookeeper/conf/zoo.cfg 
tickTime=2000
dataDir=/usr/local/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=192.168.100.21:2888:3888
server.2=192.168.100.22:2888:3888
server.3=192.168.100.23:2888:3888

在三個節點上都建立好數據目錄,並寫入myid文件。

# 3個節點上都執行:
mkdir /usr/local/zookeeper/data

# 192.168.100.21上執行
echo 1 >/usr/local/zookeeper/data/myid

# 192.168.100.22上執行
echo 2 >/usr/local/zookeeper/data/myid

# 192.168.100.23上執行
echo 3 >/usr/local/zookeeper/data/myid

啓動這3個ZooKeeper實例。

# 3個節點都執行:
zkServer.sh start

而後在3個節點上都驗證一下是否正確啓動ZooKeeper。

# 節點1上執行:
[root@s1 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

# 節點2上執行:
[root@s2 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

# 節點3上執行:
[root@s3 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader

若是某個服務器實例出現了錯誤,請zkServer.sh stop關閉ZooKeeper實例,而後jps命令查看下是否還有ZooKeeper實例在運行,若是有,kill掉。而後再啓動ZooKeeper。另外,建議在第一次啓動ZooKeeper以前,先將dataDir/version-2目錄刪除(若是已存在,由於多是之前的實例由於各類緣由而留下來的)。

最後測試下,某節點上建立一個znode,其它節點是否也同步了該節點。

# 在192.168.100.21上建立一個znode:
[root@s2 zk]# zkCli.sh -server 192.168.100.21:2181 create /test_znode "hello world"
Connecting to 192.168.100.21:2181
.........省略..........
Created /test_znode

# 在192.168.100.22上獲取這個znode
[root@s2 zk]# zkCli.sh -server 192.168.100.22:2181 get /test_znode
Connecting to 192.168.100.22:2181
.........省略..........
hello world
cZxid = 0x100000002
ctime = Wed Jun 27 08:14:38 CST 2018
mZxid = 0x100000002
mtime = Wed Jun 27 08:14:38 CST 2018
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0

# 在192.168.100.23上獲取這個znode
[root@s2 zk]# zkCli.sh -server 192.168.100.23:2181 ls /
Connecting to 192.168.100.23:2181
.........省略..........
[zookeeper, test_znode]
相關文章
相關標籤/搜索