① 下载 zookeeeper
的压缩包,我们在此处使用版本为 3.4.6
zookeeper官网
② 准备三台服务器
服务器需要配置域名映射
node1 / 172.17.0.8 | node2 / 172.17.30.12 | node3 / 172.17.30.26 |
---|
③ 将安装包上传到 3 台服务器,并解压安装包到指定的目录
# 进入到自定义的目录
cd /opt/software
# 解压安装包
tar -zxvf zookeeper-3.4.6.tar.gz
① 3 台服务器的 zookeeeper 的这些操作是相同的,只有修改 zoo.cfg
中的配置信息是不同的
# 1. 进入zookeeeper配置文件目录
cd /opt/software/zookeeper-3.4.6/conf/
# 2. 复制并创建新的配置文件
cp zoo_sample.cfg zoo.cfg
# 3.创建数据存放目录
mkdir -p /opt/software/zookeeper-3.4.6/zkdatas/
② 修改 3 台服务器的 zookeeeper
配置信息
# 3 台服务器相同的操作
cd /opt/software/zookeeper-3.4.6/conf/
vim zoo.cfg
# 修改和增加以下内容
# Zookeeper的数据存放目录,修改数据目录
dataDir=/opt/software/zookeeper-3.4.6/zkdatas/
# 保留多少个快照,本来就有这个配置, 只不过注释了, 取消注释即可
autopurge.snapRetainCount=3
# 日志多少小时清理一次,本来就有这个配置, 只不过注释了, 取消注释即可
autopurge.purgeInterval=1
# 集群中服务器地址,集群间通讯的端口号,文件末尾直接增加
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
③ 配置 myid
文件
说明:该 myid
文件中的值用于和 zoo.cfg
配置文件中的配置项 server.x=nodex:2888:3888
进行对应,用于标识当前节点的 zookeeper
,在 zookeeper
集群启动的时候,完成 leader
的选举
# 1. 在第 1 台服务器上操作
echo 1 > /opt/software/zookeeper-3.4.6/zkdatas/myid
# 2. 在第 2 台服务器上操作
echo 2 > /opt/software/zookeeper-3.4.6/zkdatas/myid
# 3. 在第 3 台服务器上操作
echo 3 > /opt/software/zookeeper-3.4.6/zkdatas/myid
① 从第 1 台服务器开始,依次执行如下命令
# 启动
cd /opt/software/zookeeper-3.4.6
bin/zkServer.sh start
② 启动状态和日志查看
# 查看启动状态
cd /opt/software/zookeeper-3.4.6
bin/zkServer.sh status
# 查看启动日志
cd /opt/software/zookeeper-3.4.6/
cat zookeeper.out
# 查看进程
jps
① 启动客户端
# 进入 zookeeper 的 bin 目录下
cd /opt/software/zookeeper-3.4.6
# 启动客户端
# 命令格式: zkCli.sh -server ip
sh bin/zkCli.sh -server node1
② 查看命令的帮助信息
# 查看命令参数
[zk: localhost:2181(CONNECTED) 0] help # 直接输入 help就行
ZooKeeper -server host:port cmd args
set path data [version] # 设置数据
ls path [watch] # 查看列表(目录结构)
delquota [-n|-b] path
ls2 path [watch] # 查看列表(目录结构) 和 详情
setquota -n|-b val path
history
redo cmdno
delete path [version] # 删除路径
listquota path
rmr path
get path [watch] # 查看某一个节点数据以及和节点的说明信息
create [-s] [-e] path data acl
① 退出当前会话
quit
② 创建节点
# 格式: create [-s][-e] path data acl
#1. -s 一旦添加了此选项, 表示要创建一个序列化节点
#2. -e 一旦添加了此选项, 表示要创建一个临时节点
#3. acl 用来进行权限控制
# 创建永久节点
create /aaa 123456
create /aaa/bbb 123456
# 创建临时节点
create -e /ccc 789
create -e /ccc/ddd 123456 # 报错, 临时节点不能有子节点
# 创建永久序列化节点
create -s /eee 789
# 创建临时序列化节点
create -s -e /fff 12345
③ 显示节点信息
# 说明
ls # 主要是查看目录结构的
get # 查看节点下的内容
# 查看根节点下边有什么.
ls /
# 查看aaa下有什么
ls /aaa
# 查看根目录详情, 在ls的基础看到当前这个节点详细说明信息
ls2 /
# 查看 /aaa目录详情, 在ls的基础看到当前这个节点详细说明信息
ls2 /aaa
# 查看它里边的内容
get /aaa
④ 更新节点信息
# 查看节点里边的内容
get /aaa
# 设置节点中的内容
set /aaa 789
⑤ 删除节点信息
# 查看根目录下有什么
ls /
# 删除eee0000000006这个节点
delete /eee0000000006
# 查看根目录下有什么, 是否删除成功
ls /
# 因为/aaa下边有 bbb, 所以删不掉. 如果没有字节点, 则可以直接删除
delete /aaa
# 这个可以直接把/aaa给删除
rmr /aaa
# 查看根目录下有什么, 是否删除成功
ls /
⑥ 节点权限控制
# 创建节点
create /aaa 123456
# 查看该节点的权限
listquota /aaa
# 设置aaa的子节点个数不超过3个
setquota -n 3 /aaa
# 此时能看到上述的配置, 但是我们发现目前的节点数是1, 因为 /aaa也算一个节点
listquota /aaa
# 新建子节点
create /aaa/bbb 123
create /aaa/ccc 123
# 因为上述 设置aaa的子节点个数不超过3个, 理论上这里不能成功, 但是我们发现还是成功了,是因为quota的权限没有那么严格, 依然可以正常添加的, 只不过会在日志文件中打印一条警告信息.
create /aaa/ddd 123
# 创建新节点, 指定内容, 用来测试 设置长度后, 能不能超出最大长度
create /ddd 123
# 设置长度
quota -b 10 /ddd
# 查看权限信息
listquota /ddd
# 设置内容
set /ddd 1234567891011
# 注意1: zookeeper中各个数据节点没有任何的限制条件的, 可以存数据, 长度没有限制(系统固定为1M), 子节点数量也没有限制
# 注意2: 如果设置权限规定某一个节点的数量或者长度, 其实当创建节点大于这个数量的时候或者长度大于设置长度, 依然可以正常添加的, 只不过会在日志文件中打印一条警告信息记录一下警告信息
⑦ 其他命令
# 列出命令历史
history
# 该命令可以重新执行指定命令编号的历史命令,命令编号可以通过
redo
watch 机制执行过程
① 客户端向服务端注册Watcher
② 服务端事件发生触发Watcher
③ 客户端回调Watcher得到触发事件情况
watch机制的使用场景
① 从节点 想知道 主节点 什么时候宕机
② 主节点 想知道 从节点 什么时候就启动
watch机制的特点
① 一次性触发
如果客户端绑定一个监听操作, 只会监听到一次对应事件, 后续在发送就无法监听到, 如果想监听, 重新绑定
② 事件封装
zookeeper将可能发生的事件使用一个对象 WatchedEvent来表示
③ event异步发送
后台发送信息, 不占用主线程
④ 先注册再触发
如果要监听某一个事件, 必须先对这个事件做监听, 然后才会触发对应事件
通知状态和事件类型
同一个事件类型在不同的通知状态中代表的含义有所不同,下表列举了常见的通知状态和事件类型
事件封装: Watcher 得到的事件是被封装过的, 包括三个内容 keeperState, eventType, path
KeeperState | EventType | 触发条件 | 说明 |
---|---|---|---|
None | 连接成功 | ||
SyncConnected | NodeCreated | Znode被创建 | 此时处于连接状态 |
SyncConnected | NodeDeleted | Znode被删除 | 此时处于连接状态 |
SyncConnected | NodeDataChanged | Znode数据被改变 | 此时处于连接状态 |
SyncConnected | NodeChildChanged | Znode的子Znode数据被改变 | 此时处于连接状态 |
Disconnected | None | 客户端和服务端断开连接 | 此时客户端和服务器处于断开连接状态 |
Expired | None | 会话超时 | 会收到一个SessionExpiredExceptio |
AuthFailed | None | 权限验证失败 | 会收到一个AuthFailedException |
watch机制操作演示
登陆zookeeper的客户端之后, 可以通过help命令查看zookeeper的命令, 发现后边有watch的, 表示支持watch监听机制
① 绑定监听:需要对那个路径进行监听, 需要监听什么内容
# 在第 1 个 zookeeper 节点上开启新的客户端后执行以下命令
# 创建节点
create /dddd 123
# 在第 1 个节点中开启对 /ddd 路径的监听
get /dddd watch
② 测试监听
# 在新的 zookeeper 节点上开启新的客户端后执行以下命令
# 对 /dddd 路径内容进行修改
set /dddd 123456789
③ 查看监听内容
# 在第 1 个 zookeeper 节点上显示出以下信息
[zk: localhost:2181(CONNECTED) 5]
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/dddd