zookeeper特性
zookeeper下载
1 | https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.12/ |
搭建zookeeper集群
zookeeper配置文件说明
简要步骤
创建文件夹,检查jdk版本,上传zookeeper安装包
[root@node-1 ~]# mkdir -p /export/server
[root@node-1 /]# mkdir -p /export/data/zkdata
检测集群时间是否同步:
data
关闭防火墙,centos7下关闭防火墙:
[root@node-1 ~]# firewall-cmd --zone=public --add-port=2181/tcp --permanent
[root@node-1 ~]# firewall-cmd --zone=public --add-port=2888/tcp --permanent
[root@node-1 ~]# firewall-cmd --zone=public --add-port=3888/tcp --permanent
[root@node-1 ~]# firewall-cmd --complete-reload
检测主机ip映射有没有配置
解压安装包: tar -zxvf zookeeper-3.4.12.tar.gz
修改zookeeper配置文件:
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
添加内容:
dataDir=/tmp/zookeeper -> 数据存储位置,修改为 dataDir=/export/data/zkdata
server.1=192.168.17.130:2888:3888 (心跳端口,选举端口)
server.2=192.168.17.131:2888:3888
server.3=192.168.17.132:2888:3888
在data文件夹下新建myid文件
[root@node-1 home]# cd /export/data/zkdata/
[root@node-1 zkdata]# echo 1 > myid
其他机器创建文件夹
mkdir -p /export/server
mkdir -p /export/data/zkdata
设置ssh免密码登录,分发安装包到其他机器
scp -r /export/server/zookeeper root@192.168.17.131:/export/server
在其他机器的data文件夹下新建myid文件
[root@node-2 home]# cd /export/data/zkdata/
[root@node-2 zkdata]# echo 2 > myid
[root@node-3 home]# cd /export/data/zkdata/
[root@node-3 zkdata]# echo 3 > myid
实例
node-1节点
1 | [root@node-1 ~]# mkdir -p /export/server |
node-2节点
1 | [root@node-2 ~]# mkdir -p /export/server |
node-3节点
1 | [root@node-3 ~]# mkdir -p /export/server |
启动zookeeper(没有配置zookeeper的环境变量,可以用全路径启动)
node1节点启动及其状态
1 | [root@node-1 ~]# /export/server/zookeeper/bin/zkServer.sh start |
node2节点启动及其状态
1 | [root@node-2 ~]# /export/server/zookeeper/bin/zkServer.sh start |
node3节点启动及其状态
1 | [root@node-3 ~]# /export/server/zookeeper/bin/zkServer.sh start |
zookeeper可能启动不成功的情况
启动不成功出现的异常
1 | [root@node-3 ~]# /export/server/zookeeper/bin/zkServer.sh status |
zookeeper启动不成功可能的原因
1.防火墙没有关闭,三个端口(2181, 2888, 3888).
2.集群中个myid没有设置,必须在zoo.cfg中指定的 dataDir=/export/data/zkdata 目录下,创建myid.
3.删除 /export/data/zkdata 文件,重新创建myid文件,然后再启动zookeeper.
实例及解决办法
1 | [root@node-3 ~]# /export/server/zookeeper/bin/zkServer.sh start |
zookeeper客户端连接
客户端连接
运行zkCli.sh -server ip 进入命令行工具,
如果 ./zkCli.sh,则直接连接到本机的zookeeper服务端.
如果 ./zkCli.sh -server 192.168.17.131,则直接连接到本机的zookeeper服务端.
[root@node-3 bin]# ./zkCli.sh
[root@node-2 bin]# ./zkCli.sh -server 192.168.17.132
1 | [root@node-3 bin]# ll |
创建节点
1 | create [-s] [-e] path data acl |
1 | WatchedEvent state:SyncConnected type:None path:null |
读取节点
1 | ls path [watch] |
1 | [zk: 192.168.17.132(CONNECTED) 19] get / |
更新节点
1 | set path data [version] |
1 | [zk: 192.168.17.132(CONNECTED) 29] get /hellozk |
删除节点
1 | dalete path [version] |
1 | [zk: 192.168.17.132(CONNECTED) 31] delete /hellozk |
ZooKeeper Watcher
ZooKeeper 提供了分布式数据的发布/订阅功能。一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某一个主题对象,当这个主题自身状态变化时,会通知所有订阅者,试它们能够做出相应的处理。
在 ZooKeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能。ZooKeeper 允许客户端向服务端注册一个 Watcher 监听,当服务器的一些特定事件触发了这个 Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。
总的来说watcher包括以下三个过程:客户端向
Watcher工作机制
ZooKeeper的Watcher机制,总的来说可以分为三个过程:客户端向服务端注册 Watcher、服务器处理Watcher、客户端回调Watcher得到触发时间的情况。
shell客户端设置watcher
设置节点数据变动监听: get /a watch
1 | [zk: 192.168.17.132(CONNECTED) 37] ls / |
通过另一个客户端更改节点数据: set /a hello12222
1 | [zk: localhost:2181(CONNECTED) 4] set /w abcdefg123456 |
设置监听的节点会受到通知
注意:watch监听是一次性触发的,一旦生效后,下次有同样的事件发生,这里也得不到通知;
如果想要再次得到监听,需要再次进行注册.
1 | [zk: 192.168.17.132(CONNECTED) 40] |