zookeeper介绍与原理

作者: 王广帅 | 来源:发表于2020-04-16 23:23 被阅读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收到一个写入的请求时,在写入前,会计算当前系统的状态,然后会使用一个事务操作,更新当前的状态。

    欢迎关注公众号

    相关文章

      网友评论

        本文标题:zookeeper介绍与原理

        本文链接:https://www.haomeiwen.com/subject/ruvdvhtx.html