Consul集群

我们成功运行一个 代理 ( agent ),在其上注册了 服务 ( service ),并发起查询。此外,我们也配置了 Consul互连 ( Connect ),实现服务间 连接加密权限控制 。为了尽量简洁地演示 Consul 的使用方法,我们没有讨论 可扩展生产级架构 ,但这是构建服务管理基础设施的关键。现在,我们要搭建一个真实的 集群 ,由多个成员节点组成。

Consul代理 启动后,刚开始对其他节点一无所知。换句话讲,它是一个孤立的单节点集群。代理 需要加入一个现有的集群,以便发现其他集群成员。只要知道集群中任一成员,即可加入该集群。加入之后, 代理 将与该成员通讯,发现其他集群成员。代理 可以加入其他任何 代理 ,不仅仅是 服务器 模式的那些。

启动代理

为了模拟更真实的集群环境,我们借助 Vagrant 工具创建两个 节点 ( node )。Vagrantfile 可以在 这里 找到。

先启动实验所需的两个节点:

  1. $ ls
  2. Vagrantfile
  3. $ vagrant up

一旦系统就绪,我们便可 ssh 登录上去,开始配置 Consul 集群。先登录第一个节点:

  1. $ vagrant ssh n1

前面,我们使用了 -dev 参数,以便快速启动服务,方便开发调试。然而,这在集群环境中是不适合的。之后,我们将抛弃 -dev 参数,并用其他集群参数来替换。

集群内每个节点名字必须唯一。默认, Consul 使用 机器名 作为节点名,但我们将通过 -node 参数显示指定。

另外,我们通过 -bind 参数指定 绑定地址 ( bind address ),这是 Consul监听地址 ,必须能被其他节点访问到。严格上讲, 绑定地址 不是必要的,但提供一下会更好。默认, Consul 会监听所有 IPv4 接口,但可能会提示因 私有地址不唯一 而启动失败。由于生产服务器一般是 多网卡 的,指定 绑定地址 可避免 Consul 错误监听其他网卡。

第一个节点作为集群唯一一个 服务器模式 节点,需要指定 -server 参数。

-bootstrap-expect 参数指定集群 节点数 ,可让 日志复制 ( replicated log )推迟到所有节点均成功加入之后才开始。这个文档 有更详细的介绍。

还有,我们将 -enable-script-checks 设置为 true 以便可以执行外部脚本进行 健康检查 。这个功能我们会在 下节 中用到。

最后, -config-dir 参数指定服务以及健康检查 配置 所在的目录。

将以上命令行参数合在一起,便得到以下 consul agent 命令:

  1. vagrant@n1:~$ consul agent -server -bootstrap-expect=1 \
  2. -data-dir=/tmp/consul -node=agent-one -bind=172.20.20.10 \
  3. -enable-script-checks=true -config-dir=/etc/consul.d

接着,新开一个终端,登上另一个节点:

  1. $ vagrant ssh n2

这次,我们通过 -bind 参数绑定第二个节点的地址,并通过 -node 参数指定节点名为 agent-two 。由于第二个节点不以 服务器 模式运行,我们去掉了 -server 参数。

组合起来,便形成以下 consul agent 命令:

  1. vagrant@n2:~$ consul agent -data-dir=/tmp/consul -node=agent-two \
  2. -bind=172.20.20.11 -enable-script-checks=true \
  3. -config-dir=/etc/consul.d

至此,我们成功运行了两个 Consul 节点:一个是 服务器 模式,一个是 客户端 模式。然而,两个 代理 均不知对方的存在,都以为自己处于单节点集群。运行 consul members 便可确认这一点,你会发现集群成员只有一个。

加入集群

现在,通知第一个 代理 加入第二个,先登录 n1 节点:

  1. $ vagrant ssh n1

可以看到,目前集群还只有一个成员:

  1. vagrant@n1:~$ consul members
  2. Node Address Status Type Build Protocol DC Segment
  3. agent-one 172.20.20.10:8301 alive server 1.4.1 2 dc1 <all>

执行以下命令,让当前代理加入第二个代理, IP172.20.20.11

  1. vagrant@n1:~$ consul join 172.20.20.11
  2. Successfully joined cluster by contacting 1 nodes.

这时,两个代理都会输出一些日志,从中可以看到加入集群的信息。再次查看集群成员,可以看到两个 代理 都知道对方的存在了:

  1. vagrant@n1:~$ consul members
  2. Node Address Status Type Build Protocol DC Segment
  3. agent-one 172.20.20.10:8301 alive server 1.4.1 2 dc1 <all>
  4. agent-two 172.20.20.11:8301 alive client 1.4.1 2 dc1 <default>

注解

代理 新加入 Consul 集群,只需知道其中某个节点的地址即可。成功加入后, 代理 间可借助通讯获得完整的成员信息。

自动加入集群

理想状态下,新节点启动后应该 自动加入Consul集群 ,无需人工干预。借助 AWS谷歌云Azure实例发现 功能,Consul 只需配置一个指定的 键值对 ( key/value )便能实现 自动组群 ( auto-join )。这个方案无需任何 硬编码 ( hardcode )配置,即可让新节点自动加入已有集群。另外,指定 -join 命令行参数, 硬编码 其他节点地址,也是可行的。

查询节点

与查询服务类似, Consul 也提供 API 用于查询节点自身, HTTPDNS 均可。

DNS 接口,名字结构为 NAME.node.consul 或者 NAME.node.DATACENTER.consul 。如果 数据中心 ( datacenter )部分省略, Consul 则搜索本地数据中心。

例如,我们可以在节点一( agent-one )上查询节点二( agent-two )的地址:

  1. vagrant@n1:~$ dig @127.0.0.1 -p 8600 agent-two.node.consul
  2. ;; QUESTION SECTION:
  3. ;agent-two.node.consul. IN A
  4. ;; ANSWER SECTION:
  5. agent-two.node.consul. 0 IN A 172.20.20.11

除了服务查询,具备节点查询能力对 系统管理 ( system administration )任务意义非凡。例如,需要通过 SSH 登录某节点时,通过接口便可查到地址信息。

退出集群

通过 Ctrl-C 或者强杀 代理 进程即可使其退出集群。将节点转至 离开状态 ( left state )则 更优雅 ,避免其他节点检测到异常。两种方式的区别 官网 上有详细讨论。

下一步

本节,我们成功部署了一个 多节点Consul集群 。为了使服务更加 健壮 ,还需要配置 健康检查机制 , 下节见。

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../../../_images/wechat-mp-qrcode.png小菜学编程

参考文献