https://zhuanlan.zhihu.com/p/24996631
https://www.cnblogs.com/raphael5200/p/5285583.html
zk=注册监听通知+文件系统
注册监听通知
客户端注册监听它关心的目录节点,当目录节点发生变化,如数据改变,被删除,子目录节点增加删除时,zk会通知客户端。这时客户端就可以根据传过来的信息采取一系列的操作。
文件系统
zk维护一个如下图的文件结构
1、每个子目录项如NameService都被称为znode,有四种类型:
-
persistent:客户端与zk断开后,该节点依旧存在
-
persistent-sequential:客户端与zk断开后,该节点依旧存在,只是zk给该节点名称进行顺序编号。
-
ephemeral:临时节点,客户端与zk断开连接后,该节点被删除。
-
ephemera-sequential:临时编号节点,客户端与zk断开后,该节点被删除,只是zk给该节点名称进行顺序编号。
2、znode可以有子节点目录(临时节点除外),并且每个znode可以存储数据,zk的客户端和服务器通信采用的是长连接,每个客户端和服务器通过心跳来保持连接,这个连接状态称为session,如果znode是临时节点,这个session失效时,znode被删除,实现了通知机制。
用zk做什么
-
统一命名服务:zk帮助我们给文件起名,文件名称不会重复,易于记忆和识别。
-
配置管理:改变一台机器的配置,其他机器也会跟着改变。
-
集群管理:监听是否有机器退出或加入,动态选举master。
-
队列管理
-
实现分布式锁
zk集群中的角色
主要由leader和follower组成,observer的加入只是为了支持更多的client,如果扩充follower来支持更多的client,会使得投票延迟增大,所以observer不参与投票。observer接受client请求,并将请求转发给leader。
zk的设计目的
-
最终一致性:client无论连接到哪个server,展示给它的都是同一个视图,也就是说每台server上存储的数据是相同的。这是zk最重要的特性。
-
可靠性:如果消息m被一台服务器所接受,那么它将被所以服务器所接受。
-
更新请求顺序进行,来自同一个client的更新请求按发送顺序依次执行。
-
原子性:一次数据更新要么成功要么失败,没有中间状态。
-
实时性:在一定事件范围内,client能读到最新数据。
zk节点数据操作流程
-
在client想follow发出一个写的请求。
-
follower把请求发送给leader,如果请求发送给observer,observer也会把请求发送给leader。
-
leader接收到请求后开始发起投票,并通知follower进行投票。
-
follower把投票结果发送给leader
-
leader将结果汇总后如果需要写入,则开始写入同时把写入操作通知给follower,然后commit。
-
follower将请求结果返回给client。