ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zkhtml
ZooKeeper有三種安裝模式:單機安裝(standalone)、僞集羣模式、集羣模式:java
真正佈置的基本上都是集羣模式,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
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
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.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
設置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
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集羣中的服務器節點。其中:
因此,分別在每一個實例的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]
以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]