Java游戏服务器开发

zookeeper介绍与原理

2020-04-16  本文已影响0人  王广帅

1. zookeeper

zookeeper简称zk,它是一个分布式系统,用来协调分布式服务。它的设计目标之一就是尽量的简单,好用。它的数据存储模型类似于标准的文件系统,是一个树形的结构。它的数据都是存储在内存中的,所以它的读取速度非常快,可以支持大并发的访问,有很高的吞吐量。

因此,它的特点是,高性能,高可用,严格的有序操作。zk本身可以分布式集群部署,而且zk的是全量复制的服务,也就是说集群中所有的服务存储的数据是完全一致的,zk的客户端可以连接到任务一台zk服务,从里面获取数据。

zk service

如果客户端连接成功一个zk服务,就可以向这个服务发送请求,接收数据,如果这个zk服务不可用了,就会连接到其它的服务上面。

2. ZK Node

zk提供的命令方式和标准的文件系统很像,它是以/做为分隔符,比如/app1/p2/data/a。每一个名字在zk中都是唯一的。


zk node

每一个zk node可以包括子node,就像文件系统一样,最后会有一个node做为文件,在这个node上面可以绑定一些数据。zk是被设计用来存储协作性数据的,比如服务状态信息,配置数据,位置信息等,所以这些数据的数据量一般比较小,几byte或必k左右。

每个znode相关的信息都会有一个版本号,包括数据的修改,权限控制(ACL)修改,和修改的时间戳。数据每次被修改时,版本号都会自增。客户端在获取节点的数据,也会时获得版本的信息。

存储在znode上面的数据,读取都是原子性的,每个znode都有一个权限控制列表(ACL),它负责管理谁可以操作这个节点的数据,包括读和写。

znode还有一种类型是临时的node,它在创建的时候被绑定在创建它的session上面,session结束的时候,node也会被删除。

节点变更监听

zk允许客户端对某个节点的数据变更进行监听,当数据发生变化时,客户端会触发一个监听事件,然后移除本次监听。所以如果想继续监听这个节点,需要重新注册监听。如果连接断开,客户端会收到一个本地的通知。

简单的API

简洁的编程接口使用,是zk的目标之一,所以它只提供了以下一些操作命令:

  1. create : 创建一个node
  2. delete : 删除 一个node
  3. exists : 检测是否存在某个node
  4. get data : 从node中获取数据
  5. set data : 更新一个node的数据
  6. get children : 获取某个节点的子节点列表
  7. sync : 等待数据传输成功

实现原理

zk服务集群中,所有的服务中的数据都是一样的。所有的数据都会缓存在每个服务的内存之中。如果收到客户端的更新请求,在更新内存数据之前,会先将数据序列化存储到硬盘之中,然后再更新内存中的数据。

每一个zk server都可以被客户端连接,如果只是读取数据,只需要从连接的zk服务上读取就可以了,如果是修改数据,则需要通过“一致性协议 ”处理。
"一致性协议处理"的一个重要的处理就是,把写请求导到同一台服务上面,这个服务被称为leader。其它的服务叫做followers,如果有数据写入,followers会从leader中接收询问,followers回复同意才可以更新,如果一个leader不可用了,会在followers选择一个leader,然后同步告诉所有的follwers新的leader是谁。

zk使用的是一个自定义的原子数据协议。因为协议层是原子的,所以zk可以保证服务本地的数据更新是正确的。当leader收到一个写入的请求时,在写入前,会计算当前系统的状态,然后会使用一个事务操作,更新当前的状态。

欢迎关注公众号
上一篇下一篇

猜你喜欢

热点阅读