建立集群
我们开始了第一个 agent 并且在 agent 上注册并查询了服务.这些展示了 Consul 是如何的易用.但是我们还不知道 Consul 如何进行扩容成一个可扩展,面向生成环境的服务发现架构.这一章我们将创建我们第一个拥有多个成员的真正的集群。
当一个 agent 启动时,他开始不知道其他节点的信息,他是一个成员的孤立集群.为了了解其他集群成员这个 agent 必须加入一个已经存在的集群.要加入一个已经存在的集群,只需要知道一个已经存在的集群成员.通过与这个成员的沟通来发现其他成员,Consul agent 可以加入任何 agent 而不只是出于 server 模式的 agent.
启动 Agent
>
官方版本教程里使用了 Vagrant 来启动虚拟机.我已经创建了多个虚拟机
因此跳过这部分
我们启动了另外的 2 台主机,10.0.0.53 ,10.0.0.54 和之前安装的方式一样,将 consul 拷贝到 PATH
目录完成安装。
在之前的示例中,我们使用了 -dev
参数来快速的创建一个开发模式的 server.然而这并不能充分的在集群环境下使用.现在我们将忽略掉 -dev
标签,用我们的集群选项来替换他。
每个集群中的节点都必须要一个唯一的名字.Consul 默认会使用机器的 hostname.我们可以使用 -node
手动覆盖他。
我们也可以使用 -bind 指定一个绑定的地址让 Consul 在这个地址上进行监听,这个地址必须可以被其他集群成员访问到.绑定地址不是必须提供,Consul 选择第一个私有 IP 进行监听,不过最好还是指定一个.生产环境的服务器通常有多个网络接口.所以指定一个不会让 Consul 绑错网络接口。
第一个节点将扮演集群的唯一 server,我们使用 -server
指定他。
-bootstrap-expect
选项提示 Consul 我们期待加入的 server 节点的数量.这个选项的作用是启动时推迟日志复制直到我们期望的 server 都成功加入时.你可以阅读 启动指南 了解更多。
最后,我们加入 config-dir
选项,指定服务和健康检查定义文件存放的路径。
加到一起,命令如下:
consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=hdp2 -bind=10.0.0.52 -config-dir /etc/consul.d
现在在另外一个终端,我们将连接第二个节点:
ssh hdp3
# 登录第二台机器
这一次我们设置绑定的 IP 地址为第二个节点的 IP 的地址,并指定节点名称.因为这个节点将不是 Consule 的 server.我们没有打开 server
开关.命令如下:
consul agent -data-dir /tmp/consul -node=hdp3 -bind=10.0.0.53 -config-dir /etc/consul.d
现在,你有运行了两个 Consul 的 agent,一个作为 server 另一个作为 client.这两个 agent 还互相不知道对方,只是作为独立的单节点集群.为了验证这个你可以在每个 agent 运行 consul member
,只能看到各自自己这一个集群成员。
加入一个集群
现在我们告诉第一个 agent 来加入第二个 agent,在新的终端运行如下命令
ssh hdp2
consul join 10.0.0.53
Successfully joined cluster by contacting 1 nodes.
>
如果出现
Error joining the cluster: dial tcp 10.0.0.53:8301: getsockopt: no route to host
可能是业务防火墙的原因,检查端口
8301
是否被允许
你应该可以看到在每个 agent 的日志输出窗口的一些输出.如果你仔细阅读会发现.他们收到了加入信息,如果你在每个 agent 运行 consul members
你会看到类似下面的内容:
[root@hdp2 ~]# consul members
Node Address Status Type Build Protocol DC
hdp2 10.0.0.52:8301 alive server 0.6.4 2 dc1
hdp3 10.0.0.53:8301 alive client 0.6.4 2 dc1
>
记住:为了加入集群,一个 Consul 的 agent 只需要了解一个已经存在的集群成员.加入集群后 agent 会自动交流传递完整的成员信息。
启动时自动加入集群
理想的情况,当一个新的节点在数据中心启动时,他应该自动加入到 Consul 的集群中,而不需要人为干预.为了达到这个效果你可以使用 HashiCorp 的 Atlas 和 -atlas-join
选项.示例如下:
consul agent -atlas-join \
-atlas=ATLAS_USERNAME/infrastructure \
-atlas-token="YOUR_ATLAS_TOKEN"
Atlas 的用户名和 token 可以通过创建 Atlas 账号获取.这样当新的节点启动后他会自动加入到你的 Consul 集群,不需要硬编码配置。
另一种选择,你可以通过 -join
选项和 start_join
配置将其他已知的 agent 的地址进行硬编码来在启动时加入集群。
查询节点
就像查询服务一样.Consul 有一个 API 用来查询节点自己.你可以通过 DNS 和 HTTP 的 API 来进行。
DNS API 中节点名称结构为 NAME.node.consul
或者 NAME.node.DATACENTER.consul
.如果数据中心名字省略,Consul 只会查询本地数据中心。
例如 从节点 hdp2
我们可以查询节点 hdp3
的地址:
[root@hdp2 ~]# dig @127.0.0.1 -p 8600 hdp3.node.consul
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> @127.0.0.1 -p 8600 hdp3.node.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5351
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;hdp3.node.consul. IN A
;; ANSWER SECTION:
hdp3.node.consul. 0 IN A 10.0.0.53
;; Query time: 1 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Thu Aug 18 14:32:02 2016
;; MSG SIZE rcvd: 66
除服务之外查询节点的能力对于系统管理任务非常重要.例如知道节点的 SSH 登录地址,可以简单的将节点加入到 Consul 集群并查询他。
离开集群
离开集群,你可以 Ctrl-C
优雅的退出,也可以直接 Kill 掉 agent 进程.优雅的退出可以让节点转变为离开状态.否则节点将被标记为失败.详细的细节可以查看 这里 .
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论