这个是着重要了解的,关系这我们架构设计和技术选型的依据


zookeeper数据模型Znode-数据节点

概念:数据信息都被保存在一个个数据节点Znode上,Znode是zk的最小数据单位,Znode下面还可以放Znode,以此会构成一个层次化的命名空间Znode,平常都称之为Znode Tree

每个节点都是以"/"开头,那么接下来就要了解一下Znode的类型:

Znode的类型:

  • 持久节点:指节点被创建后会一直存在服务器里,除非删除才会消失
  • 持久顺序节点:就是有顺序的持久节点,特性和持久节点一样,只是带有顺序罢了,顺序实现是在创建节点的时候,会在节点名后面加上一个数字后缀,来表示顺序
  • 临时节点:会自动清理掉的节点, 生命周期跟客户端是绑在一起的,客户端会话结束的话,节点也会删除掉,而且临时节点不能创建子节点,这一点和持久节点是不同的,利用这个特性,所以zk也存在分布式锁的用法
  • 临时顺序节点:实现顺序逻辑和持久顺序节点一样,特性和临时节点一样,只是带了顺序

整体来看就是两个类型的Znode:持久节点和临时节点


事务机制

事务的概念这里就不提了,在zk中,事务表示能概念zk服务器状态的操作,所以平常我们也可以说是事务操作或者更新操作,因为改变状态一般是指数据节点的创建、删除、内容更新等操作,而且每一个事务请求,zk都会生成一个全局唯一的事务ID(ZXID),通常是64位的一串数字,每个ZXID都表示一个更新操作


Znode的状态信息

整个Znode节点内容主要包括两个部分:节点数据内容和节点状态信息,图上的[quota]是数据内容,其他的属性也顺带着讲一下:

  • cZxid:Create ZXID,表示节点被创建时的事务ID
  • ctime:Create Time,表示节点创建时间
  • mZxid:Modified ZXID,表示节点最后一次被修改时的事务ID
  • mtime:Modified Time,表示节点最后一次被修改时间
  • pZxid:该节点的子节点列表最后一次被修改时的事务ID,只有子节点列表变更才会更新pZxid,子节点内容变更不会更新
  • cversion:表示子节点的版本点
  • dataVersion:表示内容版本号
  • aclVersion:表示acl版本
  • ephemeralOwner:表示创建该临时节点时的会话sessionID,如果是持久节点,那么值就等于0
  • dataLength:表示数据节点
  • numChildren:表示直系子节点数

Watcher-数据变更通知

zk用这个机制主要是实现分布式数据的发布/订阅功能

大概流程:zk引入Watcher机制来实现这种分布式的通知功能,zk允许客户端向服务端注册一个Watcher监听,当服务端的一些指定事件出发这个Watcher,这个时候会向指定客户端发送一个时间通知来实现分布式的通知功能,结合流程图了解一下:

从图中可以看出,Watcher机制主要包括:客户端线程、客户端WatcherManager、ZooKeeper服务器三部分

具体实现流程:客户端在向zk服务器注册的同时,还会把Watcher对象存储在客户端的WatcherManager中。当zk服务器触发Watcher事件后,会向客户端发送通知,客户端线程从WatchManager中取出对应的Watcher对象来执行回调逻辑

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐