zookeeper笔记总结
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
主要角色

有以下几个特点
- 一致:同一时刻各个集群节点的数据保持一致。
- 有头:集群中有个Leader老大,所有的写功能都是他处理,保持了数据的一致。
- 数据树:数据结构为树状数据结构。
Leader选举流程图
[图片上传失败...(image-346a42-1538289008447)]
主要运用的原理
数据节点
[图片上传失败...(image-cf4635-1538289008447)]
- 永久节点,和临时节点
永久节点在创建后永久有效,临时节点在客户端连接时有效,断开后就失效。 - 顺序节点,
自动在节点后添加顺序
监听机制:watch
监听流程图
[图片上传失败...(image-aa72b8-1538289008447)]
watch机制官方说明:一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。
可以注册watcher的方法:getData、exists、getChildren。
可以触发watcher的方法:create、delete、setData。连接断开的情况下触发的watcher会丢失。
一个Watcher实例是一个回调函数,被回调一次后就被移除了。如果还需要关注数据的变化,需要再次注册watcher。
New ZooKeeper时注册的watcher叫default watcher,它不是一次性的,只对client的连接状态变化作出反应。
操作与watcher的对应关系:

创建一个单服务
下载镜像
docker pull zookeeper
创建一个服务器
docker run --name zk1 -p 0.0.0.0:2181:2181 -d zookeeper
进入服务器
docker exec -i -t zk1 /bin/bash
启动服务
./bin/zkServer.sh start
创建一个客户端
docker run --name client -p 0.0.0.0:2181:2182 -d zookeeper
进入客户端
docker exec -i -t client /bin/bash
执行
./bin/zkCli.sh
回车(这时候还必须回车)
这时,单服务就创建好了
创建一个集群zookeeper
1.和创建单服务的方式一样每个服务器上创建一个服务
2.更改容器中的配置文件 /conf/zoo.cfg
在配置中添加 server.x 的配置
3.在每个dataLogDir配置的文件夹中运行
# 将序号写进myid中
echo "1" >myid
***注:zookeeper语法***
客户端语法
1. 查询
列出指定节点
ls path [watch] //查看path下包含的节点
是ls的升级版,列出子节点的同时列出节点的状态信息
ls2 path //查看当前节点数据并能看到更新次数等数据
列出指定节点的状态信息,或者说是元数据信息
stat path [watch]
例:
[zk: h1:2181(CONNECTED) 11] stat /
# 节点被创建时的事务ID
cZxid = 0x0
# 节点创建时间
ctime = Thu Jan 01 08:00:00 CST 1970
# 最近一次更新时的事务ID
mZxid = 0x0
# 最近一次更新时间
mtime = Thu Jan 01 08:00:00 CST 1970
# 该节点的子节点列表最近一次被修改的事务ID
# 添加、删除子节点会影响该值
pZxid = 0x0
# 子节点版本号
cversion = -1
# 数据版本号
dataVersion = 0
# ACL版本号
aclVersion = 0
# 创建临时节点的事务ID
# 如果是持久节点,则该值为0x0
ephemeralOwner = 0x0
# 当前节点的数据长度
dataLength = 0
# 当前节点的子节点数目
numChildren = 1
列出指定节点的数据
get path [watch]
2. 创建节点:
create [-s] [-e] path data acl
s:可选,表示该节点为顺序节点
e:可选,表示该节点为临时节点(不写为永久节点)
path:节点路径
data:节点数据
acl:访问控制列表
3. 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置
修改节点数据
set path data [version]
path : 节点路径
data : 新数据
version : 版本号,要么不写,要么和上一次查询出的版本号一致
对节点增加限制(配额)
setquota -n|-b val path
n:表示子节点的最大个数
b:表示数据值的最大长度
val:子节点最大个数或数据值的最大长度
path:节点路径
列出指定节点的quota
listquota path
删除quota
delquota [-n|-b] path
4. 删除节点:
只能删除不含子节点的节点
delete path [version]
path :要删除的节点的路径
version : 版本号,要么不写,要么和上一次查询出的版本号一致
5. 退出客户端:
quit
6. 帮助命令:
help
服务端语法
1. echo stat | nc 127.0.0.1 2181 来查看哪个节点被选择作为follower或者leader
2. echo ruok | nc 127.0.0.1 2181 测试是否启动了该Server,若回复imok表示已经启动。
3. echo dump | nc 127.0.0.1 2181 列出未经处理的会话和临时节点。
4. echo kill | nc 127.0.0.1 2181 关掉server
5. echo conf | nc 127.0.0.1 2181 输出相关服务配置的详细信息。
6. echo cons | nc 127.0.0.1 2181 列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。
7. echo envi | nc 127.0.0.1 2181 输出关于服务环境的详细信息(区别于 conf 命令)。
8. echo reqs | nc 127.0.0.1 2181 列出未经处理的请求。
9. echo wchs | nc 127.0.0.1 2181 列出服务器 watch 的详细信息。
10. echo wchc | nc 127.0.0.1 2181 通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。
11. echo wchp | nc 127.0.0.1 2181 通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。
***注:zookeeper配置***
# 数据目录
dataDir=/data
# log目录
dataLogDir=/datalog
# zookeeper中使用的基本时间单位, 毫秒值
tickTime=2000
# Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许F在 initLimit 时间内完成这个工作
initLimit=5
# 在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那里收到响应,那么就认为这个F已经不在线了。
syncLimit=2
# 单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制。
maxClientCnxns=60
# server.x中的“x”表示ZooKeeper Server进程的标识
server.1=172.17.0.4:2888:3888
server.2=172.17.0.5:2888:3888
server.3=172.17.0.6:2888:3888
网友评论