在本章中,我们将了解Consul中的故障转移事件.这将通过以下功能和减号来完成;
单一群集失败
Jepsen测试
多个群集失败
拍摄快照
让我们来吧详细了解每一个.
单个群集故障
在单个群集故障中,放置在其中一个数据中心的群集启动失败.在每种情况下,重要的是要确保在发生故障转移的情况下,系统不仅可以阻止它,还可以拥有可以依赖的备份.为了防止Consul Failover事件,我们将使用称为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
最后一个命令可以很容易地用来覆盖领事的默认端口-alert,datacenter option,consul-acl token等.该命令也可以写成下面给出的 :
$ 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 Agent.
使用Consul-alerts连接到远程领事实例.
现在让我们详细讨论这两个方面.
使用构建的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
在这里,我们正在覆盖领事的入口点,如标志所述 - 入口点的.与此同时,我们通过使用 -p标志,数据目录/数据使用标志-data-dir和客户端为0.0.0.0来提及使用的端口来引导客户端.
在新的终端窗口中,让我们启动consul-alerts选项./p>
$ 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.手表会检查是否启用了领事代理以及领事检查.
我们可以清楚地看到领事警报已经轻松启动,并且已经注册了新的健康检查并添加了领事代理.数据中心被视为dc1,可以根据用户进行更改.
使用在另一个Docker容器上运行的Consul Agent
在这里,你可以使用任何类型的领事图像在Docker容器上运行.使用consul-alerts图像,我们可以轻松地将consul容器与consul-alerts容器链接起来.这是使用 - 链接标志完成的.
注意 : 在使用以下命令之前,请确保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-alerts进行链接通过远程领事实例.
$ 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-event s - watch-checks
Jepsen测试
Jespen是一个用来测试部分容忍和网络的工具任何系统.它通过在系统上创建一些随机操作来测试系统. Jepsen是用Clojure编写的.不幸的是,对于演示,Jepsen测试需要与数据库系统形成大量的集群,因此超出了此处的范围.
Jepsen通过设置正在测试的数据存储来工作五个不同的主机.它为被测数据存储创建一个客户端,指向五个节点中的每一个发送请求.它还创建了一系列称为"Nemesis"的特殊客户端,它们在集群中造成严重破坏,例如使用 iptables 切断节点之间的链接.然后它继续对不同节点同时发出请求,同时交替分区和修复网络.
在测试运行结束时,它会修复集群,等待集群恢复,然后验证系统的中间状态和最终状态是否符合预期.
多个群集失败
在多个群集故障转移事件期间,多个群集部署在一起数据中心无法支持客户支持的服务. 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-陈旧 | 查询的最大陈旧性.如果指定,Consule将在所有服务器之间分配工作,而不仅仅是领导者.默认值为0(无). |
ssl | 使用HTTPS时与领事交谈.需要将服务器服务器配置为服务器安全连接.默认值为false. |
ssl-verify | 连接时验证证书通过SSL.这需要使用-ssl.默认值为true. |
syslog | 将日志输出发送到syslog(除了stdout和stderr).默认值为false |
syslog-facility | 要使用的工具发送到syslog.这需要使用-syslog.默认值为LOCAL |
token | Consul API令牌.没有默认值. |
前缀 * | 源前缀包括带有选项目标前缀的,用冒号(:)分隔.此选项是可添加的,可以多次指定多个前缀进行复制. |
exclude | 复制期间要排除的前缀.此选项是附加的,可以多次指定多个前缀来排除. |
wait | 复制前等待稳定性的minium(:maximum),用冒号(:)分隔.如果省略可选的最大值,则假定它是所需最小值的4倍.没有默认值. |
重试 | 等待时间的金额如果Consule在与API通信时返回错误.默认值为5秒. |
config | 配置的路径磁盘上配置文件的文件或目录,相对于当前工作目录. CLI上指定的值优先于配置文件中指定的值.没有默认值. |
log-level | 日志级别输出.这适用于stdout/stderr日志记录以及syslog日志记录(如果已启用).有效值为"debug","info","warn"和"err".默认值为"warn". |
一次 | 运行Consule复制一次并退出(与守护进程的默认行为相反).(仅限CLI) |
版本 | 输出版本信息并退出.(仅限CLI) |
拍摄快照
快照是管理快照的重要组成部分备份时的Consul集群.默认情况下,Consul为我们提供了一种保存consul集群快照的方法.Consul为我们提供了四个独立的子命令,使用它们可以使用consul来创建快照,这些快照是 :
Consul snapshot save
Consul快照代理
Consul snapshot inspect
领事快照恢复
让我们详细了解每一项.
领事快照保存
此com mand设置为检索Consul服务器状态的原子时间点快照,其中包括键/值条目,服务目录,准备查询,会话和ACL.快照将保存到提到的文件名中.
$ consul snapshot save< name-of-the-file> .snap
输出结果如下面的截图所示.
要检查当前目录中是否存在该文件,请通过在当前目录中运行它来检查它.如果是非领导者节点,请执行以下命令 :
$ consul snapshot save -stale< name-of- file> .snap
Consul快照代理
此子命令启动一个进程,该进程拍摄状态的快照Consul服务器并在本地保存它们,或将它们推送到可选的远程存储服务.
Consul Snapshot Inspect
它用于检查Consul服务器状态的时间点快照,其中包括键/值条目,服务目录,准备好的查询,会话和ACL.该命令可以执行如下 :
注意 : 请记住,以下命令只能在保存快照的目录中运行.
$ consul snapshot save.snap
输出结果如下图所示.
Consul Snapshot Restore
快照恢复命令用于恢复点数 - Consul服务器状态的及时快照,包括键/值条目,服务目录,准备好的查询,会话和ACL.从保存的备份文件中读取快照.
注意 : 请记住,以下命令只能在保存快照的目录中运行.
$ consul snapshot save -stale.snap
输出结果如下图所示.
如果您正在使用AWS的Consul,这个项目可能会帮助您节省一些时间 : https://github.com/pshima/consul-snapshot .