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

安装ZooKeeper

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

172.19.65.196172.19.72.108172.19.72.112

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

dataDir=/home/zookeeper/apache-zookeeper-3.8.0-bin/dataserver.1=172.19.65.196:2888:3888server.2=172.19.72.108:2888:3888server.3=172.19.72.112:2888:3888

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

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

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

机器内容
172.19.65.1961
172.19.72.1082
172.19.72.1123

启动ZK集群

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

./bin/zkServer.sh start

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

[zookeeper@lin-65-196 apache-zookeeper-3.8.0-bin]$ ./bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /home/zookeeper/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgClient port found: 2181. Client address: localhost. Client SSL: false.Mode: follower[zookeeper@lin-72-108 apache-zookeeper-3.8.0-bin]$ ./bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /home/zookeeper/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgClient 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 statusZooKeeper JMX enabled by defaultUsing config: /home/zookeeper/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgClient 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:2181Connecting to 172.19.65.196:2181,172.19.72.108:2181,172.19.72.112:2181Welcome to ZooKeeper!JLine support is enabledWATCHER::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 /Nanjingcreate /Nanjing/Yuhuatails /Nanjing/Yuhuataicreate /Nanjing/Yuhuatai/Ruanjiangu "Software"get /Nanjing/Yuhuatai/Ruanjiangudelete /Nanjing/Yuhuatai/Ruanjiangustat /Nanjing/Yuhuataiquit

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