zoukankan      html  css  js  c++  java
  • zookeeper介绍

    The Zookeeper data model

      Zookeeper有一个树形的namespace,就像分布式文件系统一样,唯一区别就是这个namespace包括其子节点可以有关联的数据。就像文件系统允许有文件或者文件夹一样。节点的路径通常用绝对的,带/分隔的字符串表示。任何字符串都可以被使用除了下面所列举的内容:

      ·The null character (u0000) cannot be part of a path name. (This causes problems with the C binding.)

      ·The following characters can't be used because they don't display well, or render in confusing ways: u0001 - u0019 and u007F - u009F.

      ·The following characters are not allowed: ud800 -uF8FFF, uFFF0-uFFFF, uXFFFE - uXFFFF (where X is a digit 1 - E), uF0000 - uFFFFF.

      ·The "." character can be used as part of another name, but "." and ".." cannot alone be used to indicate a node along a path, because ZooKeeper doesn't use relative paths. The following would be invalid: "/a/b/./c" or "/a/b/../c".

      ·The token "zookeeper" is reserved.

    Znodes

      Zookeeper中所有的node都是指znode,znode维护了一个状态结构,包括data change,acl change,时间戳,version,version对应的时间戳,帮助zookeeper验证缓存,协助更新。Znode的data发生change,version增加。当客户端查找data也会同时接收到data的version。当客户端更新或者删除某一version的data时,也必须提供data的version。当data和version不匹配,则此次操作失败(失败后的处理可被重写)

    Znodes是主要的编程入口,下面是几个有价值的内容:

    Watches

      客户端可以在znodes上设置watches,改变znode的触发watch的机制和清楚watch。当一个watch触发,zookeeper会发送一个消息给客户端。相关连接为

    http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#ch_zkWatches

    Data Access

      在每个znode的namespace下,数据被自动的读和写。读操作可以获取znode所有相关的data bytes,写操作会替换所有的data。每个node都有一个access contril list(ACL)来制约谁有使用权。

    Zookeeper不是被设计成一个通用的数据库或者很大的对象存储。推荐用做管理协调性的data。Data的来源可以是in the form of configuration,status information,rendezvous,etc.因为这些东西比较小,以kb计量。Zookeeper的client和server确保znodes的data小于1M,并且data平均应该小于1M。大量数据会在网络和存储上消耗时间,从而影响性能。大量数据应该被存在hdfs上,zookeeper上存的是数据的路径等配置。

    Ephemeral Node

      Zookeeper也有临时node的概念,这些znodes只会在session活着的时候存在。因此ephemeral node也不允许有子节点。

    Sequence Nodes – Unique Naming

      当你create一个node同时你可以要求zookeeper在path后面增加一个单调增加的计数,这个计数是唯一的。计数是10位数大小。超过2147483647会溢出

     

     

    Time in Zookeeper

     

    Zxid

     

      每个对zookeeper state的change都会有一个印记,zxid(zookeeper transaction id),zxid说明了zookeeper所有版本的change,zxid越小,发生的越早

     

    Version number

     

      每个对node的change都会对node的一个version number增加。

     

    有三个version,分别是version(number of changes to the data of a znode),cversion(number of changes to the children of a znode),aversion(number of changes to the ACL of a znode)

     

    Ticks

     

      当使用多servers的zookeeper,servers用ticks定义关于时间的事件,例如status uploads,session timeout,connection timeout between peers.

     

    Real time

     

      Zookeeper不适用实时时间或者时钟,而是在stat structure里加时间戳。

     

    Zookeeeper stat structure

    Stat structure由以下组成

    cxid

      造成zxid变化的znode创建

    mzxid

      在这个znode中最后被修改的zxid

    ctime

      这个znode被创建的毫秒级时间戳

    mtime

      这个znode最后被修改的时间

    version

      这个node的change次数

    cversion

      这个znode的子节点的change次数

    aversion

      这个znode的ACL的change次数

    ephemeralOwner

      如果这个znode是Ephemeral node,则为session id,否则就是0

    dataLength

      这个znode的data fields的长度

    numChildren

      这个znode的子节点数量

     

    Zookeeper session

      一个zookeeper的client通过用语言绑定create handle建立一个和zookeeper service相连的session。一旦创建,handle开始是connection状态,客户端的库尝试连接zookeeper servers的其中一个,直到状态切换成connected。一般的操作只有connection和connected两个状态。如何有一格不可被恢复的错误发生,比如session到期或者权限校验失败,或者application 已经关闭了handle,handle会把状态却换成closed。下图说明了zookeeper的client的状态转换。

         

      Zookeeper的client会在设置的servers中任意挑选一个连接,如果连接失败了,client会尝试用另一个servers去连接,直到连接建立。

    当client从zookeeper service中获得handle,zookeeper会创建一个zookeeper session,用一个64位数表示,并分配给client。当client连接到不同的zookeeper servers,在连接握手中会带入session id。在有安全措施的情况下,server会为session id创建一个所有zookeeper server都认可的password。这个password在client建立session的过程中会和session id一起发送给client。当client重新和新的servers建立连接的时候,需要把session id和password一起发送servers。

     

    Zookeeper Watches

    所有的读操作,例如getData(),getChildren(),exits(),都有一个设置watch的选项。Zookeeper的watch的定义是,one-time trigger,当dataq发生change发送给设置watch的client,下面是三个关键点:

    One-time trigger

      当client设置了watch,例如getData(“/znode”,true),之后这个data被change了,那watch会接收到一次事件,如果这个data再次被change,则watch不会再接收到事件,除非client再设置getData(“/znode”,true)

    Sent to the client

      Change事件会发送给client,但是不一定在修改或者初始化change返回成功代码之前到达。Watches都是被异步发送给watcher。Zookeeper提供了一个顺序保证:client不会知道一个watch的change直到client第一次知道watch事件。保证了不同client看到的东西的顺序都是一致性的

    The data for which the watch was set

      Zookeeper维护了两种watches,data watches和child watches。getData(),exists()是用来设置data watches,getChildren()是用来设置child watches。

    只有一种情况下,watch会丢失:一个还没存在的znode在disconnected状态下的创建和删除。

     

    参考资料:

    //官网的介绍

    http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#ch_zkSessions

     

    PS

    下方是我个人订阅号,会一直更新各类技术文章,欢迎关注  :)

     

    新博客地址 http://ixiaosi.art/ 欢迎来访 : )
  • 相关阅读:
    一篇文章高效定位iframe
    URL与视图函数的映射
    include标签—引用文件路径
    UnitTest单元测试框架解析【实用篇】
    【案例演练】测试器与模板继承
    2招带你快速获取响应头与发送头
    dede网站如何更新地图sitemap.html
    申请微信小程序流程步骤
    phpstudy本地配置--dede织梦网
    stylus样式开发的使用----vue
  • 原文地址:https://www.cnblogs.com/ulysses-you/p/6471931.html
Copyright © 2011-2022 走看看