zookeeper的应用场景

zookeeper是一个高可用的分布式数据管理与协调框架,基于对ZAB算法的实现,该框架能够很好地保证分布式环境中数据的一致性。

1、数据发布订阅
数据发布/订阅系统,即配置中心。发布者将数据发布到zk上,功订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。
发布/订阅系统一般有两种设计模式:推push和拉pull。zk采用推拉结合的方式:客户端向服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发送Watcher事件通知,客户端收到这个通知之后,需要主动到服务端获取最新的数据。

使用场景

适合进行配置管理的信息一般具有以下特点:

数据量通常较小

数据内容在运行时会发生动态变化

集群中各机器共享,配置一致。
使用方式

配置存储
将需要集中管理的配置信息写到zk的数据节点上,称为配置节点

配置获取
集群中的每台机器在启动初始化阶段,从zk的配置节点上读取配置信息,同时在该节点上注册一个页游数据变更的Watcher,一旦节点数据发生变化,所有订阅的客户端能够获取到变更通知

配置变更
系统运行过程中,如果配置发生变化,客户端会接收到变更通知后,就可以重新获取最新的数据。

2、负载均衡
典型场景:动态DNS服务

3、命名服务
分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象。其中较为常见的就是一些分布式服务框架中的服务列表。通过使用命名服务,客户端应用能够通过指定名字来获取资源的实体、服务地址和提供者的信息等。
zk提供的命名服务功能,能够帮助应用系统通过一个资源引用的方式实现对资源的定位和使用。广义上命名服务的资源定位不是真正意义的实体资源,在分布式环境中,上层应用阴影需要一个全局唯一的名字,例如,使用zk实现一套分布式全局唯一ID的分配也属于命名服务。

4、分布式协调/通知
zk使用watcher注册与异步通知机制,能够很好地实现分布式环境中不同的机器,甚至是不同系统之间的协调与通知。

使用场景

心跳检测
机器间的心跳检测是指在分布式环境中,不同机器之间需要检测到彼此是否在正常运行。传统的方法是在机器之间建立长连接,通过TCP连接固有的心跳监测机制实现上层机器的心跳检测。基于zk的临时节点特性,可以让不同的机器都在zk的一个指定节点下创建临时子节点,不同机器可以监听临时节点来判断对应的客户端机器是否存活。通过这种方式,检测系统和被检测系统不需要直接关联,大大减少系统耦合。

5、集群管理
集群管理,包括集群监控与集群控制。

集群监控:集群运行时状态的手机,例如当前有多少台机器在工作等

集群控制:对集群进行操作和控制,例如对集群中机器进行上下线等
传统的分布式系统中,通过在集群中每台机器上部署一个agent,由agent主动想指定的监控中心系统上报自己所在的机器状态。
zk中,使用watcher监听和临时节点的特性实现集群管理。

使用示例

分布式日志收集系统

在线云主机管理

分布式定时任务系统
6、Master选举
Master选举,即在集群的所有机器中选举出一台作为Master。 利用zk的强一致性,即zk将会保证客户端无法重复创建一个已经存在的数据节点,来保证高并发下节点的创建能保证全局唯一性。
Master动态选举的过程大致如下:客户端集群在zk上指定节点下创建临时节点,在这个过程中,只有一个客户端能创建成功,那么这个客户端所在的机器就成为了页游里的www.sangpi.comMaster。同时,其他没有在zk上创建成功的客户端会注册一个子节点变更的watcher,用于监控当前master是否存活,一旦发现master挂了,那么其余的客户端重新进行master选举。

7、分布式锁

排他锁
利用zk的临时节点实现,过程与master选举类似

共享锁
利用zk的临时顺序节点实现。每台机器在指定节点下创建临时顺序节点,并指定节点类型是读还是写,并对节点创建子节点变更的watcher。同时判断自己在子节点中的序号大小,以及比自己小的节点的类型,例如如果自己想申请读锁,如果比自己小的节点都是读,则获取锁。

羊群效应
上面共享锁的实现原理是,只要子节点发生变更,所有机器都要收到变更通知并获取所有子节点列表。当集群中节点个数很多时,会导致发送大量的watcher通知,对zk服务器造成巨大的性能影响和网络冲击,更严重的是,当如果同一时间有多个节点发生变化,zk服务器会在短时间内向其余客户端发送大量的时间通知——这就是所谓的羊群效应。

改进后的共享锁
改进后的共享锁是每个临时节点不对所有的子节点注册watcher,而是只对比自己序号小的最后一个节点注册watcher监听。

8、分布式队列
分布式队列,简单地讲氛围两大类,一类是常规的先进先出队列,另一种是等到队列元素集聚后才统一安排执行的Barrier模型。

FIFO
实现原理与全写的共享锁类似,使用临时顺序节点实现,每个节点监听比自己序号小的最后一个节点。

Barrier
利用临时节点实现。比如当子节点个数达到10后再继续往下执行,过程大概是:将指定节点的数据内容赋值为10,客户端在指定节点下创建临时节点,然后客户端读取指定节点的数据内容,并对子节点列表注册watcher。

上一篇:pdf目录大纲


下一篇:SpringCloud基础概念