1. 程式人生 > >【ZooKeeper】單機偽叢集搭建(適用於mac)

【ZooKeeper】單機偽叢集搭建(適用於mac)

1.配置

可以選擇需要的版本,我下載的是zookeeper-3.4.6.tar.gz,解壓得到資料夾zookeeper-3.4.3

由於手頭機器不足,所以在一臺機器上部署了3個server,如果你手頭也比較緊,也可以這麼做。

在主資料夾下建立一個zookeeper資料夾,在zookeeper資料夾裡建立三個資料夾server1,server2,server3,

然後每個資料夾裡面解壓一個zookeeper的下載包,並且還建了幾個資料夾,總體結構如下,最後那個是下載過來壓縮包的解壓檔案

data,dataLog,logs,zookeeper-3.4.3

那麼首先進入data目錄,建立一個myid的檔案,裡面寫入一個數字,比如我這個是server1,那麼就寫一個1,server2對應myid檔案就寫入2,server3對應myid檔案就寫個3
然後進入zookeeper-3.4.3/conf目錄,那麼如果是剛下過來,會有3個檔案,configuration.xml, log4j.properties,zoo_sample.cfg,這3個檔案我們首先要做的就是在這個目錄建立一個zoo.cfg的配置檔案,當然你可以把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=/Users/zhaofeng/Documents/zookeeper-cluster/zoo2/data dataLogDir=/Users/zhaofeng/Documents/zookeeper-cluster/zoo2/dataLog # the port at which the clients will connect clientPort=2181

在檔案末尾新增如下內容:

server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

需要注意的是clientPort這個埠如果你是在1臺機器上部署多個server,那麼每臺機器都要不同的clientPort,比如我server1是2181,server2是2182,server3是2183,dataDir和dataLogDir也需要區分下。

最後幾行唯一需要注意的地方就是 server.X 這個數字就是對應 data/myid中的數字。你在3個server的myid檔案中分別寫入了1,2,3,那麼每個server中的zoo.cfg都配server.1,server.2,server.3就OK了。因為在同一臺機器上,後面連著的2個埠3個server都不要一樣,否則埠衝突,其中第一個埠用來叢集成員的資訊交換,第二個埠是在leader掛掉時專門用來進行選舉leader所用。

2.啟動ZooKeeper偽機群的所有伺服器

分別進入三個伺服器的zookeeper-3.4.3/bin目錄下,啟動服務
./zkServer.sh start
啟動完成後,檢視伺服器狀態,
./zkServer.sh status

一般來說,需要注意的是:按照zoo.cfg裡面配置的順序啟動應用。同時需要注意檢視zookeeper.out檔案,如果出現連不上其他的埠號,很正常的事情。

錯誤如下:

Cannot open channel to 3 at election address /127.0.0.1:3890
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:368)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:341)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:449)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:430)
    at java.lang.Thread.run(Thread.java:748)

等待所有的埠都啟動完成後,就可以正常使用了。正常的標識是status返回的內容為

$ ./zkServer.sh status
JMX enabled by default
Using config: /Users/zhaofeng/Documents/zookeeper-cluster/zoo2/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader

3.接入客戶端

進入任意一個伺服器的zookeeper/bin目錄下,啟動一個客戶端,接入服務。

./zkCli.sh –server localhost:2181