ZooKeeper的典型应用场景

ZooKeeper是一个典型的发布/订阅模式的分布式数据管理与协同框架,通过对ZooKeeper丰富的数据节点类型进行交叉使用,配合Watcher事件通知机制,可以构建一系列分布式应用中都会涉及的核心功能,如数据分布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等。

01、数据发布/订阅

数据发布/订阅(Publish/Subscribe)系统,即所谓的配置中心,顾名思义就是发布者将数据发布到ZooKeeper的一个或一系列节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。

发布/订阅系统一般有两种设计模式,分别是推(Push)模式和拉(Pull)模式。在推模式中,服务端主动将数据更新发送给所有订阅的客户端;而拉模式则是由客户端主动发起请求来获取最新数据通常客户端都采用定时进行轮询拉取的方式。

客户端需要在配置节点上注册一个数据变更的Watcher监听,一旦发生节点数据变更,所有订阅的客户端都能获取到数据变更通知。

02、负载均衡

负载均衡(Load Balance)是一种相当常见的计算机网络技术,用来对多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源进行分配负载,以达到优化资源利用、最大化吞吐率、最小化响应时间和避免过载的目的。通常负载均衡分为硬件和软件两类。

动态DNS(Dynamic DNS, Dynamic Domain Name System, DDNS)服务:

通常应用都会首先从域名节点中获取一份IP地址和端口的配置,进行自行解析。同时,每个应用还会在域名节点上注册一个数据变更Watcher监听,以便及时收到域名变更的通知。

03、命名服务

在分布式系统中,被命名的实体可以是集群中的机器、提供的服务地址或远程对象等——这些我们都可以统称它们为名字(Name),其中较为常见的就是一些分布式服务框架(如RPC、RMI)中的服务地址类表,通过使用命名服务,客户端应用能够根据名字来获取资源的实体、服务地址和提供者的信息等。

命名服务需要寻求一种能够在分布式环境下生成全局唯一ID的方法。ZooKeeper生成的全局唯一的ID不同于UUID(Universally Unique
Identifier,通用唯一标识码)。

04、分布式协调/通知

分布式协调/通知服务时分布式系统中不可缺少的一个环节,是将不同的分布式组件有机结合起来的关键所在。对于一个在多台机器上部署运行的应用而言,通常需要一个协调者(Coordinator)来控制整个系统的运行流程,例如分布式事务的处理、机器间的互相协调等。同时,引入这样一个协调者,便于将分布式协调的职责从应用中分离出来,从而可以大大减少系统之间的耦合性,而且能够显著提高系统的可扩展性。

不同的客户端都会ZooKeeper上同一个数据节点进行Watcher进行注册,监听数据节点的变化(包括数据节点本身及其子节点),如果数据节点发生变化,那么所有订阅的客户端都能够接收到相应的Watcher通知,并做出相应的处理。

热备份:将同一个复制任务部署到不同的主机上。

冷备份:Core进行被配置了所属Group(组),Core进程启动后,到对应的Group下面获取所有的Task列表,遍历instances节点,如果没有子节点,则创建一个临时的顺序节点,顺序小的Core进程将自己标记为RUNNING,其他Core进程则会自动将自己创建的子节点删除,然后遍历下一个Task节点。

热备份好在实时性,冷备份好在节省机器资源。

05、集群管理

所谓集群管理,包括集群监控与集群控制两大块,前者侧重对集群运行时状态的采集,后者则是对集群进行操作与控制。

分布式日志收集系统:

关键在于如何快速、合理、动态地为每个收集器分配对应的日志源机器。

每个收集器机器在创建完自己的专属节点后,还需要在对应的子节点上创建一个状态子节点,每个收集器机器都需要定期向该节点写入自己的状态信息。我们可以把这种策略看作是一种心跳检测机制,通常收集器机器都会在这个节点中写入日志收集进度信息。日志系统根据该状态子节点的最后更新时间来判断对应的收集器机器是否存活。

一旦检测到有收集器机器停止汇报或是有新的收集器机器加入,就要开始进行任务的重新分配。日志系统需要将之前分配给该收集器的所有任务转移。通常有两种做法:全局动态分配和局部动态分配。

06、Master选举

分布式最核心的特性就是能够将具有独立计算能力的系统单元部署在不同的机器上,构成一个完整的分布式系统。而与此同时,实际场景中往往需要在这些分布在不同机器上的独立系统单元中选出一个所谓的“老大”,在计算机科学中,我们称之为Master。

让集群中的部分,甚至只让其中的一台机器去处理数据计算,一旦计算出数据结果,就可以共享给整个集群中的其他所有客户机器。具体来说,应该是将计算结果放置在一个内存/数据库中,同时,Master通知集群中其他所有的客户端从这个内存/数据库中共享计算结果。

在保证全局一致性的要求下,谁成功创建节点,谁就是Master,其他的客户端都要过来注册节点。

07、分布式锁

如果不同系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要通过一些互斥手段来防止彼此之间的干扰,以保证一致性,这种情况下,就需要使用分布式锁了。

排他锁(Exclusive Locks,简称X锁),又称为写锁或独占锁,是一种基本的锁类型。如果事务T1对数据对象O1加了排他锁,那么在整个加锁期间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能再对这个数据对象进行任何类型的操作——直到T1释放了排他锁。

共享锁(Shared Locks,简称S锁),又称为读锁,同样是一种基本的锁类型。如果事务T1对数据对象O1加上了共享锁,那么当前事务只能对O1进行读取操作,其他事务只能对这个数据对象家共享锁——直到该数据对象上的所有共享锁都被释放。

ZooKeeper中数据节点来表示一个锁,核心逻辑是:判断自己是否是是所有子节点中序号最小的。

改进后的分布式锁:只关注比自己序号小的那个相关节点的变更情况。

08、分布式队列

分布式队列(类似于消息中间件,或称为消息队列),简单地讲分为两大类,一种是常规的先入先出队列,另一种是要等到队列元素集聚之后才统一安排执行的Barrier模型。

先入先出:创建完节点之后,需要向比自己序号小的最后一个结点注册Watcher监听。

Barrier分布式屏障:将/queue_barrier节点的数据内容赋值为一个数字n来代表Barrier值,只有/queue_barrier节点下的子节点个数达到10后,才会打开Barrier。

你可能感兴趣的:(分布式)