用了很久的ZooKeeper了,稍微做个总结。ZooKeeper(以下简称ZK)是一个分布式组件,基于类似Paxos的ZAB一致性算法来实现。ZK保存的数据结构类似于一般的文件系统,只不过在ZK中文件夹也可以拥有数据,整体文件结构为一棵树型。

安装ZooKeeper

官网下载压缩包,随后使用rsync同步到三台机器上,我使用如下三台机器

172.19.65.196
172.19.72.108
172.19.72.112

解压压缩包,使用cp conf/zoo_sample.cfg conf/zoo.cfg得到配置文件,在三台机器的conf/zoo.cfg中添加如下配置

dataDir=/home/zookeeper/apache-zookeeper-3.8.0-bin/data

server.1=172.19.65.196:2888:3888
server.2=172.19.72.108:2888:3888
server.3=172.19.72.112:2888:3888

然后在三台机器的dataDir目录下创建myid文件

vi /home/zookeeper/apache-zookeeper-3.8.0-bin/data/myid

三台机器的myid文件中对应修改的内容如下

机器 内容
172.19.65.196 1
172.19.72.108 2
172.19.72.112 3

启动ZK集群

修改完毕之后使用命令依次启动三台机器上的ZK

./bin/zkServer.sh start

使用命令zkServer.sh status可以查看三台机器的状态

[zookeeper@lin-65-196 apache-zookeeper-3.8.0-bin]$ ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

[zookeeper@lin-72-108 apache-zookeeper-3.8.0-bin]$ ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

[zookeeper@lin-72-112-auto-5 apache-zookeeper-3.8.0-bin]$ ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

可以发现108节点是当前的leader,我们使用zkServer.sh stop停止108节点上面的ZK进程,再看状态可以发现112节点成为了的新的leader了。

使用ZooKeeper

在其它的机器上使用客户端zkCli连接ZK集群

~ zkCli -server 172.19.65.196:2181,172.19.72.108:2181,172.19.72.112:2181
Connecting to 172.19.65.196:2181,172.19.72.108:2181,172.19.72.112:2181
Welcome to ZooKeeper!
JLine support is enabled

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: 172.19.65.196:2181,172.19.72.108:2181,172.19.72.112:2181(CONNECTED) 0]

成功连接zk集群,之后我们可以进行创建、删除、查询等等操作

ls /
create /Nanjing
create /Nanjing/Yuhuatai
ls /Nanjing/Yuhuatai
create /Nanjing/Yuhuatai/Ruanjiangu "Software"
get /Nanjing/Yuhuatai/Ruanjiangu
delete /Nanjing/Yuhuatai/Ruanjiangu
stat /Nanjing/Yuhuatai
quit

ZK支持创建临时数据

临时数据在客户端的连接断开之后会自动删除

create -e /Nanjing/Yuhuatai/Ruanjiangu "tmp"
get /Nanjing/Yuhuatai/Ruanjiangu # 此时是有值的

断开客户端连接,再重新连接zkServer

get /Nanjing/Yuhuatai/Ruanjiangu

此时执行上面的语句就获取不到值了

对节点添加监听器

通过addWatch /Nanjing/Yuhuatai添加对节点的监听器,之后打开一个新的zkCli执行命令create /Nanjing/Yuhuatai/Ruanjiangu。此时监听器会收到通知,详情如下

[zk] addWatch /Nanjing/Yuhuatai
[zk]
WATCHER::

WatchedEvent state:SyncConnected type:NodeCreated path:/Nanjing/Yuhuatai/Ruanjiangu

参考

zkMulitServerSetup