Consul - 故障转移事件


在本章中,我们将学习 Consul 中的故障转移事件。这将在以下功能的帮助下完成 -

  • 单集群故障
  • 杰普森测试
  • 多集群故障
  • 拍摄快照

让我们详细了解其中的每一个。

单集群故障

在单个集群故障中,位于其中一个数据中心的集群开始出现故障。在每种情况下,重要的是要确保在发生故障转移时系统不仅可以防止故障转移,而且还拥有可以依赖的备份。为了防止 Consul 故障转移事件,我们将使用称为 Consul 警报的东西。主要项目可以在https://github.com/AcalephStorage/consul-alerts找到。

Consul-alerts 是一个高度可用的守护进程,用于根据 Consul 健康检查发送通知和提醒。该项目在 localhost:9000 运行守护程序和 API,并使用默认数据中心 (dc1) 连接到本地 consul 代理 (localhost:8500)。

有两种方法可以开始该项目。第一种方法是通过GO安装。对于已安装并配置 GO 的用户,他们可以按照以下步骤操作 -

$ go get github.com/AcalephStorage/consul-alerts
$ go install
$ consul-alerts start

最后一个命令可以轻松地用于覆盖 consul-alert、datacenter 选项、consul-acl 令牌等的默认端口。该命令也可以编写如下 -

$ consul-alerts start --alert-addr = localhost:9000 --consul-addr = localhost:8500
--consul-dc = dc1 --consul-acl-token = ""

第二种方法涉及用户使用Docker。这两种方法在不同的场景中同样有用。为了通过 Docker 使用 Consul-alerts,我们可以使用以下命令从 Docker Hub 中提取镜像。

$ docker pull acaleph/consul-alerts

领事警报

对于 Docker 方法,我们可以考虑以下三个选项 -

  • 使用容器本身内置的 Consul Agent。
  • 使用在另一个 Docker 容器上运行的 Consul Agent。
  • 使用 Consul 警报通过远程 Consul 实例进行链接。

现在让我们详细讨论这两个问题。

使用容器本身内置的Consul Agent

让我们使用以下命令启动 consul 代理 -

$ docker run -ti \
   --rm -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \  
   --entrypoint = /bin/consul \
   acaleph/consul-alerts \
   agent -data-dir /data -server -bootstrap -client = 0.0.0.0

在这里,我们将重写标志--entrypoint提到的 Consul入口点。除此之外,我们还通过使用-p 标志、使用标志 -data-dir 和客户端 0.0.0.0 提及使用的端口、数据目录 /data 来引导客户端。

入口点

在新的终端窗口上,让我们启动 consul-alerts 选项。

$ docker exec -ti consul-alerts /bin/consul-alerts start --alertaddr = 0.0.0.0:9000
--log-level = info --watch-events --watch-checks

在上面的步骤中,我们正在执行 consul-alerts 以交互模式启动。警报地址端口为 9000。手表会在 consul 检查的同时检查 consul 代理是否已启用。

警报选项

我们可以清楚地看到领事警报已轻松启动,并且它已经注册了新的健康检查并添加了领事代理。数据中心取dc1,可根据用户更改。

使用在另一个 Docker 容器上运行的 Consul Agent

在这里,您可以使用任何类型的 consul 映像在 Docker 容器上运行。使用 consul-alerts 镜像,我们可以轻松地将 consul 容器与 consul-alerts 容器链接起来。这是使用--link 标志完成的。

注意- 在使用以下命令之前,请确保 consul 容器已在另一个终端上运行。

$ docker run -ti \
   -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \
   --link consul:consul \
   acaleph/consul-alerts start \
   --consul-addr=consul:8500 \
   --log-level = info --watch-events --watch-checks

使用 Consul 警报通过远程 Consul 实例进行链接

在这里,我们应该使用以下命令来使用 Consul 警报来链接远程 consul 实例。

$ docker run -ti \
   -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \
   acaleph/consul-alerts start \
   --consul-addr = remote-consul-server.domain.tdl:8500 \
   --log-level = info --watch-events --watch-checks

杰普森测试

Jespen 是一个为测试任何系统中的部分容忍和网络而编写的工具。它通过在系统上创建一些随机操作来测试系统。Jepsen 是用 Clojure 编写的。不幸的是,对于演示,Jepsen 测试需要使用数据库系统形成大量集群,因此超出了此处讨论的范围。

Jepsen 的工作原理是在五个不同的主机上设置测试数据存储。它为被测数据存储创建一个客户端,指向五个节点中的每一个发送请求。它还创建了一系列特殊的客户端,称为“Nemesis”,它们会在集群中造成严重破坏,例如使用iptables切断节点之间的链接。然后,它继续向不同节点同时发出请求,同时交替分区和修复网络。

在测试运行结束时,它修复集群,等待集群恢复,然后验证系统的中间状态和最终状态是否符合预期。一些摘录是从这里摘录的。

有关 Jepsen 测试的更多信息,请查看此处

多集群故障

在多集群故障转移事件期间,部署在多个数据中心的集群无法支持客户所支持的服务。Consul 使我们能够确保当发生此类情况之一时,Consul 具有帮助您在此类情况下启用服务的功能。

为此,我们将研究一个项目,该项目可以帮助我们将 Consul 从一个集群复制到多个集群。该项目为我们提供了一种使用 consul-replicate 守护进程在多个 Consul 数据中心复制 K/V 对的方法。您可以在https://github.com/hashicorp/consul-replicate上查看此 Hashicorp 项目。尝试这个项目的一些先决条件包括 -

  • 戈兰
  • 码头工人
  • 领事
  • git

让我们开始使用以下命令 -

注意- 在运行以下命令之前,请确保您的计算机上已正确安装和配置 Git。

$ git 克隆- https://github.com/hashicorp/consul-replicate.git

输出将如以下屏幕截图所示。

克隆

$ cd consul-replicate
$ make

输出将如以下屏幕截图所示。

复制

如果您在构建二进制文件时遇到一些问题,您还可以尝试使用以下命令手动拉取 Docker 映像 -

$ docker pull library/golang:1.7.4

上述命令将创建 bin/consul-replicate,它可以作为二进制文件调用。下表显示了它涵盖的子命令的完整列表 -

选项 描述
授权 基本身份验证用户名(和可选密码),以冒号分隔。没有默认值。
领事* 要查询的 consul 实例的位置(可以是 IP 地址或 FQDN)以及端口。
最大陈旧 查询的最大陈旧度。如果指定,Consule 将在所有服务器之间分配工作,而不仅仅是领导者。默认值为 0(无)。
安全套接字层 与 Consul 交谈时使用 HTTPS。需要将 consule 服务器配置为提供安全连接服务。默认值为 false。
SSL 验证 通过 SSL 连接时验证证书。这需要使用-ssl。默认值是true。
系统日志 将日志输出发送到 syslog(除了 stdout 和 stderr)。默认值为 false
系统日志工具 发送到系统日志时使用的工具。这需要使用-syslog。默认为本地
代币 Consul API 令牌。没有默认值。
前缀* 源前缀包括带有选项的目标前缀,以冒号 ( :)分隔。此选项是附加的,可以多次指定以复制多个前缀。
排除 复制期间要排除的前缀。此选项是附加选项,可以多次指定以排除多个前缀。
等待 复制前等待稳定的最小值(:最大值),以冒号(:)分隔。如果省略可选最大值,则假定为所需最小值的 4 倍。没有默认值。
重试 与 API 通信时 Consule 返回错误时等待的时间。默认值为 5 秒。
配置 磁盘上配置文件或配置文件目录的路径,相对于当前工作目录。CLI 上指定的值优先于配置文件中指定的值。没有默认值。
日志级别 输出的日志级别。这适用于 stdout/stderr 日志记录以及 syslog 日志记录(如果启用)。有效值为“debug”、“info”、“warn”和“err”。默认值为“warn”。
一次 运行 Consule Replicate 一次并退出(与守护进程的默认Behave相反)。(仅限 CLI)
版本 输出版本信息并退出。(仅限 CLI)

拍摄快照

快照是在备份时管理 Consul 集群的基本且重要的部分。默认情况下,Consul为我们提供了保存consul集群快照的方法。Consul 为我们提供了四个单独的子命令,我们可以使用它们来创建快照,它们是 -

  • 领事快照保存
  • 领事快照代理
  • 领事快照检查
  • Consul快照恢复

让我们详细了解其中的每一个。

领事快照保存

该命令设置为检索 Consul 服务器状态的Atomics时间点快照,其中包括键/值条目、服务目录、准备好的查询、会话和 ACL。快照将保存到提到的文件名中。

$ consul snapshot save <name-of-the-file>.snap

输出将如以下屏幕截图所示。

快照保存

要检查当前目录中是否存在该文件,请通过在当前目录中运行它来检查它。如果是非领导节点,请执行以下命令 -

$ consul snapshot save -stale <name-of-file>.snap

领事快照代理

此子命令启动一个进程,该进程拍摄 Consul 服务器状态的快照并将其保存在本地,或将它们推送到可选的远程存储服务。

快照代理

领事快照检查

它用于检查 Consul 服务器状态的时间点快照,其中包括键/值条目、服务目录、准备好的查询、会话和 ACL。该命令可以执行如下 -

注意- 请记住,以下命令只能在保存快照的目录中运行。

$ consul snapshot save <name-of-the-file>.snap

输出将如以下屏幕截图所示。

快照检查

领事快照恢复

快照恢复命令用于恢复Consul服务器状态的时间点快照,其中包括键/值条目、服务目录、准备好的查询、会话和ACL。快照是从保存的备份文件中读取的。

注意- 请记住,以下命令只能在保存快照的目录中运行。

$ consul snapshot restore <name-of-the-file>.snap

输出将如以下屏幕截图所示。

快照恢复

如果您正在使用AWS的Consul,这个项目可能会帮助您节省一些时间 - https://github.com/pshima/consul-snapshot