Consul Agent


Consul Agent是Consul的核心进程。Agent维护成员信息、注册服务、运行健康检查、响应查询等等更多功能。Agent必须运行在Consul集群的每一个节点。

Agent可以运行在两个模式中的一个:Client或者Server。Server节点承担作为一致性群体部分的额外责任。这些节点参与Raft并在故障的情况下提供强一致性和可用性。服务节点的更高负载意味着他们应该运行在专用的实例:他们比客户端节点需要更多的资源。客户端节点是集群中的大多数,他们非常轻量,因为他们大部分操作通过掉调用Server节点的接口完成,仅保持自己非常小的状态。

Running an Agent

通过consul agent命令我们可以启动一个Agent。这是一个同步命令它会一直运行下去直到被告知退出为止。Agent的命令行接受各种各样的配置参数,当然它们中的绝大多数都含有一个合理的默认值。

当执行consul agent命令时,你将会看到类似下面这样的输出:

$ consul agent -data-dir=/tmp/consul
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!

     Node name: 'Armons-MacBook-Air'
    Datacenter: 'dc1'
        Server: false (bootstrap: false)
   Client Addr: 127.0.0.1 (HTTP: 8500, DNS: 8600, RPC: 8400)
  Cluster Addr: 192.168.1.43 (LAN: 8301, WAN: 8302)
         Atlas: (Infrastructure: 'hashicorp/test' Join: true)
         
==> Log data will now stream in as it occurs:

[INFO] serf: EventMemberJoin: Armons-MacBook-Air.local 192.168.1.43
...

上面有一些consul agent命令非常重要的输出:

  • Node Name:这是该agent独有的名称。默认情况下,该名称即是当前机器的主机名(hostname),当然你也可以通过-node选项对其进行设置。
  • Datacenter:这是该agent运行在其上的数据中心的名称。Consul天生对多数据中心进行了支持;当然,为了更有效率的工作,每个节点必须被配置为可以报告自身所在数据中心的名称。-datacenter选项就是用来设置名称的。对于单数据中心的配置,默认值会是“dc1”。
  • Server:这指示了该agent是否运行在server模式下。一个server节点需要完成一些额外的任务比如consensus quorum,存储整个整个集群的状态信息,处理查询请求。另外,一个server节点还有可能处于“bootstrap”模式下。请注意,多个server不能都处于bootstrap模式因为这样会使得整个集群的状态不一致。
  • Client Addr:这是该agnet用于跟客户端进行交互的地址。可以通过多种接口与agent进行交互,包括HTTP,DNS以及RPC接口。其中RPC地址可以用来对agent执行查询或者控制的命令(比如consul members,consul join等等)。默认情况下,这些设置是仅仅绑定在本地的(即agent本地机器上)。如果你修改了其中的地址或者端口号,那么当其它客户端执行类似consul members命令时将需要设置-rpc-addr选项以指定如何找到远程agent。另外,其它的应用程序也可以通过RPC地址来与consul进行交互。
  • Cluster Addr:这是该agnet在集群中的地址。注意,并不是所有集群中的agent地址的端口号都需要设置一样,但是务必要保证该地址可以被集群中所有节点访问到。
  • Atlas:这显示了该节点注册在其上的Atlas infrastructure,同时指示了auto-join是否被打开。可以通过-atlas以及-atlas-join选项来分别设置Atlas infrastructure和auto-join。

Stopping an Agent

我们可以优雅的关闭一个agent也可以强制关闭一个agent。前者,可以通过向进程发送一个终止信号(这通常是在终端中输入Ctrl-C或者执行kill -INT consul_pid)。退出时,agent会首先告知集群其将要离开集群,通过这样的方式,其它集群中的成员通知集群该节点已经下线。

在另一种方式中你可以直接强制杀死agent进程。agent当然直接就退出了,剩下的集群中的成员最终(在一定时间内,通常是几秒钟之内)也可以知晓该节点已下线并告知集群该节点失效。