1.2 Zookeeper集群环境搭建

2016-04-12 23:11:21 5,863 0

所谓Zookeeper的伪分布式搭建,就是在同一台机器上的不同端口,启动多个zookeeper Server实例,并通过多个配置文件来实现Server之间的通信。

新建以下目录和文件:

[root@www zookeeper-3.4.5-cdh5.4.7]# tree $ZOOKEEPER_HOME/pseudo_conf/
/usr/local/zookeeper-3.4.5-cdh5.4.7/pseudo_conf/
├── zk1
│   ├── data
│   │   └── myid
│   └── zk1.cfg
├── zk2
│   ├── data
│   │   └── myid
│   └── zk2.cfg
└── zk3
    ├── data
    │   └── myid
    └── zk3.cfg


创建脚本

mkdir $ZOOKEEPER_HOME/pseudo_conf
mkdir $ZOOKEEPER_HOME/pseudo_conf/zk1
mkdir $ZOOKEEPER_HOME/pseudo_conf/zk2
mkdir $ZOOKEEPER_HOME/pseudo_conf/zk3
mkdir $ZOOKEEPER_HOME/pseudo_conf/zk1/data
mkdir $ZOOKEEPER_HOME/pseudo_conf/zk2/data
mkdir $ZOOKEEPER_HOME/pseudo_conf/zk3/data
touch $ZOOKEEPER_HOME/pseudo_conf/zk1/data/myid
touch $ZOOKEEPER_HOME/pseudo_conf/zk2/data/myid
touch $ZOOKEEPER_HOME/pseudo_conf/zk3/data/myid
echo 1 > $ZOOKEEPER_HOME/pseudo_conf/zk1/data/myid
echo 2 > $ZOOKEEPER_HOME/pseudo_conf/zk2/data/myid
echo 3 > $ZOOKEEPER_HOME/pseudo_conf/zk3/data/myid
touch $ZOOKEEPER_HOME/pseudo_conf/zk1/zk1.cfg
touch $ZOOKEEPER_HOME/pseudo_conf/zk2/zk2.cfg
touch $ZOOKEEPER_HOME/pseudo_conf/zk3/zk3.cfg

zk1.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=./data
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

zk2.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=./data
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

启动zk1

cd $ZOOKEEPER_HOME/pseudo_conf/zk1
#第一个参数值可以使start/stop  第二个参数指的是配置文件的配置
/usr/local/zookeeper-3.4.5-cdh5.4.7/bin/zkServer.sh start ./zk1.cfg

因为我们设置了集群中有3台机器,现在只启动了其中一台,因为Zookeeper目前还是不可以用的,

查看当前目录下的zookeeper.out文件,有类似以下内容

... [myid:1] - INFO [QuorumPeer[myid=1]/...:2181:QuorumPeer@670] - LOOKING
... [myid:1] - INFO [QuorumPeer[myid=1]/...:2181:FastLeaderElection@740] -
New election. My id = 1, proposed zxid=0x0
... [myid:1] - INFO [WorkerReceiver[myid=1]:FastLeaderElection@542] -
Notification: 1 ..., LOOKING (my state)
... [myid:1] - WARN [WorkerSender[myid=1]:QuorumCnxManager@368] - Cannot
open channel to 2 at election address /127.0.0.1:3334
Java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)

可以看到zk1尝试连接其他的zookeeper server,但是由于其他的都没启动,所以连接失败。


启动zk2

cd $ZOOKEEPER_HOME/pseudo_conf/zk2
#第一个参数值可以使start/stop  第二个参数指的是配置文件的配置
/usr/local/zookeeper-3.4.5-cdh5.4.7/bin/zkServer.sh start ./zk2.cfg

查看zk2的启动日志

... [myid:1] - INFO [QuorumPeer[myid=1]/...:2181:QuorumPeer@738] -
FOLLOWING
... [myid:1] - INFO [QuorumPeer[myid=1]/...:2181:ZooKeeperServer@162] -
Created server ...
... [myid:1] - INFO [QuorumPeer[myid=1]/...:2181:Follower@63] - FOLLOWING
- LEADER ELECTION TOOK - 212

说明zk1是follower。

虽然我们只启动了2个zk实例,但是由于已经超过集群总数的一半(3个当中启动了2个),所以此时服务已经可以用使用了。


此时我们要使用zkCli.sh去连接ZK服务。虽然zk3还没有启动,但是服务现在已经可以使用的,所以我们可以去连接,在zk3没有启动的情况下,去连接ZK服务,可以帮助我们更好的了解zookeeper的一些特点。

${ZOOKEEPER_HOME}/bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183

启动zkCli时,控制台打印出类似以下内容:

Socket connection established, initiating session, client: /127.0.0.1:42939, server: localhost/127.0.0.1:2182

说明当前连接的是zk2,如果停止zkCli,再启动zkCli,重复几次这样的操作。我们会看到客户端连接连接的端口号在zk1(2181)和zk2(2182)之间切换,如果连接了zk3(2183),就会提示连接失败信息,并自动尝试去连接其他的server。