专栏首页DBA随笔搭建Consul集群

搭建Consul集群

Consul集群搭建

Consul的简介和安装过程之前的文章中已经提及了,这次主要了解下consul的集群搭建过程,在搭建Consul集群之前,有必要先了解一下单个节点的consul环境部署。

一、单个实例部署的具体过程

1.检查consul是否可用?

命令行输入consul,如果出现如下结果,则说明consul可用

2.启动Consul Agent

Consul可以运行在服务器或者客户端模式下,每个数据中心(DataCenter,简称DC)都必须至少有一台服务器,在生产环境中,往往推荐使用多台服务器,因为服务器也要实现高可用,单一的服务器在发生故障时会导致数据丢失。

使用开发模式启动Consul代理,这种模式主要用于快速简单的启动Consul环境。

命令行输入:consul agent -dev

我们可以看到,它已经输出了一些内容,包含了一个节点,即本机的localhost,这个集群里面相当于只有一个节点。

3.集群成员查询

重新启动一个终端,输如consul members,就可以看到这个Consul集群的成员。

还可以通过consul members -detailed查看额外的信息。

4.停止Agent

停止Consul Agent的方法是通过Ctrl+C的方法,点击之后我们可以看到该节点离开集群并关闭。

这里需要提醒一下,consul中有两个概念,节点失败和节点离开。

节点失败时,它的健康状态被标记为关键,而不会从目录中删除;

节点离开时,它的服务和检查将会从目录中删除。

它们最大的区别是Consul将自动尝试重新连接失败的节点,使其能够从特定的网络条件中恢复,而不再联系离开的节点。

5.注册服务

5.1定义服务

定义服务时注册服务最常用的方式,接下来将演示这一过程,首先为Consul配置一个目录,通常路径设定为/etc/consul.d

命令:mkdir /etc/consul.d

接下来,我们将编写一个定义服务的配置文件、这里使用自己特定的服务名称“yeyz”来命名,另外,我们可以给他定义一个标签“Asia”,我们可以使用它作为查询服务的附加方式。

此时,重启consul并提供配置目录:

可以看到,刚才设定的节点yeyz已经开始了同步。这意味着agent已经从配置文件中加载了服务定义,并且成功的将其注册到服务目录中了。

5.2查询服务

查询的方法分为两种,一种是DNS,一种是HTTP API

DNS API

对于DNS API来讲,服务的DNA名称是NAME.service.consul,这里的NAME就是我们刚才设定的“yeyz”,对于刚才注册的服务“yeyz”,会生成一个命名为yeyz.service.consul的域名,此时通过DNS API进行查询:

dig @127.0.0.1 -p 8600 yeyz.service.consul

可以看到,通过域名,解析到了本地的地址。

HTTP API

除了DNS API之外,我们也可以通过HTTP API来查询服务,命令行输入:

curl http://localhost:8500/v1/catalog/service/yeyz

二、consul集群的部署方法

搞明白了单个节点部署consul服务的过程,就可以来摸索多个节点的consul集群搭建了。当一个consul agent启动时,它是孤立的,不知道其它集群成员,此时它必须通过某种方法加入到集群中来。要加入集群,需要知道一个现有的集群成员,当孤立的节点和集群中的成员通讯时,就能迅速发现其他成员,这和我们微信拉群聊是一个道理。

1.启动代理

在上面的单节点例子中,我们使用了-dev标志来快速设置一个开发服务器,但是在集群中,我们不能这么使用,每个集群中的节点都必须具有唯一的名称,此时不能再使用默认的机器主机名,将使用一个-node参数来给集群中的节点进行命名。

我们还将指定一个-bind:这是Consul侦听的地址,它必须可以被集群中的所有其他节点访问。 虽然绑定地址不是绝对必要的,但最好提供一个。 Consul将默认尝试侦听系统上的所有IPv4接口,但如果找到多个私有IP,将无法启动错误。 由于生产服务器通常具有多个接口,因此指定一个绑定地址可确保您永远不会将Consul绑定到错误的接口。 第一个节点将作为我们在这个集群中唯一的服务器,我们用-server来指明这一点。-bootstrap-expect选项向Consul服务器提示我们期望加入的其他服务器节点的数量。此选项的用途是延迟复制日志的引导,直到预期数量的服务器成功加入。   我们已经将-enable_script_checks选项设置为true,以启用可以执行外部脚本的运行状况检查。 这将在后面的例子中使用。 对于生产用途,您希望将ACL配置为与此配合使用,以控制注册任意脚本的能力。 最后,我们添加-config-dir选项,标记可以找到服务和检查定义的位置。

我们使用下面的命令来开启一个server模式的consul代理:

consul agent -server -bootstrap-expect=1 -data-dir=/tmp/consul -node=agent_1 -bind=192.168.197.132 -enable-script-checks=true -config-dir=/etc/consul.d

我们可以看到,刚才定义的agent_1的node已经进入了服务模式,

此时我们准备加入第二个节点,这个节点的运行模式是client模式,即客户端模式,所以我们不加-server参数,-bind参数设置为第二个节点的IP,命令如下:

consul agent -data-dir=/tmp/consul -node=agent_2 -bind=192.168.197.128 -enable-script-checks=true -config-dir=/etc/consul.d

从输出的结果我们可以看到,现在我们有一个服务器节点和一个客户端节点,这个客户端节点已经配置成功,但是没有找到服务器节点,那接下来的一步肯定是让两个节点进行通信,将客户端节点添加到服务器的集群(只有一个节点)中了。

2.加入集群

现在我们将客户端节点加入到服务器节点的集群中,命令如下:

consul join 192.168.197.132

出现上面的结果是没有关闭防火墙导致的,此时需要在每一个节点上关闭相应的防火墙:sudo iptables -F,再次运行,可以看到:

显示添加成功,我们查看consul客户端的提示日志,可以发现已经加入了服务agent_1

查询consul服务器的提示日志,可以发现已经提示agent_2加入了:

此时查看consul集群中的成员,命令:consul members

可以看到,集群中已经有两个成员了。类型分别为server和client

3.查询节点状态

Consul也有查询节点的API。 可以通过DNS或HTTP API执行此操作。   对于DNS API,名称的结构是NAME.node.consul或NAME.node.DATACENTER.consul。 如果数据中心被省略,Consul将仅搜索本地数据中心。   例如,从“agent_1”中,我们可以查询节点“agent_2”的地址:

dig @127.0.0.1 -p 8600 agent_2.node.consul

同样,也可以在agent_2节点中查询agent_1的地址。除了服务之外,查找节点的能力对于系统管理任务来说是非常有用的。例如,知道要通过SSH连接的节点的地址与将节点作为Consul集群的一部分并查询它一样简单。

4.离开集群

要离开集群,可以正常退出代理(使用Ctrl-C)或强制终止其中一个代理。 优雅地离开允许节点转换到离开状态; 否则,其他节点将检测到它失败。

后续还有一些健康检查的内容,下次再分享吧。。。

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用 redis-shake 迁移 redis-cluster集群

        IDC上云, 有2套redis-cluster需要迁移到云上。 这里我们使用 redis-shake 来做迁移操作。

    二狗不要跑
  • Java 经典面试题:为什么 ConcurrentHashMap 的读操作不需要加锁?

    我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的,这也是这篇...

    哲洛不闹
  • PostgreSQL 多个同步复制服务器

    在PG10及以后版本中,引入了 synchronous_standby_names 这种基于 Quorum的同步复制优选提交的机制。

    二狗不要跑
  • 一文读懂Python复杂网络分析库networkx | CSDN博文精选

    networkx是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。

    AI科技大本营
  • Electron中调用DLL

    NodeJS地址:https://nodejs.org/en/download/ Electron版本: https://electronjs.org/rele...

    剑行者
  • python 回调装饰器

    通过使用生成器和协程可以使得回调函数内联在某个函数中。 为了演示说明,假设你有如下所示的一个执行某种计算任务然后调用一个回调函数的函数(参考7.10小节):

    用户5760343
  • Sublime text 安装 及 插件安装

    从菜单 View - Show Console 或者ctrl + ~ 快捷键,调出 console。将以下 Python 代码粘贴进去并 enter 执行,不出...

    剑行者
  • Vue开始使用NUXT框架开发

    Nuxt.js 为 客户端/服务端 这种典型的应用架构模式提供了许多有用的特性,例如服务端渲染、SEO、中间件支持、布局支持等。

    剑行者
  • 识别自动驾驶的深度

    有许多传感器可用于在车辆行驶时捕获信息。捕获的各种测量结果包括速度,位置,深度,热等。这些测量结果被输入到反馈系统中,该系统训练并利用运动模型来遵守车辆。本文重...

    代码医生工作室
  • Electron启程

    Electron 可以让你使用纯 JavaScript 调用丰富的原生(操作系统) APIs 来创造桌面应用。 你可以把它看作一个 Node. js 的变体,它...

    剑行者

扫码关注云+社区

领取腾讯云代金券