6. 注册健康检查

我们已经学会了如何简单地运行 Consul、添加节点和服务、查询节点和服务。本节,我们将继续学习如何为节点和服务添加健康检查。健康检查是服务发现的重要部分,可以一定程度避免服务瘫痪。

本节内容基于前面构建的 Consul 集群,请保证你现在运行着一个双节点集群。

定义检查

和服务一样,健康检查也可以通过提供检查定义文件或者通过 HTTP API 进行注册。

我们仍然使用定义文件的通用办法。

在 Consul 0.9.0 和之后的版本中,agent 必须设置 enable_script_checks 为 true 才能启用脚本检查。

分别为两个节点创建一个配置文件:

  1. vagrant@n2:~$ echo '{"check": {"name": "ping",
  2. "args": ["ping", "-c1", "baidu.com"], "interval": "30s"}}' \
  3. >/etc/consul.d/ping.json
  4. vagrant@n2:~$ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80,
  5. "check": {"args": ["curl", "localhost"], "interval": "10s"}}}' \
  6. >/etc/consul.d/web.json

第一个定义添加了一个名为“ping”的主机级别检查,该检查每 30 秒运行一次 ping -c1 baidu.com。对于基于脚本 sccript 的健康检查,它的运行时用户和运行 Consul 进程的是同样的。如果退出代码 ≥2,检查会标记为 failing,服务会被标记为不健康;退出代码为 1 则会触发 warning 状态。参见 script 检查

第二个命令修改服务名“web”,添加了一个每 10 秒的 curl 验证请求来检查服务是否可用。和主机级别检查一样,如果脚本返回代码 ≥2,检查会标记为 failing,服务标记为不健康。

现在重启第二个 agent,用 consul reloadSIGHUP 重载配置,你会看到:

  1. ==> Starting Consul agent...
  2. ...
  3. [INFO] agent: Synced service 'web'
  4. [INFO] agent: Synced check 'service:web'
  5. [INFO] agent: Synced check 'ping'
  6. [WARN] Check 'service:web' is now critical

前面几行表示服务已同步,最后一行表示 web 服务处于崩溃状态。因为我们没有真的运行一个 web 服务器,所以 curl 测试当然会失败。

检查健康状态

对于这两个简单的检查,可以使用 HTTP API 查看状态。首先来看看哪些服务崩溃了(当然,任何节点上执行都是可以的):

  1. vagrant@n1:~$ curl http://localhost:8500/v1/health/state/critical
  2. [
  3. {
  4. "Node": "agent-two",
  5. "CheckID": "service:web",
  6. "Name": "Service 'web' check",
  7. "Status": "critical",
  8. "Notes": "",
  9. "ServiceID": "web",
  10. "ServiceName": "web",
  11. "ServiceTags": [
  12. "rails"
  13. ]
  14. }
  15. ]

可以看到只有一个 web 服务处于 critical 状态。

另外,还可以用 DNS 来查询这个 web 服务。Consul 会返回空结果,因为服务处于不健康状态:

  1. dig @127.0.0.1 -p 8600 web.service.consul
  2. ...
  3. ;; QUESTION SECTION:
  4. ;web.service.consul. IN A