1.数据发布/订阅
发布者将数据发布到ZooKeeper的一个节点上,供订阅者进行数据订阅,从而达到动态获取数据的目的,实现配置中心的集中式管理和数据的动态订阅
适用场景:系统中的一些通用的配置信息,当发生变更的时候,需要被快速感知
实现方式:在ZooKeeper上创建一节点,并将配置信息绑定到该节点,同时注册一个监听事件Watch,当节点数据发生变更时,重新查询节点数据,并做相应处理
2.负载均衡
分布式系统具有对等性,为了保证系统的高可用,通常采用副本的方式来对数据和服务进行部署。对消费者而言,需要在这些服务中选择一个来执行相关的业务,比较典型的是DNS服务
适用场景:动态DNS
实现方式:同上
3.命名服务
在分布式系统中,被命名的实体通常是集群中的机器、提供的远程地址、远程对象等,这些可以被统称为名字。
比较常见的是:分布式服务框架(RPC、RMI等)中的服务地址列表,通过使用名字服务,客户端能够直接根据名字来获取资源的实体、服务地址、提供者信息等。
适用场景:在提供这些服务之间,我们需要保证名字的唯一性。如何在分布式系统中创建一个唯一的ID成为我们的问题
实现方式:使用ZooKeeper创建循序节点
4.分布式协调/通知
分布式系统需要一个协调者来控制整个系统的运行流程。引入这样一个协调者,将有助于将分布式协调的职责从应用中分离出来,从而可以大大减少系统之间的耦合性。
ZooKeeper中特有的Watch注册与异步通知机制,能够很好的实现分布式环境下不同机器之间的协调与通知。
1)协调
任务的切换及备份,通常操作是在一节点下(M)创建子节点(S1 S2),将一个子节点(S1)作为Running、另一个(S2)作为Standby,同时在节点(M)上注册监听事件,一旦S1宕机,就将S2切换为Running来执行任务
2)通知
系统机器间的通信方式:心跳检测、工作进度汇报、系统调度三种类型
* 心跳检测:在分布式环境下,不同机器之间需要检测到彼此是否在正常运行(不同的机器在指定节点下创建临时子节点,通过查询临时子节点的信息来判断对应的客户端主机是否存货,这种方式,监测系统和被监测系统不需要直接相关联,减少耦合)
* 工作进度汇报:在一个任务分发系统中,通常任务分发到不同的机器上执行后,需要实时的将自己的任务执行进度汇报给分发系统(与心跳检测类似,每个任务机器实时的将任务执行进度写到临时节点上,以便中心系统能够实时的获取到任务的执行速度)
* 系统调度:使用ZooKeeper实现另一种系统调度模式,控制台和客户端系统组成的分布式系统,控制台的职责就是发送一些指令信息给所有的客户端,以控制他们进行相应的业务逻辑。(我们通过修改控制台节点的数据,ZooKeeper则会以事件通知的形式发送给客户端)
5.集群管理
集群管理通常包括:集群监控(集群运行状态)、集群控制(对集群的操作)
实现方式:将集群中的机器创建到ZooKeeper中同一节点(M)下,将机器信息写入到该临时节点下,并对M节点进行监听
6.Master选举
在分布式系统中,Master往往用来协调集群中的其他系统单元,具有对分布式系统状态变更的决定权。比如:写数据库操作一般由Master节点来处理。
适用场景:如何在集群中选举出一个Master节点来执行任务
实现方式:利用ZooKeeper创建节点的唯一性,如果多个客户端同时创建一个节点,那么只有一个能够创建成功,成功的这个我们推选为Master,其他的客户端在在这个节点的父节点上注册监听事件,用于监听该节点是否存在,如果节点消失,则重新选举Master
7.分布式锁
分布式锁是控制分布式系统之间访问共享资源的一种方式,通过互斥手段来保证一致性。
1)排它锁
定义锁:通过创建ZooKeeper上的一个节点来表示一个锁
获取锁:多客户端同时创建一个节点(S)则只有一个能成功,成功的这个获取到锁,执行相关任务,没有成功的则监听父节点
释放锁:任务执行完毕后删除临时节点(S),让其他客户端重新竞争
2)共享锁
共享锁和排它锁的区别是:加上排它锁之后,数据只对一个事务可见;加上共享锁后,数据对所有事务可见
定义锁:通过创建ZooKeeper上的一个节点(M),在该节点下创建临时节点(例如 /M/[hostname]-请求类型-序号)
获取锁:读请求则创建请求类型为R的顺序节点,写请求则创建请求类型为W的顺序节点
判断读写顺序:不同的事务都可以对同一个数据对象进行读取操作;而更新操作必须在当前没有任何事务进行读写操作的情况下进行;
* 创建完节点后,获取M节点下所有的子节点,并对M节点这次子节点变更的Watch监听
* 确定自己的节点序号在所有节点中的顺序
* 对于读请求,如果没有比自己序号小的子节点,或者比自己小的都是读请求,则表明自己已经获得共享锁,开始进行读操作;如果比自己小的有写请求,则需要进入等待
* 对于写请求,如果自己不是序号最小的子节点,则进入等待
释放锁:任务执行完毕后,删除该临时节点
参考:从Paxos到Zookeeper分布式原理与实践