zookeeper 集群搭建及Shell操作
一、搭建准备
① 下载 zookeeeper
的压缩包,我们在此处使用版本为 3.4.6
② 准备三台服务器
服务器需要配置域名映射
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
五 、常用的 shell 操作命令
① 退出当前会话
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
六、zookeeper的watch机制
-
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