分布式架构——第4篇:构建ZooKeeper伪分布式集群

根据Zab协议的超过半数($2*n+1$)原则。ZooKeeper至少需要3台以上的机器才能构成集群。对于手中目前没有多台机器的,可以使用虚拟机技术容器技术或者是本文将要介绍的多端口伪分布式技术

配置zoo.cfg文件

由于我只有一台服务器,只有一个IP地址,以下采用多端口运行多个ZooKeeper构建伪分布式集群。

将zoo.cfg文件拷贝3份,分别命名为zoo1.cfgzoo2.cfgzoo3.cfg。这里主要注意几处:dataDir、clientPort每个配置必须不同。server每个配置必须相同。

注意: server的格式为server.ID=IP:PORT1:PORT2,ID是当前服务器的编号、IP这里由于是伪分布式全部是同一台,PORT1是用于leader与follower通信使用的,PORT2是供选举使用。

  1. zoo1.cfg

    tickTime=2000
    initLimit=10
    syncLimit=5

    dataDir=/home/byteparallel/Applications/zookeeper/zookeeper-3.4.12/data1

    clientPort=2181

    server.1=127.0.0.1:2887:3887
    server.2=127.0.0.1:2888:3888
    server.3=127.0.0.1:2889:3889
  2. zoo2.cfg

    tickTime=2000
    initLimit=10
    syncLimit=5

    dataDir=/home/byteparallel/Applications/zookeeper/zookeeper-3.4.12/data2

    clientPort=2182

    server.1=127.0.0.1:2887:3887
    server.2=127.0.0.1:2888:3888
    server.3=127.0.0.1:2889:3889
  3. zoo3.cfg

    tickTime=2000
    initLimit=10
    syncLimit=5

    dataDir=/home/byteparallel/Applications/zookeeper/zookeeper-3.4.12/data3

    clientPort=2183

    server.1=127.0.0.1:2887:3887
    server.2=127.0.0.1:2888:3888
    server.3=127.0.0.1:2889:3889

此时,应该是这个状态:

byteparallel@server:~/Applications/zookeeper/zookeeper-3.4.12/conf$ ls
configuration.xsl log4j.properties zoo1.cfg zoo2.cfg zoo3.cfg zoo_sample.cfg

创建data文件夹

data文件夹的具体路径,以及名字,与上文中的zoo.cfg配置文件保持一致即可。

byteparallel@server:~/Applications/zookeeper/zookeeper-3.4.12$ ls
bin data1 docs LICENSE.txt README_packaging.txt zookeeper-3.4.12.jar.asc
build.xml data2 ivysettings.xml log recipes zookeeper-3.4.12.jar.md5
conf data3 ivy.xml NOTICE.txt src zookeeper-3.4.12.jar.sha1
contrib dist-maven lib README.md zookeeper-3.4.12.jar

这里直接在主目录下创建了3个data文件夹,分别命名为data1data2以及data3
接着,分别在这3个data文件夹,并创建myid文件并输入当前服务器的ID(注意与zoo.cfg保持一致)。

$ echo 1 >> data1/myid
$ echo 2 >> data2/myid
$ echo 3 >> data3/myid

启动ZooKeeper集群

集群需要全部服务器启动之后,使用./zkServer.sh status查询ZooKeeper状态才会正常。

byteparallel@server:~/Applications/zookeeper/zookeeper-3.4.12/bin$ ./zkServer.sh start zoo1.cfg
byteparallel@server:~/Applications/zookeeper/zookeeper-3.4.12/bin$ ./zkServer.sh start zoo2.cfg
byteparallel@server:~/Applications/zookeeper/zookeeper-3.4.12/bin$ ./zkServer.sh start zoo3.cfg

可以分别查询每个服务器的状态,

byteparallel@server:~/Applications/zookeeper/zookeeper-3.4.12/bin$ ./zkServer.sh status zoo1.cfg
ZooKeeper JMX enabled by default
Using config: /home/byteparallel/Applications/zookeeper/zookeeper-3.4.12/bin/../conf/zoo1.cfg
Mode: follower

Error contacting service. It is probably not running

构建ZooKeeper伪分布式集群时,遇到了该异常,具体可以查阅参考文献。我是由于端口占用造成的该故障。

异常状态

$ ./zkServer.sh status zoo1.cfg
ZooKeeper JMX enabled by default
Using config: /home/byteparallel/Applications/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg
Error contacting service. It is probably not running

解决方案

首先,查看zoo1.cfg配置文件中的clientPort是否被占用。果然被占用了。

$ netstat -lnp | grep 2181
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp6 0 0 :::2181 :::* LISTEN 2615/java

kill该进程

byteparallel@server:~/Applications/zookeeper/zookeeper-3.4.12/bin$ kill 2615

References:
[1] ubuntu 查看端口被占用并处理
[2] 配置zookeeper异常 Error contacting service. It is probably not running.以及java.net.ConnectException: 拒绝连接
[3] zookeeper 集群中当前zookeeper 状态查看
[4] ZooKeeper的安装