最近在学习zookeeper,发现zk真的是一个优秀的中间件。在分布式环境下,可以高效解决数据管理问题。在学习的过程中,要深入zk的工作原理,并根据其特性做一些简单的分布式环境下数据管理工具。本文首先对zk的工作原理和相关概念做一下介绍,然后带大家做一个简单的分布式配置中心。
zookeeper介绍zookeeper是一个分布式协调框架,主要是解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理、分布式锁等。
zookeeper使用 查看节点# ls /path
创建节点#create /path data
修改节点#set /path data
删除节点#delete /path
获取节点数据#get /path
zookeeper C/S连接状态1)KeeperState.Expired:客户端和服务器在ticktime的时间周期内,是要发送心跳通知的。这是租约协议的一个实现。客户端发送request,告诉服务器其上一个租约时间,服务器收到这个请求后,告诉客户端其下一个租约时间是哪个时间点。当客户端时间戳达到最后一个租约时间,而没有收到服务器发来的任何新租约时间,即认为自己下线(此后客户端会废弃这次连接,并试图重新建立连接)。这个过期状态就是Expired状态
2)KeeperState.Disconnected:就像上面那个状态所述,当客户端断开一个连接(可能是租约期满,也可能是客户端主动断开)这是客户端和服务器的连接就是Disconnected状态
3)KeeperState.SyncConnected:一旦客户端和服务器的某一个节点建立连接(注意,虽然集群有多个节点,但是客户端一次连接到一个节点就行了),并完成一次version、zxid的同步,这时的客户端和服务器的连接状态就是SyncConnected
4)KeeperState.AuthFailed:ookeeper客户端进行连接认证失败时,发生该状态
zookeeper工作原理文件系统 + 监听机制
文件系统特点同一个目录下文件名称不能重复,同样zookeeper也是这样的,zookeeper中统一叫作znode。znode节点可以包含子znode,也可以同时包含数据。znode只适合存储非常小的数据,不能超过1M,最好都小于1K。
znode节点类型临时节点(EPHEMERAL):客户端关闭zk连接后清除
永久节点(persistent):持久化节点,除非客户端主动删除
有编号节点(Persistent_sequential):自动增加顺序编号的znode持久化节点
临时有编号(Ephemral_ sequential):临时自动编号设置,znode节点编号会自动增加,但是会客户端连接断开而消失。分布式锁用的是这个类型的节点。
注:EPHEMERAL 临时类型的节点不能有子节点,对于zk来说,有几个节点数据就会存储几份。
监听机制客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节 点增加删除)时,zookeeper会通知客户端。
1、客户端启动时向zookeeper服务器注册信息
2、客户端启动同时注册一系列的Watcher类型的监听器到本地的WatchManager中
3、zookeeper服务器中节点发生变化后,触发watcher事件后通知给客户端,客户端线程从WatcherManager中取出对应的Watcher对象来执行回调逻辑。
zookeeper监听的事件类型EventType.NodeCreated:当znode节点被创建时,该事件被触发。
EventType.NodeChildrenChanged:当znode节点的直接子节点被创建、被删除、子节点数据发生变更时,该事件被触发。
EventType.NodeDataChanged:当znode节点的数据发生变更时,该事件被触发。
EventType.NodeDeleted:当znode节点被删除时,该事件被触发。
EventType.None:当zookeeper客户端的连接状态发生变更时,即KeeperState.Expired、KeeperState.Disconnected、KeeperState.SyncConnected、KeeperState.AuthFailed状态切换时,描述的事件类型为EventType.None。
zookeeper下server工作状态LOOKING:当前server不知道leader是谁,正在选举
LEADING:当前server即为选举出来的leader
FOLLOWING:leader已经选举出来,当前server是follower
ZAB协议 ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。
ZAB 协议作用:解决分布式数据管理一致性。
ZAB 协议定义:ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复 和 消息广播 协议。
基于该协议,Zookeeper 实现了一种 主备模式 的系统架构来保持集群中各个副本之间数据一致性。