引言
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案, consu1 的方案更“一站式”,内置了服务注册 与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等。使用起来也较为简单。Consul 用 Golang 实现,因此具有天然可移植性(支持 Linux、windows 和 Mac Os X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。其一致 性协议采用 Raft 算法,用来保证服务的高可用。使用 GOSSIP 协议管理成员和广播消息,并且支持ACL 访问控制。
值得一提的是,命令行超级好用的虚拟机管理软件 grant 也是 HashiCorp 公司开发的产品
Consul 的使用场景
- 服务通信地址域名化,动态迁移服务
- SaaS 应用的服务发现与配置共享
- 与 consul-template 服务集成,动态生成 nginx 和 haproxy 配置文件
Consul 的优势
- 使用 Raft 算法来保证一致性,比复杂的 Paxos 算法更直接
- 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障而其部署则需要考虑网络延迟,分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持
- 支持健康检查,Etcd 不提供此功能
- 支持 HTTP 和 DNS 协议接口,Zookeeper 的集成较为复杂,Etcd 只支持 HTTP 协议
- 官方提供 Web 管理界面,Etcd 无此功能
相关术语
- agent**:运行在 consul集群所有节点上的核心服务,其可运行在 client 或 server 模式,通过consul agent 命令来启动。由于所有节点必须运行 agent,指定节 点运行于 client 或者server 模式是很简单地,除非有其它的 agent 实例。所有的 agent 都能运行 DNS 或者HTTP 接口,并负责运行时检查和保持服务同步。
- client:一个 client 是一个转发所有 RPC到 server 的 agent 。这个 client 是相对无状态的。client 唯一执行的后台活动是加入 LAN gossip 池。这有一个最低的 资源开销并且仅消耗少量的网络带宽。
- server:一个 server 是一个有一组扩展功能的 agent,这些功能包括 参与 Raft 选举,维护集群状态,响应 RPC 查询,与其他数据中心交互 WAN gossip 和转发 查询给 leader 或者远程数据中心。每个数据中心至少有一个 agent 运行在 server 模式,推荐为 3 个或 5个
- DataCenter:虽然数据中心的定义是显而易见的,但是有一些细微的细节必须考虑。例如,在EC2 中,多个可用区域被认为组成一个数据中心?我们定义数据中心 为一个私有的,低延迟和高带宽的一个网络环境。这不包括访问公共网络,但是对于我们而言,同一个 EC2 中的多个可用区域可以被认为是一个数据中心的一部分。
- Consensus:在我们的文档中,我们使用 Consensus 来表明就 leader 选举和事务的顺序达成一致。由于这些事务都被应用到有限状态机上,Consensus 暗示 复制 状态机的一致性。
- Gossip:Consul 建立在 Serf 的基础之上,它提供了一个用于多播目的的完整的 gossip 协议Serf 提供 成员关系,故障检测和事件广播。更多的信息在 gossip 文档中描述。这足以知道gossip 使用基于 UDP 的随机的点到点通信
- LAN Gossip:它包含所有位于同一个局域网或者数据中心的所有节点
- WAN Gossip:它只包含 Server。这些 server 主要分布在不同的数据中心并且通常通过因特网或者广域网通信。
- RPC:远程过程调用。这是一个允许 client 请求 server 的请求/响应机制。
Consul 的架构
上图中我们能看到有两个数据中心,标记为“DATACENTER1”和“DATACENTER2”。Consul对多数据中心有一流的支持并且希望这是一个常见的情况。
在每个数据中心,client 和 server 是混合的。一般建议有 3-5 台 server。这是基于有故障情况下的可用性和性能之间的权衡结果,因为越多的机器加入达成共识越慢。然而,并不限制client 的数量,它们可以很容易的扩展到数千或者数万台。
同一个数据中心的所有节点都必须加入 gossip 协议。这意味着 gossip 协议包含一个给定数据中心的所有节点。这服务有几个目的:
- 第一:不需要在 client 上配置 server 地址。发现都是自动完成的
- 第二:检测节点故障的工作不是放在 server上,而是分布式的。这是的故障检测相比心跳机制有更高的可扩展性
- 第三:它用来作为一个消息 层来通知事件,比如 leader 选举发生时。
每个数据中心的 server 都是 Raft 节点集合的一部分。这意味着它们一起工作并选出一个 leader,一个有额外工作的 server。leader 负责处理所有的查询和事务。作为一 致性协议的一部分,事务也必须被复制到所有其他的节点。因为这一要求,当一个非 leader 的 server 收到一个 RPC 请求时,它将请求转发给集群 leader。
server 节点也作为 WAN gossip Pool 的一部分。这个 Pool不同于 LAN Pool,因为 它是为了优化互联网更高的延迟,并且它只包含其他 Consul server 节点。 这个 Po 的的是为了允许数据中心能够以 low-touch 的方式发现彼此。这使得一个新的数据中心可以很容易的加入现存的 WAN gossip。因为server 都运行在这个 pool 中,它 也支持跨数据中心请求。当一个 server 收到来自另一个数据中心的请求时,它随即转发给正确数据中心的一个 server。该 server 再转发给本地 leader。
这使得数据中心之间只有一个很低的合,但是由于故障检测,连接缓存和复用,跨数据中心的请求都是相对快速和可靠的。