Consul 是一个用于实现分布式系统的服务发现与配置的开源工具。与其他分布式服务注册与发现的方案相比,Consul 的方案更“一站式”,它内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具。
Consul 架构
在描述体系结构之前,先了解下 Consul 术语表,以帮助澄清所讨论的内容:Agent - 是 Consul 集群中每个成员上的长时间运行的守护进程,可以通过 consul agent 命令启动它。agent 可以在 client 或 server 模式下运行。所有 agent 都可以运行 DNS 或 HTTP 接口,并负责运行检查和保持服务同步。
Client - 是将所有 RPCs 转发到 server 的 Agent,client 是相对无状态的。client 执行的唯一后台活动是参与 LAN gossip pool,这将减少资源开销,并且只消耗少量的网络带宽。
Server - 是一组具有扩展职责的 Agent,包括参与一致性判断(Raft quorum)、维护集群状态、响应 RPC 查询、与其他数据中心交换 WAN gossip 以及将查询转发给领导者(leaders)或远程数据中心。
Datacenter - 私有、低延迟和高带宽的网络环境。
Consensus(一致性) - Consul 使用 consensus protocol) 来提供 CAP(一致性,高可用,分区容错性)
Gossip - 一种协议,用来保证最终一致性,即:无法保证在某个时刻,所有节点状态一致,但可以保证“最终”一致
RPC - 远程过程调用,它是一种请求/响应机制,允许 client 向 server 发出请求。
Consul 的架构是这样的:
让我们分解这个图像,描述每一块。首先,我们可以看到有两个数据中心,标记为“1”和“2”。Consul 支持多数据中心,在每个数据中心中,我们有 client 和 server 的混合,推荐有 3 到 5 台 server,这就在故障情况下的可用性和性能之间取得了平衡,因为随着更多的机器被添加,将会变得越来越慢。然而,client 的数量是没有限制的,他们可以很容易地扩展到成千上万。
每个数据中心中的 server 都会一起来选出一个 leader(领导者);leader 是一个被选中的有额外职责的 server,负责处理所有查询和事务,当非 leader server 接收到 RPC 请求时,它将其转发给集群 leader。
安装
Consul 支持 Linux、Windows 和 Mac OS X 系统。它只是一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合 。
要安装 Consul,先找到适合你的系统的软件包并下载,下载后,解压压缩包即可。最后将 Consul 二进制文件所在的路径添加到环境变量 PATH 上。关于如何在 Linux 和 Mac 上设置 PATH ,请参阅本页。
安装 Consul 后,通过打开一个新的终端会话并检查 consul 是否可用,通过执行 consul ,你应该会看到类似这样的帮助输出:$ consul
usage: consul [--version] [--help] []
Available commands are:
agent Runs a Consul agent
event Fire a new event
# ...
启动 Consul
在 Consul 安装后,必须运行 agent,agent 可以在 server 模式或 client 模式下运行。每个数据中心必须至少有一台 Server,不过建议使用一个由 3 或 5台 server 组成的集群。不推荐只部署单个 server,因为在故障场景中数据丢失是不可避免的。
所有其他 agent 都在 client 模式下运行,client 是一个非常轻量级的进程,它注册服务、运行健康检查并将查询转发给 server。agent 必须在集群的每个节点上运行。
启动 Agent
为了简单起见,我们现在开始在开发模式中使用 Consul agent。它不能在生产环境中使用,因为它不持久化任何状态。-$ consul agent -dev
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
Version: 'v0.7.0'
Node name: 'Armons-MacBook-Air'
Datacenter: 'dc1'
Server: true (bootstrap: false)
Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
==> Log data will now stream in as it occurs:
2016/09/15 10:21:10 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:127.0.0.1:8300 Address:127.0.0.1:8300}]
2016/09/15 10:21:10 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
2016/09/15 10:21:10 [INFO] serf: EventMemberJoin: Armons-MacBook-Air 127.0.0.1
2016/09/15 10:21:10 [INFO] serf: EventMemberJoin: Armons-MacBook-Air.dc1 127.0.0.1
2016/09/15 10:21:10 [INFO] consul: Adding LAN server Armons-MacBook-Air (Addr: tcp/127.0.0.1:8300) (DC: dc1)
2016/09/15 10:21:10 [INFO] consul: Adding WAN server Armons-MacBook-Air.dc1 (Addr: tcp/127.0.0.1:8300) (DC: dc1)
2016/09/15 10:21:13 [DEBUG] http: Request GET /v1/agent/services (180.708µs) from=127.0.0.1:52369
2016/09/15 10:21:13 [DEBUG] http: Request GET /v1/agent/services (15.548µs) from=127.