分布式协调服务的存在意义

时间:2022-10-24 18:01:43

分布式协调服务是分布式应用中不可缺少的,通常担任协调者的角色,比如leader选举、负载均衡、服务发现、分布式队列和分布式锁等,这里以leader选举和负载均衡为例,说明分布式协调服务的存在意义及基本职责。

1、leader选举

在分布式系统中,常见的一种软件设计架构为master/slave,如下图所示,其中master负责集群管理,slave负责执行具体的任务(比如存储数据、处理数据)。这种架构存在一个明显缺陷:master是单点。为了避免master出现故障导致整个集群不可用,常见的优化方式是引入多master,比如双master:active master和standby master,其中active master对外提供服务,而standby master则作为备用master,一直处于“待命”状态,一旦active master出现故障,自己则切换为active master。

分布式协调服务的存在意义

引入双master需要解决如下两个难题:

1)如何选举出一个master作为active master?不能引入不可靠的第三方组件进行选举,否则又再次引入了一个存在单点故障的服务。一种常见的解决思路是实现Paxos一致性协议,让多个对等的服务通过某个方式达成一致性,从而选举出一个master。

2)如何发现active master出现故障,如何让standby master安全切换为active master?该问题的难点在于如何避免出现脑裂(split-brain),即集群中同时存在两个active master,造成数据不一致或集群出现混乱的现象。

几乎所有采用master/slave架构的分布式系统均存在以上问题,为了避免每个分布式系统单独开发这些功能造成工作冗余,构造一个可靠的协调服务势在必行。该协调服务需具备leader(master)选举和服务状态获取等基本功能。

2、负载均衡

在类似于Kafka的分布式消息队列中,生产者将数据写入分布式队列,消费者从分布式消息队列中读取数据进行处理,为了实现该功能,需要从架构上解决以下两个问题:

分布式协调服务的存在意义

1)生产者和消费者如何获知最新的消息队列位置?

消息队列是分布式的,通常由一组节点构成,这些节点的健康状态是动态变化的,比如某个节点因机器故障变得对外不可用,如何让生产者和消费者动态获知最新的消息队列节点位置是必须要解决的问题。

2)如何让生产者将数据均衡地写入消息队列中各个节点?

消息队列提供了一组可存储数据的节点,需让生产者及时了解各个存储节点的负载,以便智能决策将数据均衡地写入这些节点。

为了解决以上两个问题,需要引入一个可靠的分布式协调服务,它具备简单的元信息存储和动态获取服务状态等基本功能。

通过leader选举和负载均衡两个常见的分布式问题,我们可以了解到,协调服务对于一个分布式系统而言多重要。为了解决服务协调这一类通用问题,ZooKeeper出现了,它将服务协调的职责从分布式系统中独立出来,以减少系统的耦合性和增强扩充性。