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. 轻量。`WatchedEvent`是`Zookeeper`整个`Watcher`通知机制的最小通知单元。包含三部分:通知状态、事件类型和节点路径。`Zookeeper`的`Watcher`只会通知客户端指定数据节点的数据内容发生了变更,而对于原始数据以及变更后的新数据都无法从这个事件中直接获取。而是需要***客户端主动去重新获取数据***。 10. `Zookeeper`提供了多种权限控制模式(`Schema`),有`world`、`auth`、`digest`、`ip`和`super`。 11. `Zookeeper`的`ACL`包括三个部分:权限模式(`Scheme`)、授权对象(`ID`)和权限(`Permission`),通常使用`schema:ip:permission`来标识一个有效的`ACL`信息。 1. `Schema` * `IP`:指通过IP地址粒度进行权限控制。 * `Digest`:最常用的权限控制模式。`username:password`形式,并进过`SHA-1`和`BASE64`加密处理。 * `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. `Session`是`Zookeeper`中会话的实体,代表一个客户端会话,包含下面4个属性: * `sessionID`:会话ID,用来唯一标识一个会话。每次客户端创建新会话的时候都会分配一个全局唯一的`sessionID`。 * `TimeOut`:会话超时时间。客户端在构造`Zookeeper`实例的时候需要制定会话超时时间。配置好之后服务器会***根据自己的超时时间限制***最终确定会话的超时时间。 * `TickTime`:下次会话超时时间。`Zookeeper`采用"分桶策略"管理会话。 * `isClosing`:用于标记一个会话是否已经被关闭。当服务端检测到一个会话已经超时失效的时候,会把对应会话的`isClosing`属性标识为"已关闭"。 2. `SessionTracker`是`Zookeeper`服务端会话管理器,负责会话的创建、管理和清理工作。每个会话在`SessionTracker`内部保留了三份: * `sessionsById`:一个`HashMap`类型的数据结构。根据`sessionID`来管理`Session`实体。 * `sessionWithTimeout`:一个`ConcurrentHashMap`类型的数据结构,根据`sessionID`来管理会话的超时时间。该树结构和`Zookeeper`内存数据库相通,会被定期持久化到快找文件中去。 * `sessionSets`:一个`HashMap`类型的数据结构。用于根据下次会话超时时间来归档会话,便于进行会话管理和超时检查。 3. 会话管理 `Zookeeper`采用"分桶策略"进行会话管理。 * 分桶策略 分桶策略是指:把类似的会话放在同一区块进行管理。分配的原则是按照每个会话的"下次超时时间"(`EipirationTime`),"下次超时时间"也就是会话最近一次可能超时的时间点。 `ExpirationTime`计算公式如下: `ExpirationTime_ = CurrentTime + SessionTimeout` `ExpirationTime = (ExpirationTime_ / ExpirationInternal + 1) * ExpirationInternal` * `CurrentTime`:对于新创建的`Session`表示创建时间,已有的`Session`表示当前会话被激活的时间。单位是毫秒。 * `SessionTimeout`:会话超时时间。在实例化`Zookeeper`的时候设置的。单位是毫秒。 * `ExpirationInternal`:`Leader`服务器定时检查会话超时时间间隔。默认值是`tickTime = 2000`。单位是毫秒。 * 会话激活