CONSUL架构


Consul是一个复杂的系统,有许多不同的活动部件。这里将从Consul工作的内在模型开始,来帮助用户和开发人员。这篇文章将介绍系统架构。

高级主题!本文将介绍Consul内部的技术细节,对于实际操作和使用Consul,你不需要知道这些细节。这些细节记录在这里为那些希望了解它们的人,小伙伴们不必再去探索源代码。

术语

在开始描述架构之前,我们先提供一个术语词汇表,以帮助理清将要讨论的内容:

Agent - Agent是在Consul集群的每个成员之上长期运行的一个守护进程。它通过运行consul agent启动。Agent可以运行在客户端或者服务器模式下。由于所有的节点都必须运行一个Agent,指定节点作为客户端或者服务器是简单的,但也有其它的Agent实例。所有的节点都可以运行DNS和HTTP接口,以及负责运行健康检查和保持服务同步。

Client - Client是转发所有RPC到Server节点的Agent。Client是相对无状态的。Client执行的唯一的后台活动是参与局域网的流言池。这只有一个很小的资源开销,并且只消耗少量的网络带宽。

Server - Server是具备一组扩展职责的Agent,包括:参与Raft法定人数,维护集群状态,响应RPC请求,与其它数据中心交换广域网流言,以及转发请求到leader或者远程数据中心。

数据中心 - 虽然数据中心的定义看起来很明显,但是有一些微妙的细节必须考虑。例如,在EC2中,是否可以考虑多个可用区组成一个数据中心?我们定义一个数据中心是一个私有的、低延迟,以及高带宽的网络环境。这排除了通信需要通过公共因特网进行的,因此对我们而言,一个EC2区域中的多个可用区可以被认为是一个数据中心的多个部分。

一致性 - 当在我们的文档中使用这个词时,一致既意味着在leader选举时达成一致,还代表在事务处理上达成一致。因为这些事务被应用到有限状态机,这里的一致性定义意味着状态机复制的一致性。一致性在维基百科中有详细的描述,我们的实现在这里有描述。

流言 - Consul构建于Serf之上,其提供了一个完整的流言协议支持,被用在多种用途。Serf提供成员管理、故障检测和事件广播。这些功能在流言文档中有详细描述。这里只要知道流言主要通过UDP进行随机的点对点通信就可以了。

局域网流言 - 指包含位于同一局域网或数据中心的所有节点的局域网流言池。

广域网流言 - 指仅包含Server节点的广域网流言池。这些Server位于不同的数据中心,通常通过因特网或广域网进行通信。

RPC - 远程过程调用。这是一种允许客户端发送一个请求到服务端的请求/响应机制。

整体架构

从高层次上看Consul的架构是这样的:

让我们分开来看一下每一部分。首先,我们看到有两个数据中心,标记为“1”和“2”。Consul对多数据中心的支持是一流的,它预料这是一种常见的场景。

在每个数据中心,Client和Server是混合存在的。Server的数量一般是3-5个,这个数量会影响故障情况下的可用性和性能之间的平衡,因为越多的机器加入一致性处理就越慢。然而,Client的数量是没有限制的,它们可以容易的扩展到成千上万个。

某个数据中心下的所有节点都参与同一个流言协议,这意味着对一个指定的数据中心会有一个包含所有节点的流言池。流言提供了一些用途:首先,不需要使用Server的地址配置客户端,发现是自动的;其次,检测节点故障的工作没有被放置在Server上,而是分布式的,这让故障检测比简单的心跳方案更具伸缩性;再者,当重要的事件发生时它可以作为消息层用来发送通知,比如leader选举发生时。

每个数据中心下的Server都是一个Raft点集的部分。这意味着他们一起工作来选举一个leader,选中的Server有一些扩展的职责。leader负责处理所有的查询和事务,事务还必须被复制到参与一致性协议的所有对等点。考虑到这个要求,当一个非leader节点收到RPC请求时,它将转发这个请求到集群leader。

Server节点还作为广域网流言池的部分运行。这个池和局域网的池是不同的,它对因特网的高延迟专门做了优化,并要求只包含Server节点。这个池的目的是让数据中心通过低接触的方式发现彼此。让一个新的数据中心上线比较简单,只需要加入已经存在的广域网流言。因为Server都在这个池中运行,它也支持跨数据中心的请求。当一个Server收到一个对不同数据中心的请求时,它转发这个请求到相应数据中心的一个随机Server,这个Server可能需要再次转发到本地leader。

这将在数据中心之间产生一个非常低的耦合,但是考虑到故障检测、连接缓存和复用,跨数据中心的请求是相对快速和可靠的。

进一步深入

本文介绍了Consul的高层次架构,但是对于每个子系统仍有很多的细节。一致性协议流言协议已经详细记录,安全模型和协议的文档也是可用的。

对于其它细节,可以翻阅代码,在IRC中发问,或者加入邮件列表。