Zookeeper学习笔记

  1. Zookeeper中,事务是指能够改变Zookeeper服务器状态的操作,称之为事务操作或者更新操作,一般包括数据节点的创建与删除、数据节点内容更新和客户端会话创建与失效等操作。
  2. 临时节点是在客户端会话失效,而非TCP链接断开的时候会被自动清除。
  3. Zookeeper规定临时节点不能创建子节点。也就是说临时节点只能是叶子节点。
  4. Zookeeper中每个数据节点除了存储数据内容外,还会存储数据节点本身的一些状态信息。
  5. Stat结构字段和说明如下

    状态属性 说明
    czxid Created ZXID,表示该数据节点被创建时候的事务ID
    mzxid Modified ZXID,表示该节点最后一次被更新时的事务ID
    ctime Created Time,表示节点被创建的时间
    mtime Modified Time,表示该节点最后一次被更新的时间
    dataVersion 数据节点的版本号。当前数据节点数据内容的版本号
    cversion 子节点的版本号。当前数据节点子节点的版本号
    aversion 当前数据节点ACL变更版本号
    ephemeralOwner 创建该临时节点的会话的sessionID。如果该节点是持久节点,那么这个属性值为0
    dataLength 数据内容的长度
    numChildren 当前节点的子节点个数
    pzxid 表示该节点的子节点列表最后一次被修改时的ID。注意,只有子节点列表个数变更了才会修改pzxid,子节点内容变更不会影响pzxid
  6. version表示的是数据节点内容变更的次数。强调的是变更次数。因此即使前后两次的变更并没有修改数据的内容,version的值也会发生变化。

  7. 乐观锁控制事务分为三个阶段:数据读取、写入校验和数据写入。

  8. Zookeeper中使用version来实现乐观锁机制。

  9. Watcher特性总结:

    1. 一致性。无论是客户端还是服务端,一旦一个Watcher被触发,Zookeeper都会将其从相应的存储中移除。所以在Watcher的使用上要反复注册。
    2. 客户端串行执行。客户端Watcher回调是个串行同步的过程。
    3. 轻量。WatchedEventZookeeper整个Watcher通知机制的最小通知单元。包含三部分:通知状态、事件类型和节点路径。ZookeeperWatcher只会通知客户端指定数据节点的数据内容发生了变更,而对于原始数据以及变更后的新数据都无法从这个事件中直接获取。而是需要客户端主动去重新获取数据
  10. Zookeeper提供了多种权限控制模式(Schema),有worldauthdigestipsuper

  11. ZookeeperACL包括三个部分:权限模式(Scheme)、授权对象(ID)和权限(Permission),通常使用schema:ip:permission来标识一个有效的ACL信息。

    1. Schema
      • IP:指通过IP地址粒度进行权限控制。
      • Digest:最常用的权限控制模式。username:password形式,并进过SHA-1BASE64加密处理。
      • World:最开放的权限控制模式。数据节点的访问权限对所有的用户开放。即所有的用户都可以在不进行任何权限校验的情况下操作Zookeeper上的数据。也可以看做是一种特殊的Digest模式,只有一个权限标识:world:anyone
      • Super:一种特殊的Digest模式。在这种模式下,超级用户可以对任意Zookeeper上的数据节点进行任何操作。
    2. 授权对象:ID

      权限模式 授权对象
      IP 通常是一个IP地址或者IP段。例如192.168.0.110或者192.168.0.1/24
      Digest 自定义,通常是username:BASE64(SHA-1(username:password))
      World 只有一个ID:"anyone"
      super Digest一致
    3. 权限:Permission
      权限指那些通过权限检查后可以被允许的操作。包括下面几种:

      • CREATE(C):数据节点的创建权限,允许授权对象在该节点下创建子节点。
      • DELETE(D):子节点的删除权限。允许授权对象删除出该数据节点的子节点。
      • READ(R):数据节点的读取权限。允许授权对象访问该数据节点并读取其数据内容或子节点列表等。
      • WRITE(W):数据节点的更新权限。允许授权对象对该数据节点进行更新操作。
      • ADMIN(A):数据节点的管理权限。允许授权对象对数据节点进行ACL相关的设置操作。
  12. Zookeeper客户端由以下几个核心组件组成:

    • Zookeeper实例:客户端入口
    • CLientWatchManager:客户端Watcher管理器
    • HostProvider:客户端地址列表管理器
    • ClientCnxn:客户端核心线程,内部包含两个线程
      • SendThread:I/O线程,负责客户端和服务端的网络通信。
      • EventThread:事件线程。负责对服务端事件进行处理。

Session

  1. SessionZookeeper中会话的实体,代表一个客户端会话,包含下面4个属性:

    • sessionID:会话ID,用来唯一标识一个会话。每次客户端创建新会话的时候都会分配一个全局唯一的sessionID
    • TimeOut:会话超时时间。客户端在构造Zookeeper实例的时候需要制定会话超时时间。配置好之后服务器会根据自己的超时时间限制最终确定会话的超时时间。
    • TickTime:下次会话超时时间。Zookeeper采用"分桶策略"管理会话。
    • isClosing:用于标记一个会话是否已经被关闭。当服务端检测到一个会话已经超时失效的时候,会把对应会话的isClosing属性标识为"已关闭"。
  2. SessionTrackerZookeeper服务端会话管理器,负责会话的创建、管理和清理工作。每个会话在SessionTracker内部保留了三份:

    • sessionsById:一个HashMap<Long,SessionImpl>类型的数据结构。根据sessionID来管理Session实体。
    • sessionWithTimeout:一个ConcurrentHashMap<Long,Integer>类型的数据结构,根据sessionID来管理会话的超时时间。该树结构和Zookeeper内存数据库相通,会被定期持久化到快找文件中去。
    • sessionSets:一个HashMap<Long,SessionSet>类型的数据结构。用于根据下次会话超时时间来归档会话,便于进行会话管理和超时检查。
  3. 会话管理
    Zookeeper采用"分桶策略"进行会话管理。

    • 分桶策略

      分桶策略是指:把类似的会话放在同一区块进行管理。分配的原则是按照每个会话的"下次超时时间"(EipirationTime),"下次超时时间"也就是会话最近一次可能超时的时间点。
      ExpirationTime计算公式如下:
      ExpirationTime_ = CurrentTime + SessionTimeout
      ExpirationTime = (ExpirationTime_ / ExpirationInternal + 1) * ExpirationInternal

      • CurrentTime:对于新创建的Session表示创建时间,已有的Session表示当前会话被激活的时间。单位是毫秒。
      • SessionTimeout:会话超时时间。在实例化Zookeeper的时候设置的。单位是毫秒。
      • ExpirationInternal:Leader服务器定时检查会话超时时间间隔。默认值是tickTime = 2000。单位是毫秒。
    • 会话激活

2017-07-11 11:1824