2. 运行 Consul Agent

安装完 Consul 后应该运行 agent,它可以运行在服务端(server)或者客户端(client)模式下。每个数据中心(datacenter)都至少有一个 server,推荐一个集群(cluster)至少有 3 到 5 个 server。因为在故障情况下数据丢失是不可避免的,所以强烈建议不要单机部署。

其他 agent 运行在 client 模式,它是一个轻量级进程,提供服务注册、健康检查和服务器间的查询转发。集群的所有节点都应运行一个 agent。

关于如何启动数据中心,请见进阶教程(一)

启动 Agent

简单起见,我们用开发模式启动 Consul agent,该模式可以快速便捷地创建好单节点 Consul 环境。请不要将开发模式用在生产环境上,因为它不会保存任何状态。

  1. $ consul agent -dev
  2. ==> Starting Consul agent...
  3. ==> Starting Consul agent RPC...
  4. ==> Consul agent running!
  5. Version: 'v0.7.0'
  6. Node name: 'Armons-MacBook-Air'
  7. Datacenter: 'dc1'
  8. Server: true (bootstrap: false)
  9. Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
  10. Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
  11. Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
  12. ==> Log data will now stream in as it occurs:
  13. 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}]
  14. 2016/09/15 10:21:10 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
  15. 2016/09/15 10:21:10 [INFO] serf: EventMemberJoin: Armons-MacBook-Air 127.0.0.1
  16. 2016/09/15 10:21:10 [INFO] serf: EventMemberJoin: Armons-MacBook-Air.dc1 127.0.0.1
  17. 2016/09/15 10:21:10 [INFO] consul: Adding LAN server Armons-MacBook-Air (Addr: tcp/127.0.0.1:8300) (DC: dc1)
  18. 2016/09/15 10:21:10 [INFO] consul: Adding WAN server Armons-MacBook-Air.dc1 (Addr: tcp/127.0.0.1:8300) (DC: dc1)
  19. 2016/09/15 10:21:13 [DEBUG] http: Request GET /v1/agent/services (180.708µs) from=127.0.0.1:52369
  20. 2016/09/15 10:21:13 [DEBUG] http: Request GET /v1/agent/services (15.548µs) from=127.0.0.1:52369
  21. 2016/09/15 10:21:17 [WARN] raft: Heartbeat timeout from "" reached, starting election
  22. 2016/09/15 10:21:17 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 2
  23. 2016/09/15 10:21:17 [DEBUG] raft: Votes needed: 1
  24. 2016/09/15 10:21:17 [DEBUG] raft: Vote granted from 127.0.0.1:8300 in term 2. Tally: 1
  25. 2016/09/15 10:21:17 [INFO] raft: Election won. Tally: 1
  26. 2016/09/15 10:21:17 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state
  27. 2016/09/15 10:21:17 [INFO] consul: cluster leadership acquired
  28. 2016/09/15 10:21:17 [DEBUG] consul: reset tombstone GC to index 3
  29. 2016/09/15 10:21:17 [INFO] consul: New leader elected: Armons-MacBook-Air
  30. 2016/09/15 10:21:17 [INFO] consul: member 'Armons-MacBook-Air' joined, marking health alive
  31. 2016/09/15 10:21:17 [INFO] agent: Synced service 'consul'

如你所见,Consul agent 启动输出了一些日志数据。你可以看到 agent 运行在 server 模式下,并成为该集群的 leader。另外,本地成员被标记为了该集群的健康成员。

集群成员

你可以通过 consul members 命令查看 Consul 集群的成员。现在你只能看到一个成员,下一节会介绍如何加入集群:

  1. $ consul members
  2. Node Address Status Type Build Protocol DC Segment
  3. Armons-MacBook-Air 127.0.0.1:8301 alive server 1.4.0 2 dc1 <all>

输出的是我们自己的节点,包括它的运行地址、健康状态、在集群的角色和版本信息。更多数据可以用 -detailed 参数获取。

命令 members 的输出基于 gossip 协议,它们是“结果一致”。这意味着,在此时,你从屏幕上看到的节点状态不一定是 server 节点的真实状态。如果想要更健壮的一致性视图,请使用 HTTP API 来请求 Consul 服务器:

  1. $ curl localhost:8500/v1/catalog/nodes
  2. [
  3. {
  4. "ID": "bac74f08-b3c0-e37e-c644-92f394659196",
  5. "Node": "Armons-MacBook-Air",
  6. "Address": "127.0.0.1",
  7. "Datacenter": "dc1",
  8. "TaggedAddresses": {
  9. "lan": "127.0.0.1",
  10. "wan": "127.0.0.1"
  11. },
  12. "Meta": {
  13. "consul-network-segment": ""
  14. },
  15. "CreateIndex": 7,
  16. "ModifyIndex": 7
  17. }
  18. ]

作为 HTTP API 的补充,DNS 接口可以用于查询节点。注意,你需要保证你的 DNS 查询通过 Consul agent 默认运行在 8600 端口的 DNS 服务。稍后将详细介绍这些 DNS 项的含义。

  1. $ dig @127.0.0.1 -p 8600 Armons-MacBook-Air.node.consul
  2. ;; QUESTION SECTION:
  3. ;Armons-MacBook-Air.node.consul. IN A
  4. ;; ANSWER SECTION:
  5. 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 模式,将会通过共识协议来避免潜在的服务中断。参见进阶教程(二)了解如何添加和移除服务。