CentOS 7.5 搭建Zookeeper集群与命令行操作

分布式安装部署

官网首页:https://zookeeper.apache.org/
下载地址:http://mirror.bit.edu.cn/apache/zookeeper/

zookeeper-release

集群规划

在node1,node2和node3三个节点上部署zookeeper,三个节点都已安装jdk。

IP 节点名称 zookeeper
192.168.100.21 spark-node1
192.168.100.22 spark-node2
192.168.100.23 spark-node3

解压安装

  1. 解压zookeeper按转包到/opt/目录下
1
sudo tar -zxvf zookeeper-3.4.12.tar.gz -C /opt/
  1. /opt/ 创建软连接
1
sudo ln -s /opt/zookeeper-3.4.12 /opt/zookeeper
  1. /opt/zookeeper目录下创建data
1
mkdir /opt/zookeeper/data
  1. 覆盖zookeeper的安装配置
1
mv /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg

配置zoo.cfg文件

具体配置,修改dateDir,添加日志存放目录

1
2
dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeper/logs

末尾增加如下配置

1
2
3
server.1=spark-node1:2888:3888
server.2=spark-node2:2888:3888
server.3=spark-node3:2888:3888

集群配置

  1. /opt/zookeeper/data目录下创建一个myid的文件
1
touch myid
  1. 编辑myid文件,在文件中添加与server对应的编号:如 1
1
vim myid
  1. 拷贝配置好的zookeeper到其它机器上
1
2
scp -r zookeeper*/ xxx@spark-node2:/opt/
scp -r zookeeper*/ xxx@spark-node3:/opt/

并修改spark-node2,spark-node3中myid文件中内容为2、3

1
2
echo 2 > myid
echo 3 > myid

启动集群

  1. 分别启动zookeeper
1
2
3
bin/zkServer.sh start
bin/zkServer.sh start
bin/zkServer.sh start
  1. 查看状态
1
2
3
4
5
bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: follwer
...
  1. 停止zookeeper
1
bin/zkServer.sh stop

加入Systemd管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim /usr/lib/systemd/system/zookeeper.service

[Unit]
Description=Zookeeper service
After=syslog.target etwork.target

[Service]
Type=forking
Environment=ZOO_LOG_DIR=/opt/zookeeper/data/logs
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop

[Install]
WantedBy=multi-user.target

配置环境变量

1
2
3
sudo vim /etc/profile
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.12
export PATH=$PATH:$ZOOKEEPER_HOME/bin

zoo.cfg配置参数解读

Server.A=B:C:D。

A是一个数字,表示这个是第几号服务器;

B是这个服务器的ip地址;

C是这个服务器与集群中的Leader服务器交换信息的端口;

D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。

  1. tickTime=2000:通信心跳数

tickTime:通信心跳数,Zookeeper服务器心跳时间,单位毫秒

Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。

它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2 x tickTime)

2)initLimit=10:LF初始通信时限

集群中的follower跟随者服务器(F)与leader领导者服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。

投票选举新leader的初始化时间

Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。

Leader允许F在initLimit时间内完成这个工作。

3)syncLimit=5:LF同步通信时限

集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit x tickTime,

Leader认为Follwer死掉,从服务器列表中删除Follwer。

在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。

如果L发出心跳包在syncLimit之后,还没有从F那收到响应,那么就认为这个F已经不在线了。

4)dataDir:数据文件目录+数据持久化路径

保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据库。

5)clientPort=2181:客户端连接端口

监听客户端连接的端口

客户端命令行操作

  1. 启动客户端
1
zkCli.sh
  1. 显示所有操作命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
  1. 查看当前znode中所包含的内容
1
2
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]
  1. 查看当前节点数据并能看到更新次数等数据
1
2
3
4
5
6
7
8
9
10
11
12
13
[zk: localhost:2181(CONNECTED) 2] ls2 /
[zookeeper]
cZxid = 0x0
ctime = Wed Dec 31 19:00:00 EST 1969
mZxid = 0x0
mtime = Wed Dec 31 19:00:00 EST 1969
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
  1. 创建普通节点
1
2
3
4
[zk: localhost:2181(CONNECTED) 3] create /opt "aa"
Created /opt
[zk: localhost:2181(CONNECTED) 4] create /opt/s "bb"
Created /opt
  1. 获取节点值
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
[zk: localhost:2181(CONNECTED) 5] get /opt
aa
cZxid = 0x4100000004
ctime = Wed Jul 25 07:48:55 EDT 2018
mZxid = 0x4100000004
mtime = Wed Jul 25 07:48:55 EDT 2018
pZxid = 0x4100000005
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 1
[zk: localhost:2181(CONNECTED) 6] get /opt/s
bb
cZxid = 0x4100000005
ctime = Wed Jul 25 07:51:21 EDT 2018
mZxid = 0x4100000005
mtime = Wed Jul 25 07:51:21 EDT 2018
pZxid = 0x4100000005
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0
  1. 创建短暂节点
1
2
[zk: localhost:2181(CONNECTED) 7] create -e /app 8888           
Created /app

在当前客户端是能查看到的

1
2
[zk: localhost:2181(CONNECTED) 8] ls /
[app, opt, zookeeper]

退出当前客户端然后再重启客户端

1
2
[zk: localhost:2181(CONNECTED) 9] quit
[root@spark-node2 zookeepe]$ bin/zkCli.sh

再次查看根目录下短暂节点已经删除

1
2
[zk: localhost:2181(CONNECTED) 0] ls /
[opt, zookeeper]
  1. 创建带序号的节点

先创建一个普通的根节点app

1
2
[zk: localhost:2181(CONNECTED) 1] create /app "app"
create /app "app"

创建带序号的节点

1
2
3
4
5
6
[zk: localhost:2181(CONNECTED) 2] create -s /app/aa 888
Created /app/aa0000000000
[zk: localhost:2181(CONNECTED) 3] create -s /app/bb 888
Created /app/bb0000000001
[zk: localhost:2181(CONNECTED) 4] create -s /app/cc 888
Created /app/cc0000000002

如果原节点下有1个节点,则在排序时从1开始,以此类推。

1
2
[zk: localhost:2181(CONNECTED) 5] create -s /opt/aa 888
Created /opt/aa0000000001
  1. 修改节点数据值
1
2
3
4
5
6
7
8
9
10
11
12
[zk: localhost:2181(CONNECTED) 6] set /opt 999
cZxid = 0x4100000004
ctime = Wed Jul 25 07:48:55 EDT 2018
mZxid = 0x410000000e
mtime = Wed Jul 25 08:14:18 EDT 2018
pZxid = 0x410000000d
cversion = 2
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 2
  1. 节点的值变化监听

在spark-node2主机上注册监听/opt节点数据变化

1
2
zkCli.sh
[zk: localhost:2181(CONNECTED) 0] get /opt watch

在spark-node1主机上修改/opt节点的数据

1
[zk: localhost:2181(CONNECTED) 7] set /opt 777

观察spark-node2主机收到数据变化的监听

1
2
3
4
[zk: localhost:2181(CONNECTED) 1] 
WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/opt
  1. 节点的子节点变化监听(路径变化)

在spark-node2主机上注册监听/opt节点的子节点变化

1
2
[zk: localhost:2181(CONNECTED) 2] ls /opt watch
[aa0000000001, module]

在spark-node2主机/opt节点上创建子节点

1
2
[zk: localhost:2181(CONNECTED) 8] create /opt/bb 666
Created /opt/bb

观察spark-node2主机收到子节点变化的监听

1
2
3
4
[zk: localhost:2181(CONNECTED) 3] 
WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/opt
  1. 删除节点
1
[zk: localhost:2181(CONNECTED) 9] delete /opt/bb
  1. 递归删除节点
1
[zk: localhost:2181(CONNECTED) 10] rmr /opt
  1. 查看节点状态
1
2
3
4
5
6
7
8
9
10
11
12
[zk: localhost:2181(CONNECTED) 14] stat /app
cZxid = 0x4100000009
ctime = Wed Jul 25 08:09:56 EDT 2018
mZxid = 0x4100000009
mtime = Wed Jul 25 08:09:56 EDT 2018
pZxid = 0x410000000c
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 3
  1. 退出客户端
1
[zk: localhost:2181(CONNECTED) 17] quit