分布式协调服务的存在意义
分布式协调服务是分布式应用中不可缺少的,通常担任协调者的角色,比如 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 出现了,它将服务协调的职责从分布式系统中独立出来,以减少系统的耦合性和增强扩充性。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/5cc6edee8eb0c1f3506fe47e8】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论