一,下載Zookeeper安裝包
從官方網站下載穩定版安裝包后,解壓。
其中ZK_HOME 為:D:\Program Files\zookeeper-3.4.9
二,啟動Zookeeper Server
由於在Eclipse里面寫的程序是Client,需要連接到Zookeeper Server。因此,需要開啟Zookeeper Server。在Windows下,運行ZK_HOME/bin/zkServer.cmd 即可啟動Zookeeper Server
如何啟動報錯提示找不到zoo.cfg,這是因為官網提供的是 ZK_HOME/conf/zoo_sample.cfg,復制一份重命名即可。
在Windows環境下,需要注意的是配置 dataDir 參數的值。它默認是在 ZK_HOME/bin/目錄下。可以把它配置為其他目錄,比如:
表示將dataDir指定為其轉為目錄的父目錄下的 dataDir文件夾下(D:\Program Files\zookeeper-3.4.9\dataDir)
在cmd命令行啟動Zookeeper Server: >zkServer.cmd
當有新的Client連接到Server后,就該cmd窗口就會輸出一些新的內容,如下:
三,Eclipse開發環境配置
新建一個Maven工程,添加:
<groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.9</version>
新建一個Class,源代碼如下:
import java.io.IOException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; public class Master implements Watcher{ ZooKeeper zk; String hostPort; public Master(String hostPort) { this.hostPort = hostPort; } void startZK() throws IOException{ zk = new ZooKeeper(hostPort, 15000, this); } @Override public void process(WatchedEvent event) { System.out.println(event); } public static void main(String[] args) throws Exception{ String add = "localhost:2181"; Master m = new Master(add); m.startZK(); Thread.sleep(60000); } }
Master.java的功能只是簡單地建立一個Zookeeper 會話。
運行這個類,Eclipse控制台輸出:
2016-10-20 20:59:06,068 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=E:\workspace\eclipse-workspace\zookeeper 2016-10-20 20:59:06,068 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=localhost:2181 sessionTimeout=15000 watcher=zookeeper.Master@62f6fb59 2016-10-20 20:59:06,114 [myid:] - INFO [main-SendThread(0:0:0:0:0:0:0:1:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 0:0:0:0:0:0:0:1/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error) 2016-10-20 20:59:06,114 [myid:] - INFO [main-SendThread(0:0:0:0:0:0:0:1:2181):ClientCnxn$SendThread@876] - Socket connection established to 0:0:0:0:0:0:0:1/0:0:0:0:0:0:0:1:2181, initiating session 2016-10-20 20:59:06,177 [myid:] - INFO [main-SendThread(0:0:0:0:0:0:0:1:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 0:0:0:0:0:0:0:1/0:0:0:0:0:0:0:1:2181, sessionid = 0x157e226a4790000, negotiated timeout = 15000 WatchedEvent state:SyncConnected type:None path:null
表明,測試連接成功。
如果運行時報錯:
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
表明你的配置文件沒有添加到classpath下。只需要將ZK_HOME/conf/log4j.properties 放到工程的src目錄下即可。
四,在單機中模擬Zookeeper集群
Zookeeper只需要添加若干配置文件,就可以在一台電腦上運行多個Zookeeper服務端,從而模擬Zookeeper集群。它是通過在一台電腦上運行多個進程,每個進程單獨代表一個Zookeeper服務器,從而組成Zookeeper集群的。
具體配置如下:
Zookeeper默認的配置文件是zoo_sample.cfg ,將該配置文件復制三份:
cp zoo_sample.cfg zoo.cfg zoo1.cfg zoo2.cfg
然后修改以下幾個參數:①dataDir ②clientPort ③添加 server.n=ip:仲裁通信端口號:Leader選舉端口號
比如,這三個配置文件中的相應參數分別如下:
zoo.cfg
dataDir=/home/xxx/dataDir
clientPort=2181
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
zoo2.cfg
dataDir=/home/xxx/dataDir2
clientPort=2182
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
zoo3.cfg
dataDir=/home/xxx/dataDir3
clientPort=2183
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
另外,在dataDir指定的目錄下,創建一個myid文本文件,用來標識Zookeeper服務器的ID信息。
echo 1 > $dataDir/myid
echo 2 > $dataDir2/myid
echo 3 > $dataDir3/myid
使用相應的配置文件來啟動Zookeeper服務。如下圖,一共啟動了三個Zookeeper服務,從而在單機上模擬一個三節點集群。
參考:《Zookeeper分布式過程協同技術詳解》