1. 程式人生 > >(五)zookeeper windows單機模式和偽叢集模式

(五)zookeeper windows單機模式和偽叢集模式

        zookeeper是一個分散式應用所設計的分佈的、開源的協調服務,它主要是用來解決分散式應用中經常遇到的一些資料管理問題,簡化分散式應用,協調及其管理的難度,提高效能的分散式服務。

zookeeper本身是可以以Standalone模式安裝執行,不過它在分散式Zookeeper叢集中(一個Leader,多個Follower),基於選舉演算法來保證zookeeper叢集的穩定性和可用性,從而保證了分散式的可靠性。

一、單機模式安裝

1、解壓到自己任意磁碟下,我的位置是D:\zookeeper-3.4.6

2、複製zoo_sample.cfg 重新命名為zoo.cfg。

zoo.cfg中的內容如下:

# 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.
dataDir=D:\\data\\zookeeper
# log config
dataLogDir=D:\\log\\zookeeper
# 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

其中

dataDir為zookeeper資料存放位置,zookeeper將寫資料的日誌檔案儲存在這個目錄裡。

dataLogDir是日誌檔案。

clientPort=2181是zookeeper埠,我們連線zookeeper的埠,zookeeper會監聽這個埠,接收客戶端訪問請求。

tickTime:zookeeper伺服器之間,或者zookeeper客戶端與伺服器之間維持的心跳的時間間隔,每隔tickTime時間,會執行一次。(心跳證明活著,心跳時間就是超時設定時間,可以理解為客戶端和伺服器端的session)

3 、轉到D盤的zookeeper bin目錄下,執行zkServer.cmd,這樣就啟動了zookeeper服務了。

4、檢視zookeeper執行情況:D:\zookeeper-3.4.6\bin>zkCli.cmd-server 127.0.0.1:2181。

這樣就完成了zookeeper windows單機模式安裝。

二、偽叢集模式安裝

在一臺PC上啟動多個Zookeeper例項,同一個不同的埠,來實現微叢集。

簡單原理:

選舉演算法,有興趣的同學可以看看,後續篇章中會詳述。

1、修改載入的配置檔案。在D:\zookeeper-3.4.6\conf 下複製zoo.cfg重新命名為zoo1.cfg ,zoo2.cfg,zoo3.cfg


修改以下如下:

dataDir=D:\\data\\zookeeper\\1
# log config
#dataLogDir=D:\\log\\zookeeper
# the port at which the clients will connect
clientPort=2181
#新增叢集配置
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

zoo1.cfg 檔案修改dataDir目錄為D:\\data\\zookeeper\\1,修改clientPort為2181 ,同時新增server.1=localhost:2887:3887
server.2=localhost:2888:3888  server.3=localhost:2889:3889

server.num=ip/domain:Port1:Port2

其中num:表示數字表示第幾號伺服器;ip/domain :是伺服器域名或者ip地址。Port1:表示這個伺服器和叢集中的Leader伺服器交換資訊的埠;Port2:表示萬一叢集中的Leader伺服器掛了,需要一個埠重新進行選舉,選出一個新的Leader,這個埠就是用來執行選舉時伺服器相互通訊的埠。

由於我們是偽叢集,所以ip或者域名是一樣的,所以要分配不同的埠號。

zoo2.cfg也是如此修改,copy zoo1.cfg 只要修改上述紅色標記的即可,\\2 clientPort=2182 ,類推,zoo2.cfg修改clientPort為2183 。

2、修改命令,載入不同的配置。複製zkServer.cmd並且重新命名為,zkServer-1.cmd,zkServer-2.cmd,zkServer-3.cmd 分別修改這三個cmd如下所示。

setlocal
call "%~dp0zkEnv.cmd"

set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
set ZOOCFG=D:\zookeeper-3.4.6\conf\zoo1.cfg
echo on
java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*

endlocal
不同的zkServer- 1 2 3  .cmd分別新增一行set ZOOCFG=..\zoo1.cfg zoo2.cfg zoo3.cfg

3、分別啟動zkServer-1 .cmd、zkServer-2.cmd zkServer-3.cmd

啟動可能會報如下錯誤

2015-10-09 11:20:08,162 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:218
1:QuorumCnxManager@382] - Cannot open channel to 3 at election address localhost
/192.168.132.16:3889
java.net.ConnectException: Connection refused: connect
        at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketI
mpl.java:85)
這是因為,zookeeper叢集採用的是選舉演算法,當叢集中的其他節點還沒有啟動的時候,選舉演算法就會出現異常,因為至少三臺能選舉出一個leader,2n+1臺機器,可以選舉n個leader,當全部啟動起來後,就不會報異常,所以上述的報錯是可以忽略的,儘管啟動這三個節點即可。

這樣在一臺機器上搭建了zookeeper偽叢集,並且啟動成功。

接下來是zookeeper的視覺化介面zkui的使用。

歡迎指教~