Zookeeper之功能篇章

文章目录

      • 一、集群角色
      • 二、数据模型
          • 1、持久节点(PERSISTENT)
          • 2、持久有序节点(PERSISTENT_SEQUENTIAL)
          • 3、临时节点(EPHEMERAL)
          • 4、临时有序节点(EPHEMERAL)
      • 三、会话
      • 四、Stat状态信息
      • 五、版本
      • 六、Watcher
      • 七、ACL
        • 1、特点
        • 2、ACL Permissions
        • 3、ACL Schemes 、ID
        • 4、权限相关命令
        • 5、zkCli操作示例
          • a、word
          • b、ip
          • c、auth
          • d、digest
      • 八、quota

一、集群角色

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)

在临时节点的基础上多了一个顺序性

三、会话

Zookeeper之功能篇章_第1张图片

  • 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/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 : | 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 节点下,可以设置该节点的全年,以防其他人修改

你可能感兴趣的:(•,Java架构,——【分布式协调服务】)