zookeeper伪分布式配置与遇到的问题

  zookeeper提供了单机、分布式和伪分布式三种模式。

1
2
3
4
5
6
#zookeeper的默认配置文件zoo.cfg:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181

  条件有限,以伪分布式为例,将zookeeper文件夹复制三份,基本配置如下:

1
2
3
4
5
6
7
8
9
10
11
#第一个
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
1
2
3
4
5
6
7
8
9
10
11
#第二个
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
1
2
3
4
5
6
7
8
9
10
11
#第三个
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地址相同,端口号不同

  其中,localhost:7889:8890,第一个端口号用来通信,第二个端口号用来进行leader选举。

  windows系统使用%zk_home%/bin目录下的zkServer.cmd启动zookeeper。由于在伪分布式下部署了三个节点,所以依次进入每个文件夹中,启动zookeeper。启动的时候可能会报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2017-02-09 14:21:38,871 [myid:] - ERROR [main:QuorumPeerMain@85] - Invalid confi
g, exiting abnormally
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error proce
ssing D:\zookeeper\zookeeper-3.4.9-1\bin\..\conf\zoo.cfg
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerC
onfig.java:144)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(Qu
orumPeerMain.java:101)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain
.java:78)
Caused by: java.lang.IllegalArgumentException: D:\zookeeper\zookeeper-3.4.9-1\da
ta\myid file is missing
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(Q
uorumPeerConfig.java:362)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerC
onfig.java:140)
... 2 more
Invalid config, exiting abnormally

  错误原因是没有找到myid这个文件(如11、12行),需要在配置文件dataDir指定的目录下面(我的是:D:\zookeeper\zookeeper-3.4.9-1\data)建立一个myid文件,内容为1。依次在剩下的两个文件夹中也建立一个myid的文件,内容分别为2和3。

  保存后,再次启动,发现又出现异常了,异常比较多,仅截取部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2017-02-09 14:32:32,467 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:218
1:QuorumCnxManager@400] - Cannot open channel to 3 at election address localhost
/127.0.0.1:8890
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketI
mpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.ja
va:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocket
Impl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java
:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(Quorum
CnxManager.java:381)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(Quorum
CnxManager.java:426)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(F
astLeaderElection.java:843)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:822
)
2017-02-09 14:32:32,623 [myid:1] - INFO [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:218
1:QuorumPeer$QuorumServer@149] - Resolved hostname: localhost to address: localh
ost/127.0.0.1
2017-02-09 14:32:32,623 [myid:1] - INFO [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:218
1:FastLeaderElection@852] - Notification time out: 12800
2017-02-09 14:32:46,468 [myid:1] - WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:218
1:QuorumCnxManager@400] - Cannot open channel to 2 at election address localhost
/127.0.0.1:8889

  这个异常其实可以忽略,仔细看2、3、31、32行打印出的信息就明白了。出现这个异常的原因是因为,现在只启动了一个zk节点,而在配置文件中却写了三个zk的地址,第一个zk节点还无法与剩下的两个节点进行通信,所以只要把三个zk节点都启动就没问题了。