ZooKeeper(三)ZooKeeper的安裝、配置和啓動

Windows下單節點的安裝和啓動

1.下載

此處使用的是 3.4.10 Release 版本,官網下載地址:
http://mirrors.hust.edu.cn/ap...html

2.安裝

解壓到指定目錄下D:\Software\zookeeper-3.4.8\,進入ZooKeeper的配置文件目錄(D:\Software\zookeeper-3.4.8\conf),複製zoo_sample.cfg文件並重命名爲zoo.cfg
主要修改一下ZooKeeper數據和日誌儲存位置,改爲當前windows系統中的某個目錄,具體配置文件以下:java

# 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.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dtaDir=D:\data\zookeeper\data
dtaLogDir=D:\data\zookeeper\log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

3.啓動

進入到bin目錄,雙擊執行zkServer.cmd,這個腳本中會啓動一個java進程。
apache

啓動後用jps -l -v命令能夠看到QuorumPeerMain的進程,這是ZooKeeper的進程。
vim

也能夠在bin目錄下,使用命令zkCli.cmd 127.0.0.1:2181啓動客戶端鏈接一下,看是否能進入到ZooKeeper的命令行操做界面。
windows

至此,成功安裝,很簡單。服務器

ZooKeeper的配置說明

ZooKeeper的配置文件是zoo.cfg,若是該文件不存在,會使用zoo_sample.cfg
zoo.cfg是ZooKeeper的主要配置文件,由於Zookeeper是一個集羣服務,集羣的每一個節點都須要這個配置文件。在zoo.cfg這個配置文件裏沒有跟特定節點相關的配置,因此每一個節點上的這個zoo.cfg都是相同的,這樣很是便於管理,好比咱們能夠把這個文件提交到版本控制裏管理起來。其實這給咱們設計集羣系統的時候也是個提示:集羣系統通常有不少配置,應該儘可能將通用的配置和特定每一個服務的配置(好比服務標識)分離,這樣通用的配置在不一樣服務之間copy就好了。
下面是詳細的配置字段解釋:session

  • <font color=#D2691E>clientPort=2181</font>:

這是客戶端鏈接zookeeper服務的端口,是一個TCP port。數據結構

  • <font color=#D2691E>dataDir=/opt/zookeeper/data</font>:

存放ZooKeeper數據的目錄。socket

  • <font color=#D2691E>dataDir=/opt/zookeeper/data</font>:

存放ZooKeeper日誌的目錄。dataLogDir若是沒提供的話使用的則是dataDir。ZooKeeper的持久化都存儲在這兩個目錄裏。dataLogDir裏是放到的順序日誌(WAL)。而dataDir裏放的是內存數據結構的snapshot,便於快速恢復。爲了達到性能最大化,通常建議把dataDir和dataLogDir分到不一樣的磁盤上,這樣就能夠充分利用磁盤順序寫的特性。ide

  • tickTime:

這是個時間單位定量。好比tickTime=1000,這就表示在ZooKeeper裏1 tick表示1000 ms,全部其餘用到時間的地方都會用多少tick來表示。好比 syncLimit = 2 就表示fowller與leader的心跳時間是2 tick。

  • maxClientCnxns:

對於一個客戶端的鏈接數限制,默認是60,這在大部分時候是足夠了。可是在咱們實際使用中發現,在測試環境常常超過這個數,通過調查發現有的團隊將幾十個應用所有部署到一臺機器上,以方便測試,因而這個數字就超過了。

  • minSessionTimeout, maxSessionTimeout:

通常客戶端鏈接zookeeper的時候,都會設置一個session timeout,若是超過這個時間client沒有與zookeeper server有聯繫,則這個session會被設置爲過時。可是這個時間不是客戶端能夠無限制設置的,服務器能夠設置這兩個參數來限制客戶端設置的範圍。

  • autopurge.snapRetainCount,autopurge.purgeInterval:

客戶端在與zookeeper交互過程當中會產生很是多的日誌,並且zookeeper也會將內存中的數據做爲snapshot保存下來,這些數據是不會被自動刪除的,這樣磁盤中這樣的數據就會愈來愈多。不過能夠經過這兩個參數來設置,讓ZooKeeper自動刪除數據。autopurge.purgeInterval就是設置多少小時清理一次。而autopurge.snapRetainCount是設置保留多少個snapshot,以前的則刪除。不過若是你的集羣是一個很是繁忙的集羣,而後又碰上這個刪除操做,可能會影響ZooKeeper集羣的性能,因此通常會讓這個過程在訪問低谷的時候進行,可是遺憾的是ZooKeeper並無設置在哪一個時間點運行的設置,因此有的時候咱們能夠禁用這個自動刪除的功能,而在服務器上配置一個cron腳本,而後在凌晨來作這件事情。

以上就是zoo.cfg裏的一些基本配置了。但這是對於單個節點的配置,對於ZooKeeper集羣的須要配置以下兩點:

1.配置集羣中服務的列表

server.1=127.0.0.1:20881:30881
server.2=127.0.0.1:20882:30882
server.3=127.0.0.1:20883:30883

在上面的例子中,我把三個ZooKeeper服務放到同一臺機器上。上面的配置中有兩個TCP port。後面一個是用於ZooKeeper選舉用的,而前一個是Leader和Follower或Observer交換數據使用的。咱們還注意到server.後面的數字。這個叫作myid。

2.配置-myid

在dataDir裏會放置一個myid文件,裏面就一個數字,用來惟一標識這個服務。這個id是很重要的,必定要保證整個集羣中惟一。ZooKeeper會根據這個id來取出server.x上的配置。好比當前id爲1,則對應着zoo.cfg裏的server.1的配置。myid的值在選舉master的時候也會用到。

Linux下ZooKeeper集羣的安裝

1.開啓三臺虛擬機server_01(192.168.128.1),server_02(192.168.128.2),server_03(192.168.128.3),並都使用root用戶登陸。這三個Linux系統上都裝好JDK,並配置了JAVA_HOME環境變量。
2.在server_01上解壓 zookeeper-3.4.11.tar.gz 文件到 /opt 目錄下。
tar -zxvf /root/software/zookeeper-3.4.11.tar.gz -C /opt
3.進入到解壓後的zookeeper配置文件目錄,
cd /opt/zookeeper-3.4.11/conf
仍是和單節點安裝同樣,複製zoo_sample.cfg文件,並命名新的文件名爲 zoo.cfg。
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
添加以下內容:

dataDir=/root/zookeeper-data
dataLogDir=/root/zookeeper-log

#主機ip, 心跳端口、數據端口
server.1=192.168.128.1:2888:3888   # 1表示myid爲1的zookeeper
server.2=192.168.128.2:2888:3888
server.3=192.168.128.3:2888:3888

4.建立存儲zookeeper數據和日誌的兩個文件夾。
mkdir /root/zookeeper-data
mkdir /root/zookeeper-log
並在數據目錄下建立一個myid文件,該文件存儲該服務器對應的myid值。
cd /root/zookeeper-data
cat 1 > myid

5.其餘兩臺服務器也作相應的設置,myid設置成2和3,可使用scp命令將ZooKeeper的解壓目錄直接拷貝過去。
6.啓動三臺服務器上的ZooKeeper。在$ZOOKEEPER_HONE/bin目錄下,執行命令:
zkServer.sh start

7.三臺服務器上的ZooKeeper都啓動後,能夠查看哪一個是leader,哪一個是follower。
zkServer.sh status

至此,咱們的ZooKeeper集羣就啓動起來了。

PS:我一開始在運行 zkServer.sh status 命令時報錯了,顯示以下:

JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.

查看bin目錄下的 zookeeper.out 日誌,顯示是當前服務器和其它服務器經過3888端口通訊時,鏈接被拒絕。

2017-11-15 06:26:50,306 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@584] - Cannot open channel to 2 at election address server_02/192.168.128.2:3888
java.net.ConnectException: Connection refused (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:558)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:610)
        at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:845)
        at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:957)
2017-11-15 06:26:50,308 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumPeer$QuorumServer@184] - Resolved hostname: server_02 to address: server_02/192.168.128.2
2017-11-15 06:26:50,312 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@584] - Cannot open channel to 3 at election address server_03/192.168.128.3:3888
java.net.ConnectException: Connection refused (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:558)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:610)
        at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:845)
        at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:957)
2017-11-15 06:26:50,313 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumPeer$QuorumServer@184] - Resolved hostname: server_03 to address: server_03/192.168.128.3
2017-11-15 06:26:50,314 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:FastLeaderElection@854] - Notification time out: 60000

如何解決的:在配置ZooKeeper的配置文件時,使用ip的方式。

而原來我是使用的以下的主機名的方式:

server.1=server_01:2888:3888   
server.2=server_02:2888:3888
server.3=server_03:2888:3888

緣由:在三臺服務器的/etc/hosts文件中都要配置了ip和主機名的對應關係。對應每個服務器,不只要配置迴環地址的名字,還要另外單獨配置本身ip對應的主機名。也就是說在hosts文件中,除了127.0.0.1和::1,還要配置本機ip對應的主機名。若是要配置成主機名的形式,hosts文件配置成以下就能夠了。

127.0.0.1   localhost
::1         localhost
192.168.128.1   server01
192.168.128.2   server02
192.168.128.3   server03
192.168.128.4   server04
相關文章
相關標籤/搜索