Consul - 故障转移事件
在本章中,我们将了解 Consul 中的故障转移事件。这将借助以下功能完成 −
- 单个集群故障
- Jepsen 测试
- 多个集群故障
- 拍摄快照
让我们详细了解每个功能。
单个集群故障
在单个集群故障中,位于其中一个数据中心的集群开始出现故障。在每种情况下,重要的是确保在发生故障转移时系统不仅可以阻止它,而且还具有可以依赖的备份。为了防止 Consul 故障转移事件,我们将使用一种称为 Consul-alerts 的东西。主要项目位于 - https://github.com/AcalephStorage/consul-alerts。
Consul-alerts 是一个高可用性守护进程,用于根据 Consul Health 检查发送通知和提醒。此项目在 localhost:9000 运行守护进程和 API,并使用默认数据中心 (dc1) 连接到本地 consul 代理 (localhost:8500)。
有两种方法可以开始使用该项目。第一种方法是通过 GO 安装它。对于已安装并配置 GO 的用户,他们可以按照以下步骤操作 −
$ go get github.com/AcalephStorage/consul-alerts $ go install $ consul-alerts start
最后一个命令可轻松用于覆盖 consul-alert、数据中心选项、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-alerts 链接远程 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 的 entrypoint。与此同时,我们通过使用 -p 标志指定所使用的端口、使用标志 -data-dir 指定数据目录 /data 以及将客户端指定为 0.0.0.0 来引导客户端。

在新的终端窗口中,让我们启动 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 检查。

我们可以清楚地看到,consul 警报已轻松启动,并且已注册了新的健康检查,并添加了 consul 代理。数据中心被视为 dc1,可根据用户进行更改。
使用在另一个 Docker 容器上运行的 Consul 代理
在这里,您可以使用任何类型的 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-alerts 链接远程 Consul 实例
在这里,我们应该使用以下命令来使用 Consul-alerts 链接远程 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
Jepsen 测试
Jespen 是一种用于测试任何系统中的部分容错性和网络的工具。它通过在系统上创建一些随机操作来测试系统。Jepsen 是用 Clojure 编写的。不幸的是,对于演示,Jepsen 测试需要与数据库系统形成大量集群,因此超出了本文的介绍范围。
Jepsen 的工作原理是在五个不同的主机上设置测试中的数据存储。它为测试中的数据存储创建一个客户端,指向五个节点中的每一个发送请求。它还创建了一系列称为"Nemesis"的特殊客户端,这些客户端会在集群中造成严重破坏,例如使用 iptables 切断节点之间的链接。然后,它会继续同时向不同节点发出请求,同时交替分区和修复网络。
在测试运行结束时,它会修复集群,等待集群恢复,然后验证系统的中间状态和最终状态是否符合预期。
有关 Jepsen 测试的更多信息,请查看此处。
多集群故障
在多集群故障转移事件期间,部署在多个数据中心的集群无法支持向客户提供的服务。 Consul 使我们能够确保当出现其中一种情况时,Consul 具有可帮助您在此类情况下启用服务的功能。
为此,我们将查看一个可帮助我们将 Consul 从一个集群复制到多个集群的项目。该项目为我们提供了一种使用 consul-replicate 守护进程在多个 Consul 数据中心之间复制 K/V 对的方法。您可以在 − https://github.com/hashicorp/consul-replicate 上查看此 Hashicorp 项目。尝试此项目的一些先决条件包括 −
- Golang
- Docker
- Consul
- Git
让我们从以下命令开始 −
注意 − 在运行以下命令之前,请确保您已在计算机上正确安装和配置 Git。
$ git clone − https://github.com/hashicorp/consul-replicate.git
输出将如以下屏幕截图所示。

$ cd consul-replicate $ make
输出将如以下屏幕截图所示。

如果您在构建二进制文件时遇到问题,也可以尝试使用以下命令手动拉取 Docker 镜像 −
$ docker pull library/golang:1.7.4
上述命令将创建 bin/consul-replicate,可以作为二进制文件调用。下表显示了它涵盖的子命令的完整列表 −
选项 | 描述 |
---|---|
auth | 基本身份验证用户名(和可选密码),以冒号分隔。没有默认值。 |
consul* | 要查询的 consul 实例的位置(可能是 IP 地址或 FQDN)和端口。 |
max-stale | 查询的最大过期时间。如果指定,Consule 将在所有服务器之间分配工作,而不仅仅是领导者。默认值为 0(无)。 |
ssl | 与 Consul 对话时使用 HTTPS。需要将控制台服务器配置为服务器安全连接。默认值为 false。 |
ssl-verify | 通过 SSL 连接时验证证书。这需要使用 -ssl。默认值为 true。 |
syslog | 将日志输出发送到 syslog(除了 stdout 和 stderr)。默认值为 false |
syslog-facility | 发送到 syslog 时使用的工具。这需要使用 -syslog。默认值为 LOCAL |
token | Consul API 令牌。没有默认值。 |
prefix* | 源前缀,包括选项目标前缀,以冒号 (:) 分隔。此选项是附加的,可以多次指定以复制多个前缀。 |
exclude | 复制期间要排除的前缀。此选项是附加的,可以多次指定以排除多个前缀。 |
wait | 复制前等待稳定性的最小值 (:最大值),以冒号 (:) 分隔。如果省略可选的最大值,则假定它是所需最小值的 4 倍。没有默认值。 |
retry | 如果 Consule 在与 API 通信时返回错误,则等待的时间量。默认值为 5 秒。 |
config | 相对于当前工作目录的磁盘上配置文件或配置文件目录的路径。CLI 上指定的值优先于配置文件中指定的值。没有默认值。 |
log-level | 输出的日志级别。这适用于 stdout/stderr 日志记录以及 syslog 日志记录(如果启用)。有效值为"debug"、"info"、"warn"和"err"。默认值为"warn"。 |
once | 运行一次 Consule Replicate 并退出(与守护进程的默认行为相反)。(仅限 CLI) |
version | 输出版本信息并退出。(仅限 CLI) |
拍摄快照
快照是备份时管理 Consul 集群必不可少的重要部分。默认情况下,Consul 为我们提供了一种保存 consul 集群快照的方法。Consul 为我们提供了四个单独的子命令,我们可以使用它们来使用 consul 创建快照,它们是 −
- Consul 快照保存
- Consul 快照代理
- Consul 快照检查
- Consul 快照恢复
让我们详细了解每一个。
Consul 快照保存
此命令设置为检索 Consul 服务器状态的原子、时间点快照,其中包括键/值条目、服务目录、准备好的查询、会话和 ACL。快照将保存到上述文件名中。
$ consul snap save <name-of-the-file>.snap
输出将如以下屏幕截图所示。

要检查当前目录中是否存在该文件,请在当前目录中运行它进行检查。对于非领导节点,请执行以下命令 −
$ consul snap save -stale <name-of-file>.snap
Consul Snapshot Agent
此子命令启动一个进程,该进程对 Consul 服务器的状态进行快照并将其保存在本地,或将其推送到可选的远程存储服务。

Consul Snapshot Inspect
用于检查 Consul 服务器状态的时间点快照,其中包括键/值条目、服务目录、准备好的查询、会话和 ACL。该命令可以按如下方式执行 −
注意 −请记住,以下命令只能在保存快照的目录中运行。
$ consul snap save <name-of-the-file>.snap
输出将如以下屏幕截图所示。

Consul Snapshot Restore
snapshot restore 命令用于恢复 Consul 服务器状态的时间点快照,其中包括键/值条目、服务目录、准备好的查询、会话和 ACL。快照从保存的备份文件中读取。
注意 −请记住,以下命令只能在保存快照的目录中运行。
$ consul snap restore <name-of-the-file>.snap
输出将如以下屏幕截图所示。

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