zk的用途
分布式应用程序可以基于Zookeeper实现例如配置管理、数据发布/订阅、负载均衡、命名服务、协调通知、集群管理、Master选举、分布式锁、分布式队列等功能
数据节点
Zookeeper存储数据是以树形结构存储的,类似linux的目录,最上层是“/”也就是根节点,可以在根节点上创建子节点,在子节点上再创建子节点。在Zookeeper中每个节点被称为一个Znode,每个Znode包含:节点名称、节点值、值的长度、节点创建时间、节点修改时间、版本号、子节点数量等属性,可以创建节点,修改节点,删除节点等操作。
Watcher
ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。
ACL
ZooKeeper 采用 ACL(AccessControlLists)策略来进行权限控制,类似于 UNIX 文件系统的权限控制。
ZooKeeper 定义了 5 种权限,如下:
create 创建子节点的权限
delete 删除子节点的权限
read 读取节点数据和子节点列表的权限
write 更新节点数据的权限
admin 设置节点ACL的权限
版本
Zookeeper的每个ZNode上都会存储数据,对于每个ZNode,Zookeeper都会为其维护一个叫作 Stat 的数据结构。
其中包含三个版本数据
1、version(当前 ZNode 的版本)
2、cversion(当前 ZNode 子节点的版本)
3、aversion(当前 ZNode 的 ACL 版本)
顺序访问
对于来自客户端的每个更新请求,ZooKeeper 都会分配一个全局唯一的递增编号。
这个编号反应了所有事务操作的先后顺序,应用程序可以使用 ZooKeeper 这个特性来实现更高层次的同步原语。这个编号也叫做时间戳—zxid(ZooKeeper Transaction Id)。
zookeeper特点
1、顺序一致性:从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去。
2、原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某一个事务,要么都没有应用。
3、单一系统映像:无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的。
4、可靠性:一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。
5、ZooKeeper 数据保存在内存中,这意味着 ZooKeeper 可以实现高吞吐量和低延迟。
6、集群间通过 Zab 协议(Zookeeper Atomic Broadcast)来保持数据的一致性。
安装配置
单机版
1、下载zk,解压即可,不需要安装,地址如下
(https://zookeeper.apache.org/)
2、进入conf目录,将zoo_sample.conf拷贝一份,改名为zoo.conf即可
3、进入bin目录,执行./zkServer.sh start,此时已成功启动
伪集群
1、下载zk,解压即可,不需要安装,地址如下
(https://zookeeper.apache.org/)
2、进入conf目录,将zoo_sample.conf复制三份,分别命名为zoo1.conf,zoo2.conf,zoo3.conf
并修改其中的dataDir、dataLogDir、clientport,并添加server.1,server.2,server.3
每个dataDir下新建文件《myid》,内容分别为1,2,3
注意:新建三份dataDir和三份dataLogDir
clientport建议为2181,2182,2183
server.1,server.2,server.3为相同内容
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
3、进入bin目录,执行./zkServer.sh start -server ip:port,即可启动(./zkServer.sh start ../conf/zoo1.cfg)
注:./zkServer.sh stop -server ../conf/zoo1.cfg停止服务,./zkServer.sh status -server ../conf/zoo1.cfg 查看服务状态
连接zkServer
进入bin目录,执行./zkCli.sh -server ip:port即可
常用命令
1、ls 查看znode节点
eg:ls /
ls /zookeeper
2、create 创建znode节点,节点后面必须赋值,否则不会创建成功
eg:create /test abc
create /test/ant def 此为创建子节点,此时/test的version会加1
3、get 获取节点值
eg:get /test
get /test/ant
4、set 修改节点值
eg: set /test abcd
set /test/ant defg
5、delete 删除节点
eg:delete /test 如果有子节点,父节点不能删除,需要先删除子节点再删除父节点
delete /test/ant
6、quit 退出客户端操作界面
7、停掉Zookeeper服务
数据同步
ZooKeeper 集群角色
在 ZooKeeper 中没有选择传统的 Master/Slave 概念,而是引入了Leader、Follower 和 Observer 三种角色。
1、leader可处理读、写
2、follower可处理读和选举,如果遇到写请求,则交由leader处理
3、observer可处理读请求,如果遇到写请求,则交由leader处理
leader处理写请求
1、leader自己写入,但不提交
2、leader通知所有节点写入,但不提交
3、leader收到半数以上节点的回复(已写入)
4、leader自己提交,且通知所有节点提交
5、向client返回结果
zk选举
关键数据
1、轮次
当前第几轮选举,用于判断选举时是否同一轮
2、事务id
当前节点所处理过的最大的事务id(zxid)
3、节点id
当前节点的id(myid)
比较的规则
1、同一投票轮次下,谁的zxid大,就推举谁为leader,如果zxid相等,则谁的myid大,推举谁为leader
2、不同投票轮次下,若自己轮次大,则忽略其他轮次
3、不同投票轮次下,若自己轮次小,则更新自己的轮次,然后比较zxid,和myid
选出leader的条件
如果已经有过半机器接受到相同的投票信息,则leader已经选出
选举步骤
1、第一次投票时,每个节点,都推荐自己为leader,并把此推荐信息,发送给所有的节点
然后统计投票结果,若选出leader则结束(执行3),若没有选出leader则比较选票,投票轮次加1,继续投票(执行2)
2、每个节点把比较后的结果作为要推荐的leader,并把此推荐信息,发送给所有的节点
然后统计投票结果,若选出leader则结束(执行3),若没有选出leader则比较选票,投票轮次加1,继续投票(执行2)
3、选举结束,每个节点更新自己的状态为leader或follower或observer,follower和observer将自己的zxid发送给leader
,leader根据zxid计算出需要同步的信息,返回给follower和observer,follower和observer处理需要同步的数据