我们已经启动了第一个Agent,并且在这个Agent上注册和查询了一个服务。这已经显示出使用Consul是相当的容易,但是还没有展现出这如何扩展为一个可伸缩的、生产级的服务发现基础设施。在这一步,我们将使用多个成员创建第一个真正的集群。
当一个Consul Agent启动后,它没有任何其它节点的知识:它是一个孤立的集群。想了解其它的集群成员,Agent必须加入一个已经存在的集群。要加入已经存在的集群,它只需要知道一个已经存在的成员。Agent加入后,它将通过流言协议和这个成员进行交流,并很快的发现集群中的其它成员。Consul Agent可以加入任何一个其它的Agent,不只是Server模式的Agent。
启动Agent
为了模拟一个更真实的集群,我们将通过Vagrant启动一个有两个节点的集群。
我们首先启动两个节点:
$ vagrant up
一旦系统可用了,我们可以SSH进入他们来配置我们的集群。我们先来登入第一个节点:
$ vagrant ssh n1
在我们之前的例子中,我们使用-dev参数来快速的创建开发服务器。然而,在一个集群化的环境中这是不够用的。从现在起我们将不再使用-dev参数,取而代之的是下边列出的集群参数。
集群中的每个节点必须要有一个唯一的名字。默认情况下,Consul使用机器的主机名,但是我们可以通过使用-node命令行选项来手动的设置它。
我们将指定一个绑定地址:这是Consul的监听地址,它必须可以被集群中的其它所有节点访问。虽然绑定地址并不是严格的需要(Consul将默认监听系统中的第一个私有IP),但是最好还是提供一个。生产服务器通常有多个接口,所以指定一个绑定地址可以确保你没有绑定Consul到一个错误的接口。
第一个节点将作为这个集群中的唯一Server,我们将使用server开关来标识它。
-bootstrap-expect参数告诉Consul Server预定将要加入的其它服务节点的数量。这个参数的目的是延迟复制日志的启动直到预料数量的Server节点已经成功加入。你可以在bootstrapping指南了解更多关于这个的内容。
最后,我们添加一个config-dir参数,标识可以在哪里找到服务和检查的定义。
这些设置集合起来将产生一个Consul Agent命令,像这样:
vagrant@n1:~$ consul agent -server -bootstrap-expect 1 \ -data-dir /tmp/consul -node=agent-one -bind=172.20.20.10 \ -config-dir /etc/consul.d ...
现在,使用另一个终端,我们可以连接到第二个节点:
$ vagrant ssh n2
这次,我们设置绑定地址切换到匹配第二个节点的IP(Vagrantfile指定的),并且这个节点名字是agent-two。因为这个节点将不是一个Consul Server,所以我们不需要提供server开关。
这些设置集合起来将产生一个Consul Agent命令,像这样:
vagrant@n2:~$ consul agent -data-dir /tmp/consul -node=agent-two \ -bind=172.20.20.11 -config-dir /etc/consul.d ...
在这个节点,你已经有两个Consul Agent在运行:一个Server和一个Client。这两个Agent仍旧相互不知,只是他们各自单节点集群的一部分。你可以通过在每个Agent上运行consul members命令来进行验证,并注意到对每个Agent只有一个成员可见。
加入Cluster
现在,我们将告诉第一个Agent来加入第二个Agent,通过在一个新的终端运行如下的命令:
$ vagrant ssh n1 ... vagrant@n1:~$ consul join 172.20.20.11 Successfully joined cluster by contacting 1 nodes.
你应该在每个Agent日志中看到一些日志输出,如果你细心阅读,你将会看到他们收到join的一些信息。如果你在每个Agent运行consul members命令,你将会看到所有节点现在是互知的了:
vagrant@n2:~$ consul members Node Address Status Type Build Protocol agent-two 172.20.20.11:8301 alive client 0.5.0 2 agent-one 172.20.20.10:8301 alive server 0.5.0 2
记住:要加入一个集群,Consul Agent只需要知道一个已经存在的成员。加入集群后,这个Agent将和其它节点聊天来传播完整的成员信息。
启动时自动加入集群
理想情况下,当一个新的节点在你的数据中被创建,它应该自动的加入Consul集群,而不需要人工干预。为了达到这个目的,你可以使用Atlas和-atlas-join参数,下边是一个配置的示例:
$ consul agent -atlas-join \ -atlas=ATLAS_USERNAME/infrastructure \ -atlas-token="YOUR_ATLAS_TOKEN"
要获取Atlas用户名和令牌,首先创建一个账号,然后使用你的凭据替换Consul配置中相应的值。现在,无论什么时候一个新的节点作为Consul Agent出现,他将会自动的加入你的Consul集群而不需要硬编码配置。
此外,你可以在启动时加入一个集群,通过使用-join参数或start_join设置硬编码其它已知的Consul Agent地址。
查询节点
就像查询服务,Consul有一个API来查询节点。你可以通过DNS或者HTTP API来干这件事。
对于DNS API,name的结构是NAME.node.consul或者Name.node.DATACENTER.consul。如果忽略datacenter,Consul将只在数据中心查找。
举个例子,在“agent-one”,我们可以查询节点“agent-two”的地址:
vagrant@n1:~$ dig @127.0.0.1 -p 8600 agent-two.node.consul ... ;; QUESTION SECTION: ;agent-two.node.consul. IN A ;; ANSWER SECTION: agent-two.node.consul. 0 IN A 172.20.20.11
除了服务查找,节点查找的能力对于系统管理任务也是很有用的。例如,知道该节点的地址进行SSH登入将像标记该节点作为Consul集群的一部分并查询它一样容易。
离开集群
要离开集群,你既可以优雅地退出一个Agent(使用Ctrl-C),也可以强制杀死一个Agent。优雅地离开允许节点转变为left状态;否则其它节点将会检测到它并标记为failed状态。这两点不同的详细介绍在这里。
下一步
我们已经有一个包含多个节点的Consul集群建立和运行。让我们通过健康检查来使我们的服务更加健壮!
本文暂时没有评论,来添加一个吧(●'◡'●)