6. 注册健康检查

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

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

定义检查

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

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

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

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

vagrant@n2:~$ echo '{"check": {"name": "ping",
  "args": ["ping", "-c1", "baidu.com"], "interval": "30s"}}' \
  >/etc/consul.d/ping.json

vagrant@n2:~$ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80,
  "check": {"args": ["curl", "localhost"], "interval": "10s"}}}' \
  >/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 重载配置,你会看到:

==> Starting Consul agent...
...
    [INFO] agent: Synced service 'web'
    [INFO] agent: Synced check 'service:web'
    [INFO] agent: Synced check 'ping'
    [WARN] Check 'service:web' is now critical

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

检查健康状态

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

vagrant@n1:~$ curl http://localhost:8500/v1/health/state/critical
[
    {
        "Node": "agent-two",
        "CheckID": "service:web",
        "Name": "Service 'web' check",
        "Status": "critical",
        "Notes": "",
        "ServiceID": "web",
        "ServiceName": "web",
        "ServiceTags": [
            "rails"
        ]
    }
]

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

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

dig @127.0.0.1 -p 8600 web.service.consul
...

;; QUESTION SECTION:
;web.service.consul.        IN  A

Last updated