2. 运行 Consul Agent
安装完 Consul 后应该运行 agent,它可以运行在服务端(server)或者客户端(client)模式下。每个数据中心(datacenter)都至少有一个 server,推荐一个集群(cluster)至少有 3 到 5 个 server。因为在故障情况下数据丢失是不可避免的,所以强烈建议不要单机部署。
其他 agent 运行在 client 模式,它是一个轻量级进程,提供服务注册、健康检查和服务器间的查询转发。集群的所有节点都应运行一个 agent。
关于如何启动数据中心,请见进阶教程(一)。
启动 Agent
简单起见,我们用开发模式启动 Consul agent,该模式可以快速便捷地创建好单节点 Consul 环境。请不要将开发模式用在生产环境上,因为它不会保存任何状态。
$ 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.12016/09/15 10:21:10 [INFO] serf: EventMemberJoin: Armons-MacBook-Air.dc1 127.0.0.12016/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:523692016/09/15 10:21:13 [DEBUG] http: Request GET /v1/agent/services (15.548µs) from=127.0.0.1:523692016/09/15 10:21:17 [WARN] raft: Heartbeat timeout from "" reached, starting election2016/09/15 10:21:17 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 22016/09/15 10:21:17 [DEBUG] raft: Votes needed: 12016/09/15 10:21:17 [DEBUG] raft: Vote granted from 127.0.0.1:8300 in term 2. Tally: 12016/09/15 10:21:17 [INFO] raft: Election won. Tally: 12016/09/15 10:21:17 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state2016/09/15 10:21:17 [INFO] consul: cluster leadership acquired2016/09/15 10:21:17 [DEBUG] consul: reset tombstone GC to index 32016/09/15 10:21:17 [INFO] consul: New leader elected: Armons-MacBook-Air2016/09/15 10:21:17 [INFO] consul: member 'Armons-MacBook-Air' joined, marking health alive2016/09/15 10:21:17 [INFO] agent: Synced service 'consul'
如你所见,Consul agent 启动输出了一些日志数据。你可以看到 agent 运行在 server 模式下,并成为该集群的 leader。另外,本地成员被标记为了该集群的健康成员。
集群成员
你可以通过 consul members 命令查看 Consul 集群的成员。现在你只能看到一个成员,下一节会介绍如何加入集群:
$ consul membersNode Address Status Type Build Protocol DC SegmentArmons-MacBook-Air 127.0.0.1:8301 alive server 1.4.0 2 dc1 <all>
输出的是我们自己的节点,包括它的运行地址、健康状态、在集群的角色和版本信息。更多数据可以用 -detailed 参数获取。
命令 members 的输出基于 gossip 协议,它们是“结果一致”。这意味着,在此时,你从屏幕上看到的节点状态不一定是 server 节点的真实状态。如果想要更健壮的一致性视图,请使用 HTTP API 来请求 Consul 服务器:
$ curl localhost:8500/v1/catalog/nodes[{"ID": "bac74f08-b3c0-e37e-c644-92f394659196","Node": "Armons-MacBook-Air","Address": "127.0.0.1","Datacenter": "dc1","TaggedAddresses": {"lan": "127.0.0.1","wan": "127.0.0.1"},"Meta": {"consul-network-segment": ""},"CreateIndex": 7,"ModifyIndex": 7}]
作为 HTTP API 的补充,DNS 接口可以用于查询节点。注意,你需要保证你的 DNS 查询通过 Consul agent 默认运行在 8600 端口的 DNS 服务。稍后将详细介绍这些 DNS 项的含义。
$ dig @127.0.0.1 -p 8600 Armons-MacBook-Air.node.consul;; QUESTION SECTION:;Armons-MacBook-Air.node.consul. IN A;; ANSWER SECTION:Armons-MacBook-Air.node.consul. 0 IN A 127.0.0.1
停止 Agent
你可以直接用 Ctrl-C 来平滑退出,你将会看到它离开集群并关闭。
通过平滑退出,Consul 会通知其他节点该节点已离开(left)。如果你强行杀死 agent 进程,其他集群成员将会检测到该节点失败(failed)。成员 left 后,它的服务和检查也将会从 catalog 中移除。成员失败后,健康检查会标记为崩溃,但并不会移除 catalog。Consul 会自动尝试重连 faild 节点,以免在不稳定网络环境下失效;而 left 的节点将不会再被联络。
另外,如果 agent 是 server 模式,将会通过共识协议来避免潜在的服务中断。参见进阶教程(二)了解如何添加和移除服务。
