若是系統須要同時使用到兩個zk集羣,爲了方便本地調試,須要啓動多個zk實例,他們相互獨立,不是集羣關係。網上關於zk的配置和部署有不少文章,如何配置不是本文的重點。但我在本地部署多實例時遇到了一些小問題,這裏記錄一下如何解決的,也但願能幫助到有相似問題的同窗~java
zk版本:3.5.1bash
首先看一段代碼:this
public static final int DEFAULT_PORT = 8080; private static final String DEFAULT_ADDRESS = "0.0.0.0"; public static final String DEFAULT_COMMAND_URL = "/commands"; public JettyAdminServer() throws AdminServerException { this(System.getProperty("zookeeper.admin.serverAddress", DEFAULT_ADDRESS), Integer.getInteger( "zookeeper.admin.serverPort", DEFAULT_PORT), System .getProperty("zookeeper.admin.commandURL", DEFAULT_COMMAND_URL)); }
看到zk在localhost:port/commands啓動了一個服務。若是配置文件或啓動參數中沒有沒有配置這個端口,zk使用默認端口,即8080。很明顯不一樣實例的admin.serverPor不能相同。調試
我選擇在zoo.cfg中添加配置項,沒有使用啓動參數的方法,由於這樣方便管理:code
admin.serverPort=8081
接着,修改zoo.cfg的其餘配置項server
clientPort=2183 dataDir=指定data路徑 dataLogDir=指定dataLog路徑
接着,若是第二個實例的包是拷貝過來的,先清空dataDir和dataLogDir下面全部文件。部署
最後,分別啓動兩個zk實例。啓動以後分別啓動zkCli,發現默認鏈接的是2181端口的服務。所以修改第二個客戶端的啓動參數:get
./zkCli.sh -server localhost:2183
部署完成。io
ps:爲了方便啓動、中止、查看狀態操做,在~/.bash_profile下建立別名:class
ZK_HOME1=****/zookeeper-3.5.1-alpha ZK_HOME2=*****/zookeeper-3.5.1-alpha export ZK_HOME1 export ZK_HOME2 alias zkCli1='$ZK_HOME1/bin/zkCli.sh' alias zkStart1='$ZK_HOME1/bin/zkServer.sh start' alias zkStop1='$ZK_HOME1/bin/zkServer.sh stop' alias zkStatus1='$ZK_HOME1/bin/zkServer.sh status' alias zkCli2='$ZK_HOME2/bin/zkCli.sh -server localhost:2183' alias zkStart2='$ZK_HOME2/bin/zkServer.sh start' alias zkStop2='$ZK_HOME2/bin/zkServer.sh stop' alias zkStatus2='$ZK_HOME2/bin/zkServer.sh status'