Zookeeper 应用入门

Zookeeper 应用入门

Zookeeper 是一个开源的分布式协调服务,由雅虎公司创建,由于最初雅虎公司的内部研究小组的项目大多以动物的名字命名,所以后来就以 Zookeeper(动物管理员)来命名了,而就是由 Zookeeper 来负责这些分布式组件环境的协调工作,为了解决分布式环境下数据一致性的问题。

一:数据节点 Znode

Zookeeper 中存储数据内容这个数据节点就叫做 Znode(兼具文件和目录的特点),他是一个树形结构,比如/a/b/c (通过路径引用),又分为持久节点、临时节点、顺序节点三大类。

  • 持久节点:只要被创建,除非主动移除,否则都应该一直保存在 Zookeeper 中(采用事务日志及快照文件的方案来落盘)
  • 临时节点:他的生命周期和客户端 Session 会话一样,会话失效,那么临时节点就会被移除,而且不能有子节点
  • 顺序节点:子节点的名称还具有有序性
    • 临时顺序节点
    • 持久顺序节点

节点除了存储数据内容以外,还存储了数据节点本身的一些状态信息,通过get命令可以获得状态信息的详细内容
在这里插入图片描述
每个数据节点都有三类版本信息,对数据节点任何更新操作都会引起版本号的变化,,version属性就是用来实现乐观锁机制的“写入校验”,保证分布式数据的原子性。
在这里插入图片描述

二 :watcher机制

提供了分布式数据的发布/订阅功能,zookeeper允许客户端向服务端注册一个watcher监听,当服务端的一些指定事件触发了watcher,那么服务端就会向客户端发送一个事件通知。

  • get [-s] [-w] path:监听指定path节点的修改和删除事件。同样该事件也是一次性触发

  • ls [-s] [-w] [-R] path : 监控指定path的子节点的添加和删除事件。

  • stat [-w] path:作用和get完全相同。

  • addWatch [-m mode] path
    addWatch的作用是针对指定节点添加事件监听,支持两种模式

    • PERSISTENT,持久化订阅,针对当前节点的修改和删除事件,以及当前节点的子节点的删除和新增事件
    • PERSISTENT_RECURSIVE,持久化递归订阅,在PERSISTENT的基础上,增加了子节点修改的事件触发,以及子节点的子节点的数据变化都会触发相关事件(满足递归订阅特性)

watcher主要流程:

  • 客户端向服务端注册 Wather 监听;
  • 保存 Wather 对象到客户端本地的 WatcherManager 中;
  • 服务端接收 Watcher 并存储在WatcherManager 的 WatchTable 和 watch2Paths 中去。
  • zk中的节点发生变化时,服务端 Watcher事件触发后,找到;提取并从 WatchTable 和 Watch2Paths 中删除对应 Watcher(从这里可以看出 Watcher 在服务端是一次性的,触发一次就失效了)
  • 客户端收到服务端通知,从客户端本地的 WatcherManager 中取出对应 Watcher对象执行回调逻辑(回调是串行同步),客户端的 Watcher 机制同样是一次性的,一旦被触发后,该 Watcher 就失效了。

watcher特点:

  • 一次性的,就是说一旦触发了一次事件监听,Zookeeper 就会将它从存储中移除后续的事件都不会响应
  • 轻量,Watcher 通知的单位是 Event对象,只包含通知状态、事件类型和节点路径,不包含具体的事件内容,具体内容需要客户端主动去重新获取数据
  • 客户端串行,客户端的 Watcher回调处理是串行同步的过程,不要因为一个 Watcher 的逻辑阻塞整个客户端

当然我们可以通过重复订阅来解决

三:Session会话机制

会话自然就是指 Zookeeper 客户端和服务端之间的通信,他们使用 TCP 长连接的方式保持通信,通常,肯定会有心跳检测的机制,同时他可以接受来自服务器的 Watch 事件通知

四:权限控制 ACL

Zookeeper 使用 ACL 来进行权限的控制,ACL权限控制,使用: scheme:id:perm 来标识。

  • Scheme(权限模式),标识授权策略
  • ID(授权对象)
  • Permission:授予的权限

4.1、Scheme权限模式

所谓权限模式,就是使用什么样的方式来进行授权:

  • world:默认方式,相当于全部都能访问。
  • auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
  • digest:即用户名:密码这种方式认证,这也是业务系统中最常用的。
  • ip:通过ip地址来做权限控制,比如 ip:192.168.1.1 表示权限控制都是针对这个ip地址的。也可以针对网段 ip:192.168.1.1/24。

4.2、ID授权对象
指权限赋予的用户或一个指定的实体,不同的权限模式下,授权对象不同
在这里插入图片描述

Id ipId1 = new Id("ip", "192.168.190.1");
Id ANYONE_ID_UNSAFE = new Id("world", "anyone");

Permission权限类型包含以下 5 种:

  • CREATE,创建子节点权限
  • DELETE,删除子节点权限
  • READ,获取节点数据和子节点列表权限
  • WRITE,更新节点权限
  • ADMIN,设置节点 ACL 权限

ACL相关的命令如下:

getAcl getAcl <path> 读取ACL权限
setAcl setAcl <path> <acl> 设置ACL权限
addauth addauth <scheme> <auth> 添加认证用户

五:基于Java操作Zookeeper-Curator

  • zookeeper 原生API
  • zkClient -> Zookeeper API 的封装
  • Apache Curator -> Zookeeper API 的封装

是Apache 对Zookeeper API 的封装,java开发优先使用Curator来操作。

六:应用场景

  • 命名服务 Name Service,依赖 Zookeeper 可以生成全局唯一的路径即节点 ID,来对分布式系统中的资源进行管理。
  • 配置管理:使用的propertier、yaml、xml等需要配置的信息,比如数据库连接,目标服务ip:port等等,当需要修改时,可以通过改变目录节点内容,利用 Wather 的监听机制通知各个客户端,从而更改配置。
  • 分布式协调,这是 Zookeeper 的核心使用了。利用 Wather 的监听机制,一个系统的某个节点状态发生改变,另外系统可以得到通知。
  • Master 选举,利用 Zookeeper 节点的全局唯一性,同时只有一个客户端能够创建成功的特点,可以作为 Master 选举使用,创建成功的则作为 Master。
  • 分布式锁,利用 Zookeeper 创建临时顺序节点的特性。
  • 集群管理,分布式集群中状态的监控和管理,可以实时监控znode节点的变化,一旦发现有机器挂了,该机器就会与zk断开连接,对应的临时目录节点就被删除,其他所有机器都收到通知,新机器加入也是类似逻辑。

七、Zookeeper 如何保证了分布式一致性特性

zookeeper 采用了全局递增的事务 Id 来标识,所有的写请求 proposal(提议)都在被提出的时候加上了 zxid,zxid 实际上是一个 64 位的数字,高 32 位是 epoch(时期; 纪元; 世;)用来标识 leader 周期,如果有新的 leader 产生出来,epoch会自增,低 32 位用来递增计数。当新产生 proposal 的时候,会依据数据库的两阶段过程,首先会向其他的server 发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。

客户端的读请求可以被集群中的任意一台机器处理,因此,随着 zookeeper 的集群机器增多,读请求的吞吐会提高但是写请求的吞吐会下降。有序性是 zookeeper 中非常重要的一个特性,所有的更新都是全局有序的,每个更新都有一个唯一的时间戳,这个时间戳称为 zxid(Zookeeper Transaction Id)。也就是读请求的返回结果中会带有这个zookeeper 最新的 zxid 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值