在本章中,我们将学习有关 Consul 中的故障转移相关的事件。这将通过以下功能来完成:

  • 单集群故障
  • Jepsen 测试
  • 多集群故障
  • 创建快照

让我们详细了解每个功能。

单集群故障

在单集群故障中,放置在一个数据中心中的集群开始发生故障。在每种情况下,重要的是确保系统不仅能防止故障发生,还能有一个可以依赖的备份。为防止 Consul 故障切换事件,我们将使用名为 Consul-alerts 的工具。主项目可以在 https://github.com/AcalephStorage/consul-alerts 找到。

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

有两种方法可以开始使用该项目。第一种方法是通过 GO 安装。对于已安装和配置 GO 的用户,可以按照以下步骤进行:

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

最后一个命令可以轻松用于覆盖 consul-alert 默认端口、数据中心选项、consul-acl 令牌等。命令也可以按如下方式编写:

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

第二种方法是使用 Docker。这两种方法在不同的场景下都同样有用。要在 Docker 上使用 Consul-alerts,我们可以使用以下命令从 Docker Hub 拉取镜像。

$ docker pull acaleph/consul-alerts

Consul-Alerts

在 Docker 方法中,我们可以考虑以下三种选项:

  • 使用内置于容器中的 Consul Agent。
  • 使用运行在另一个 Docker 容器上的 Consul Agent。
  • 使用 Consul-alerts 链接到远程 Consul 实例。

让我们现在详细讨论这些方法。

使用内置于容器中的 Consul Agent

让我们使用以下命令启动 consul agent:

  1. $ docker run -ti \\
  2. --rm -p 9000:9000 \\
  3. --hostname consul-alerts \\
  4. --name consul-alerts \\
  5. --entrypoint = /bin/consul \\
  6. acaleph/consul-alerts \\
  7. agent -data-dir /data -server -bootstrap -client = 0.0.0.0

这里,我们通过 --entrypoint 标志覆盖了 Consul 的 entrypoint。同时,我们通过 -p 标志 使用的数据目录 /data、客户端地址 0.0.0.0 引导客户端。

Entrypoint

在一个新终端窗口中,让我们启动 consul-alerts 选项。

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

在上述步骤中,我们执行 consul-alerts 以交互模式启动。警报地址端口为 9000。检查 consul 代理是否启用以及 consul 检查。

Alerts Option

我们可以清楚地看到,consul alerts 已经轻松启动,并且已添加 consul 代理的新健康检查。数据中心默认为 dc1,可以根据用户需求更改。

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

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

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

  1. $ docker run -ti \\
  2. -p 9000:9000 \\
  3. --hostname consul-alerts \\
  4. --name consul-alerts \\
  5. --link consul:consul \\
  6. acaleph/consul-alerts start \\
  7. --consul-addr=consul:8500 \\
  8. --log-level = info --watch-events --watch-checks

使用 Consul-alerts 链接到远程 Consul 实例

在这里,我们应该使用以下命令将 Consul-alerts 链接到远程 consul 实例。

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

Jepsen 测试

Jepsen 是一个用来测试任何系统部分容错和网络的工具。它通过在系统上创建一些随机操作来测试系统。Jepsen 是用 Clojure 编写的。不幸的是,Jepsen 测试的演示需要大量的集群和数据库系统,因此超出了本文的范围。

Jepsen 通过在五个不同的主机上设置测试的数据存储来工作。它创建了一个客户端,用于测试的数据存储,指向五个节点中的每一个以发送请求。它还创建了一些被称为 “Nemesis” 的特殊客户端,在集群中制造混乱,比如使用 iptables 切断节点之间的连接。然后,它在不同节点上交替分区和修复网络的同时并发地发出请求。

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

有关 Jepsen 测试的更多信息,请查看 这里

探索我们的 最新在线课程,以自己的节奏学习新技能。注册并成为认证专家,以提升你的职业生涯。

多集群故障

在多集群故障事件期间,部署在多个数据中心的集群无法支持客户支持的服务。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

输出如下图所示。

Git Clone

  1. $ cd consul-replicate
  2. $ make

输出如下图所示。

Replicate

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

$ docker pull library/golang:1.7.4

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

选项 描述
auth 基本身份验证用户名(和可选密码),用冒号分隔。没有默认值。
consul* 要查询的 consul 实例的位置(可以是 IP 地址或 FQDN)和端口。
max-stale 查询的最大陈旧度。如果指定,Consul 将在所有服务器之间分配工作,而不仅仅是领导者。默认值为 0(无)。
ssl 使用 HTTPS 与 Consul 通信。需要 consul 服务器配置为提供安全连接。默认值为 false。
ssl-verify 通过 SSL 连接时验证证书。这需要使用 -ssl。默认值为 true。
syslog 将日志

输出发送到 syslog(除了 stdout 和 stderr 之外)。默认值为 false | | syslog-facility | 发送到 syslog 时使用的设备。这需要使用 -syslog。默认值为 LOCAL | | token | Consul API 令牌。没有默认值。 | | prefix* | 源前缀,包括选项目标前缀,用冒号(:)分隔。此选项是累加的,可以多次指定以复制多个前缀。 | | exclude | 复制期间要排除的前缀。此选项是累加的,可以多次指定以排除多个前缀。 | | wait | 在复制前等待稳定的最小(:最大)时间,用冒号(:)分隔。如果省略可选的最大值,则假定为所需最小值的 4 倍。没有默认值。 | | retry | 如果 Consul 在与 API 通信时返回错误,等待的时间。默认值为 5 秒。 | | config | 磁盘上配置文件或配置文件目录的路径,相对于当前工作目录。CLI 中指定的值优先于配置文件中指定的值。没有默认值。 | | log-level | 输出的日志级别。这适用于 stdout/stderr 日志记录以及 syslog 日志记录(如果启用)。有效值为 “debug”、”info”、”warn” 和 “err”。默认值为 “warn”。 | | once | 运行 Consul Replicate 一次并退出(与守护进程的默认行为相反)。(仅限 CLI) | | version | 输出版本信息并退出。(仅限 CLI) |

快照

快照是管理 Consul 集群备份的重要组成部分。默认情况下,Consul 提供了一种保存集群快照的方法。Consul 提供了四个单独的子命令,使用它们我们可以使用 consul 创建快照,分别是:

  • Consul snapshot save
  • Consul snapshot agent
  • Consul snapshot inspect
  • Consul snapshot restore

让我们详细了解每一个命令。

Consul Snapshot Save

此命令用于检索 Consul 服务器状态的原子、时间点快照,其中包括键/值条目、服务目录、准备好的查询、会话和 ACL。快照保存到指定的文件名中。

$ consul snapshot save <文件名>.snap

输出如下图所示。

Snapshot Save

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

$ consul snapshot save -stale <文件名>.snap

Consul Snapshot Agent

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

Snapshot Agent

Consul Snapshot Inspect

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

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

$ consul snapshot save <文件名>.snap

输出如下图所示。

Snapshot Inspect

Consul Snapshot Restore

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

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

$ consul snapshot restore <文件名>.snap

输出如下图所示。

Consul - 故障转移 - 图9

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