- Consul 教程
- Consul - 首页
- Consul - 简介
- Consul - 架构
- Consul - 安装
- Consul - 使用微服务
- Consul - 引导和DNS
- Consul - 查询节点
- Consul - 故障转移事件
- Consul - 使用UI
- Consul - 在AWS上使用Consul
- Consul 有用资源
- Consul - 快速指南
- Consul - 有用资源
- Consul - 讨论
Consul - 故障转移事件
在本章中,我们将学习Consul中的故障转移事件。这将借助以下功能完成:
- 单集群故障
- Jepsen 测试
- 多集群故障
- 拍摄快照
让我们详细了解一下这些内容。
单集群故障
在单集群故障中,放置在其中一个数据中心中的集群开始出现故障。在每种情况下,务必确保在发生故障转移时,系统不仅可以防止故障转移,还可以拥有一个可以依赖的备份。为了防止Consul故障转移事件,我们将使用称为Consul-alerts的内容。主要项目可以在以下位置找到:https://github.com/AcalephStorage/consul-alerts。
Consul-alerts是一个高可用守护进程,用于根据Consul健康检查发送通知和提醒。此项目在localhost:9000上运行守护进程和API,并连接到本地consul代理(localhost:8500)以及默认数据中心(dc1)。
有两种方法可以开始使用该项目。第一种方法是通过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代理。
- 使用在另一个Docker容器上运行的Consul代理。
- 使用Consul-alerts链接到远程Consul实例。
现在让我们详细讨论一下这些内容。
使用容器本身内置的Consul代理
让我们使用以下命令启动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(使用标志-data-dir)并使用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对的方法。您可以在以下位置查看此HashiCorp项目:https://github.com/hashicorp/consul-replicate。尝试此项目的一些先决条件包括:
- 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。需要将consule服务器配置为服务安全连接。默认值为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 snapshot save
- Consul snapshot agent
- Consul snapshot inspect
- Consul snapshot restore
让我们详细了解一下这些内容。
Consul Snapshot Save
此命令设置为检索Consul服务器状态的原子时间点快照,包括键/值条目、服务目录、准备好的查询、会话和ACL。快照将保存到提到的文件名中。
$ consul snapshot save <name-of-the-file>.snap
输出将如以下屏幕截图所示。
要检查当前目录中文件的存在,请通过在当前目录中运行它来检查它。对于非领导者节点,请执行以下命令:
$ consul snapshot save -stale <name-of-file>.snap
Consul Snapshot Agent
此子命令启动一个进程,该进程会拍摄 Consul 服务器状态的快照并将其保存在本地,或者将其推送到可选的远程存储服务。
Consul 快照检查
它用于检查 Consul 服务器状态的某个时间点的快照,其中包括键/值条目、服务目录、已准备好的查询、会话和 ACL。该命令可以按如下方式执行:
注意 - 请记住,以下命令只能在保存快照的目录中运行。
$ consul snapshot save <name-of-the-file>.snap
输出将如以下屏幕截图所示。
Consul 快照恢复
快照恢复命令用于恢复 Consul 服务器状态的某个时间点的快照,其中包括键/值条目、服务目录、已准备好的查询、会话和 ACL。快照从保存的备份文件读取。
注意 - 请记住,以下命令只能在保存快照的目录中运行。
$ consul snapshot restore <name-of-the-file>.snap
输出将如以下屏幕截图所示。
如果您正在使用 AWS 上的 Consul,此项目可能可以帮助您节省一些时间:https://github.com/pshima/consul-snapshot。