May 02, 2018

zoopkeeper如何部署与容灾原理

本章介绍如何在2个测试服务器上部署zoopkeeper,并实现主从数据同步和容灾。

配置

CentOS Linux release 7.4.1708 (Core)
jdk-7u80-linux-x64
zookeeper-3.4.11.tar.gz

可能用到的zk命令:

                  
zkServer.sh start
zkServer.sh stop
zkServer.sh status
zkCli.sh -server ip:port
create /node nodeName
get /node
setAcl path acl
getAcl path
quit
                  
                

1.上传zookeeper到zookeeper目录并解压,并建立data目录,logs目录

                  
tar zxvf zookeeper-3.4.11.tar.gz
                  
                

2.zoo.cfg基本配置

                  
#数据目录
dataDir=/usr/zookeeper/data
#日志目录
dataLogDir=/usr/zookeeper/logs
#心跳间隔时间,zookeeper中使用的基本时间单位,毫秒值。每隔2秒发送一个心跳
tickTime=2000
#leader与客户端连接超时时间。表示5个心跳间隔
initLimit=5
#Leader与Follower之间的超时时间,表示2个心跳间隔
syncLimit=2
#客户端连接端口。多个实例的端口配置不可重复
clientPort=2181 
#server.NUM=IP:port1:port2  NUM表示本机为第几号服务器,IP为本机ip地址,port1为leader与follower通信端口,port2为参与竞选leader的通信端口
#多个实例的端口配置不能重复,如下:
server.1=111.230.223.233:2888:3888
server.2=111.230.211.90:2888:3888
#server.3=我没有这么多节点所以注释掉:2888:3888
                  
                

3.添加myid文件,myid文件存储一个数值,是ZooKeeper Server进程的标识。即上面配置中的server.后面的数字。

4.集群方式启动

                  
zkServer.sh start
                  
                

5.查看状态

                  
zkServer.sh status
                  
                

原因是配置的机器111.230.211.90没有配置正确,先注释掉再启动,启动成功,状态:Mode: standalone。配置正确启动后是这样的:

                  
[root@VM_0_7_centos bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/zookeeper/zookeeper-3.4.11/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@VM_0_7_centos bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/zookeeper/zookeeper-3.4.11/bin/../conf/zoo.cfg
Mode: follower


[root@VM_0_12_centos bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/zookeeper/zookeeper-3.4.11/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@VM_0_12_centos bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/zookeeper/zookeeper-3.4.11/bin/../conf/zoo.cfg
Mode: leader
                  
                

在111.230.223.233上连接111.230.211.90

                  
zkCli.sh -server 111.230.211.90:2181

//信息如下,连接成功
2018-03-19 11:43:36,614 [myid:] - INFO  [main-SendThread(111.230.211.90:2181):ClientCnxn$SendThread@1035] - Opening socket connection to server 111.230.211.90/111.230.211.90:2181. Will not attempt to authenticate using SASL (unknown error)
Welcome to ZooKeeper!
JLine support is enabled
2018-03-19 11:43:36,656 [myid:] - INFO  [main-SendThread(111.230.211.90:2181):ClientCnxn$SendThread@877] - Socket connection established to 111.230.211.90/111.230.211.90:2181, initiating session
[zk: 111.230.211.90:2181(CONNECTING) 0] 2018-03-19 11:43:36,781 [myid:] - INFO  [main-SendThread(111.230.211.90:2181):ClientCnxn$SendThread@1302] - Session establishment complete on server 111.230.211.90/111.230.211.90:2181, sessionid = 0x2000acd6fea0000, negotiated timeout = 30000
                  
                

然后在111.230.211.90上创建一个叫qyswfx节点,这个节点会以znode的形式存储在111.230.211.90机器上,并同步到其他机器。

                  
[zk: 111.230.211.90:2181(CONNECTED) 2] create /qyswfx qyswfx_node
Created /qyswfx
[zk: 111.230.211.90:2181(CONNECTED) 3] get /qyswfx
qyswfx_node
cZxid = 0x100000002
ctime = Mon Mar 19 14:07:31 CST 2018
mZxid = 0x100000002
mtime = Mon Mar 19 14:07:31 CST 2018
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0
                  
                

在111.230.211.90上连接111.230.223.233,可以查看到节点已经同步

                  
[zk: 111.230.223.233:2181(CONNECTED) 7] get /qyswfx
qyswfx_node
cZxid = 0x100000002
ctime = Mon Mar 19 14:07:31 CST 2018
mZxid = 0x100000002
mtime = Mon Mar 19 14:07:31 CST 2018
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0
                  
                

此时集群配置完成,如果leader节点挂掉,根据算法会有一个follower节点被选举为leader节点。