zookeeper提供了单机、分布式和伪分布式三种模式。
#zookeeper的默认配置文件zoo.cfg:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181
条件有限,以伪分布式为例,将zookeeper文件夹复制三份,基本配置如下:
#第一个
tickTime=2000
initLimit=5
syncLimit=2
#我本机的目录
dataDir=D:/zookeeper/zookeeper-3.4.9-1/data
dataLogDir=D:/zookeeper/zookeeper-3.4.9-1/logs
clientPort=2181
server.1=localhost:7888:8888
server.2=localhost:7889:8889
server.3=localhost:7889:8890
#第二个
tickTime=2000
initLimit=5
syncLimit=2
#我本机的目录
dataDir=D:/zookeeper/zookeeper-3.4.9-2/data
dataLogDir=D:/zookeeper/zookeeper-3.4.9-2/logs
clientPort=2182
server.1=localhost:7888:8888
server.2=localhost:7889:8889
server.3=localhost:7889:8890
#第三个
tickTime=2000
initLimit=5
syncLimit=2
#我本机的目录
dataDir=D:/zookeeper/zookeeper-3.4.9-3/data
dataLogDir=D:/zookeeper/zookeeper-3.4.9-3/logs
clientPort=2183
server.1=localhost:7888:8888
server.2=localhost:7889:8889
server.3=localhost:7889:8890
伪分布式和分布式配置的区别在于,伪分布式配置IP地址相同,端口号不同。
windows系统使用%zk_home%/bin目录下的zkServer.cmd启动zookeeper。由于在伪分布式下部署了三个节点,所以依次进入每个文件夹中,启动zookeeper。启动的时候可能会报错。
1 2017-02-09 14:21:38,871 [myid:] - ERROR [main:QuorumPeerMain@85] - Invalid confi 2 g, exiting abnormally 3 org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error proce 4 ssing D:\zookeeper\zookeeper-3.4.9-1\bin\..\conf\zoo.cfg 5 at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerC 6 onfig.java:144) 7 at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(Qu 8 orumPeerMain.java:101) 9 at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain 10 .java:78) 11 Caused by: java.lang.IllegalArgumentException: D:\zookeeper\zookeeper-3.4.9-1\da 12 ta\myid file is missing 13 at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(Q 14 uorumPeerConfig.java:362) 15 at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerC 16 onfig.java:140) 17 ... 2 more 18 Invalid config, exiting abnormally
错误原因是没有找到myid这个文件(如11、12行),需要在配置文件dataDir指定的目录下面(我的是:D:\zookeeper\zookeeper-3.4.9-1\data)建立一个myid文件,内容为1。依次在剩下的两个文件夹中也建立一个myid的文件,内容分别为2和3。
保存后,再次启动,发现又出现异常了,异常比较多,仅截取部分:
1 2017-02-09 14:32:32,467 [myid:1] - WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:218 2 1:QuorumCnxManager@400] - Cannot open channel to 3 at election address localhost 3 /127.0.0.1:8890 4 java.net.ConnectException: Connection refused: connect 5 at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) 6 at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketI 7 mpl.java:85) 8 at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.ja 9 va:350) 10 at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocket 11 Impl.java:206) 12 at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java 13 :188) 14 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 15 at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 16 at java.net.Socket.connect(Socket.java:589) 17 at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(Quorum 18 CnxManager.java:381) 19 at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(Quorum 20 CnxManager.java:426) 21 at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(F 22 astLeaderElection.java:843) 23 at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:822 24 ) 25 2017-02-09 14:32:32,623 [myid:1] - INFO [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:218 26 1:QuorumPeer$QuorumServer@149] - Resolved hostname: localhost to address: localh 27 ost/127.0.0.1 28 2017-02-09 14:32:32,623 [myid:1] - INFO [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:218 29 1:FastLeaderElection@852] - Notification time out: 12800 30 2017-02-09 14:32:46,468 [myid:1] - WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:218 31 1:QuorumCnxManager@400] - Cannot open channel to 2 at election address localhost 32 /127.0.0.1:8889
这个异常其实可以忽略,仔细看2、3、31、32行打印出的信息就明白了。出现这个异常的原因是因为,现在只启动了一个zk节点,而在配置文件中却写了三个zk的地址,第一个zk节点还无法与剩下的两个节点进行通信,所以只要把三个zk节点都启动就没问题了。