文章目录
一、集群角色
Leader:
- 事物请求的唯一调度和处理者,保证集群事物处理的顺序性
- 集群内部各服务器的调度者
Follower:
- 处理客户端非事物请求、转发事物请求给leader服务器
- 参与事物请求 Proposal 的投票(需要半数以上服务器 通过才能通知leader commit数据; Leader发起的提案, 要求Follower投票)
- 参与Leader选举的投票
Observer:是 zookeeper3.3 开始引入的一个全新的服务器角色。
- 观察zookeeper集群中的最新状态变化并将这些状态变化 同步到 observer 服务器上。Observer 的工作原理与 follower 角色基本一致,
- 只提供非事物请求服务,没有选举和投票的资格,通常在于不影响集群事物 处理能力的前提下提升集群非事物处理的能力 (例:选举时)
二、数据模型
Zookeeper 的视图结构和标准的文件系统非常类似,每一个节点称之为ZNode,是Zookeeper的最小单元。每个Znode 上都可以保存数据以及挂载子节点。构成一个层次化的树形结构。
1、持久节点(PERSISTENT)
创建后会一直存在 zookeeper 服务器上,直到主动删除
2、持久有序节点(PERSISTENT_SEQUENTIAL)
每个节点都会为它的一级子节点维护一个顺序
3、临时节点(EPHEMERAL)
临时的生命周期和客户端的回话绑定在一起,当客户端回话失效该节点自动清理
4、临时有序节点(EPHEMERAL)
在临时节点的基础上多了一个顺序性
三、会话
- Client 初始化连接,状态转化为 CONNECTING ①
- Client 与 Server 成功建立连接,状态转为 CONNECTED ②
- Client 丢失了与 Server 的连接或者没有接受到 Server 的响应, 状态转为 CONNECTING ③
- Client 连上另外的 Server 或连接上了之前的 Server , 状态转为 CONNECTED ②
- 若会话过期(是Server 负责生命会话过期,而不是Client),状态转化为CLOSED ⑤
- Client 也可以主动关闭回话 ④ ,状态转化为 CLOSED
四、Stat状态信息
每个节点除了存储数据内容以外,还存储了数据节点本身的一些状态信息,通过 get 命令可以获得状态信息的详细内容
状态属性 | 说明 | |
---|---|---|
cZxid | 0x0 | 即Created ZXID,表示该数据节点被创建时的事务ID |
ctime | Wed Dec 31 19:00:00 EST 1969 | 即Created Time,表示节点被创建的时间 |
mZxid | 0x0 | 即Modified ZXID,表示该数据节点被更新时的事务ID |
mtime | Wed Dec 31 19:00:00 EST 1969 | 即Modified Time,表示该节点最后一次被更新的时间 |
pZxid | 0x0 | 表示该节点的子节点列表最后一次被修改时的事务ID。注意。只有子节点列表变更了才会更新这个事务ID,子节点的内容变更不会影响pZxid |
cversion | 1 | 当前数据节点子节点的版本号,规则同上 |
dateVersion | 0 | 当前数据节点数据内容的版本号 |
aclVersion | 0 | 当前数据节点 ACL 变更版本号 |
ephemeralOwner | 0x0 | 创建该临时节点的会话的SessionID,如果该节点是持久节点,那么这个属性值为0 (0x0) |
dateLength | 0 | 数据value的长度 |
numChildren | 1 | 当前节点的子节点个数 |
五、版本
保证分布式数据原子性,Zookeeper 为数据节点引入了版本的概念,每个数据节点都有三类版本信息,对数据节点任何更新操作都会引起版本号的变化;cversion、dateVersion、aclVersion
版本的概念,和我们经常使用的乐观锁类似, version水泥杆就是用来实现乐观锁机制的“写入效验” 。
六、Watcher
Zookeeper 提供了分布式数据的发布 / 订阅功能,Zookeeper 允许客户端向服务端注册一个 watcher 监听, 当服务端的一些指定事件触发了 watcher ,那么服务端就会想客户端发送一个事件通知。
值得注意的是,Watcher 通知是一次性的,即一旦触发一次通知后,该Watcher 就失效了,因此客户端需要反复注册 Watcher ,即程序中在 process 里面又注册了Watcher ,否则,将无法获取xx节点的创建而导致子节点变化的事件。
七、ACL
znode 不仅包含了存储的数据,还有ACL(Access Control List)。znode 的创建时,可以给它设置一个ACL,来决定谁可以对znode 做哪些操作。
使用率较少,因为zookeeper一般都部署在内网。
ACL 是由鉴权方式(Schemes)、鉴权方式的ID(ID也是值) 和一个许可(permissions)的集合组成。
例如:我们想通过一个ip地址为10.0.0.1的客户端访问一个znode。那么我们需要为znode 设置一个ACL,鉴权方式使用IP鉴权方式,鉴权方式的ID为10.0.0.1,只允许读权限,那么ACL的格式就是:
ip:10.0.0.1:w
1、特点
- Zookeeper 的权限控制是基于每个znode节点的,需要对每个节点设置权限;
- 每个 znode 支持设置多种权限控制方案和多个权限;
- 子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点;
- 所以任何一个客户端都可以通过exists 操作来获得任何znode 的状态,从而得知znode 是否真的存在。
2、ACL Permissions
ACL权限 | ACL简写 | 允许的操作 |
---|---|---|
CREATE | c | 创建子节点 |
READ | r | 获取节点的数据和他的子节点 |
WRITE | w | 设置节点的数据 |
DELETE | d | 删除子节点(仅下一级节点) |
ADMIN | a | 设置ACL权限 |
3、ACL Schemes 、ID
Zookeeper 内置了一些权限控制方案,可以用以下方案为每个节点设置权限
方案(schema) | id | 描述 |
---|---|---|
world | anyone | 只有一个用户:anyone,代表所有人,默认 |
ip | 10.0.0.1 | 使用ip地址认证 |
auth | admin | 使用已添加认证的用户认证 |
digest | admin:admin | 使用 “用户:密码” 方式认证 |
4、权限相关命令
命令 | 语法 | 描述 |
---|---|---|
getAcl | get Acl path | 读取ACL权限 |
setAcl | setAcl path acl | 设置ACL权限 |
addauth | addauth scheme auth | 添加认证用户 |
create | create [-s][-e] path data acl | 创建节点时指明ACL权限 |
5、zkCli操作示例
权限变动stat的aclVersion也会跟着递增
a、word
# 语法: setAcl <path> world:anyone:<acl> # 默认情况下时 world 方法,任何人有所有权限: # 示例: getAcl /cndba setAcl /cndba world:anyone:cdr
b、ip
# 语法: setAcl <path> ip:<ip>:<acl> # <ip>:可以是具体IP或者IP/bit格式,即IP转换为二进制,匹配前bit位, # 如192.168.0.0/16匹配192.168.*.* # 示例: create /acl test setAcl /acl ip:192.168.56.102:cdrwa getAcl /acl # 结果: 其他ip电脑访问该节点就:Authentication is not valid : /acl
c、auth
如果测试断开的话,就不能访问,必须重新addauth 添加认证用户才可以
当然在创建znode时也可以直接指定ACL,但断开之后同样需要添加认证用户才可以获取数据
# 语法: addauth digest <user>:<password> #添加认证用户 setAcl <path> auth:<user>:<acl> # 示例: addauth digest dave:dave setAcl /acl auth:dave:cdrwa getAcl /acl get /acl # 断开访问示例: get /acl # Authentication is not valid : /acl addauth digest dave:dave get /acl
d、digest
同auth一样,如果断开了,可以通过addauth 重新获得权限
下面的密码是经过SHA1及BASE64处理后的密文,在Shell中可以用一下命令计算:
格式:echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64 自己加密 [root@Master ~]# echo -n admin:admin | openssl dgst -binary -sha1 | openssl base64 x1nq8J5GOJVPY6zgzhtTtA9izLc=
# 语法: setAcl <path> digest:<user>:<password>:<acl> # 示例: create /ustc ustc setAcl /ustc digest:admin:x1nq8J5GOJVPY6zgzhtTtA9izLc=:cdrwa getAcl /ustc get /ustc # Authentication is not valid : /ustc addauth digest admin:admin get /ustc
八、quota
Zookeeper quota 机制支持节点个数(namespace)和空间大小(bytes)的设置。Zookeeper quota 保存在/zookeeper/quota 节点下,可以设置该节点的全年,以防其他人修改