Unity3D热门教程

游戏开发工具

Redis Sentinel 的高可用性(二)

IP 地址和 DNS 名称

旧版本的 Sentinel 不支持主机名,并且需要在任何地方指定 IP 地址。从 6.2 版开始,Sentinel提供对主机名的可选支持。

默认情况下禁用此功能。如果您要启用 DNS/主机名支持,请注意:

  1. Redis 和 Sentinel 节点上的名称解析配置必须可靠并且能够快速解析地址。地址解析的意外延迟可能会对 Sentinel 产生负面影响。

  2. 您应该在任何地方使用主机名,并避免混淆主机名和 IP 地址。为此,请分别对所有 Redis 和 Sentinel 实例使用replica-announce-ip <hostname>sentinel announce-ip <hostname>

启用resolve-hostnames全局配置允许 Sentinel 接受主机名:

  • 作为sentinel monitor命令的一部分

  • 作为副本地址,如果副本使用主机名值replica-announce-ip

Sentinel 将接受主机名作为有效输入并解析它们,但在宣布实例、更新配置文件等时仍会引用 IP 地址。

启用announce-hostnames全局配置会使 Sentinel 改为使用主机名。这会影响对客户端的回复、写入配置文件的值、 REPLICAOF 发布给副本的命令等。

此行为可能与所有可能明确需要 IP 地址的 Sentinel 客户端不兼容。

当客户端使用 TLS 连接到实例并需要名称而不是 IP 地址以执行证书 ASN 匹配时,使用主机名可能很有用。

快速教程

在本文档的下一部分中,将逐步介绍有关 *Sentinel API 、配置和语义的所有细节。* 然而,对于想要尽快使用系统的人来说,本节是一个教程,展示了如何配置 3 个 Sentinel 实例并与之交互。

在这里,我们假设实例在端口 5000、5001、5002 上执行。我们还假设您在端口 6379 上有一个正在运行的 Redis 主服务器,并在端口 6380 上运行一个副本。在此期间,我们将在任何地方使用 IPv4 环回地址 127.0.0.1教程,假设您在个人计算机上运行模拟。

三个 Sentinel 配置文件应如下所示:

port 5000
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

其他两个配置文件将相同,但使用 5001 和 5002 作为端口号。

上述配置有几点需要注意:

  • 主集称为mymaster。它标识主节点及其副本。由于每个主集有不同的名称,Sentinel 可以同时监控不同的主集和副本集。

  • quorum 设置为值 2(sentinel monitor配置指令的最后一个参数)。

  • down-after-milliseconds值为 5000 毫秒,即 5 秒,因此一旦我们在这段时间内没有收到来自 ping 的任何回复,就会检测到 master 失败。

启动三个 Sentinel 后,您会看到它们记录的一些消息,例如:

+monitor master mymaster 127.0.0.1 6379 quorum 2

*这是一个 Sentinel 事件,如果您使用稍后在Pub/Sub 消息* 部分 SUBSCRIBE 中指定的事件名称,您可以通过 Pub/Sub 接收此类事件。

Sentinel 在故障检测和故障转移期间生成并记录不同的事件。

#向 Sentinel 询问 master 的状态

开始使用 Sentinel 最明显的事情是检查它正在监视的 master 是否运行良好:

$ redis-cli -p 5000
127.0.0.1:5000> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "127.0.0.1"
 5) "port"
 6) "6379"
 7) "runid"
 8) "953ae6a589449c13ddefaee3538d356d287f509b"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "735"
19) "last-ping-reply"
20) "735"
21) "down-after-milliseconds"
22) "5000"
23) "info-refresh"
24) "126"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "532439"
29) "config-epoch"
30) "1"
31) "num-slaves"
32) "1"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "60000"
39) "parallel-syncs"
40) "1"

如您所见,它打印了许多关于主控的信息。有一些我们特别感兴趣的:

  1. num-other-sentinels是 2,所以我们知道 Sentinel 已经为这个 master 检测到了另外两个 Sentinel。如果您检查日志,您将看到+sentinel生成的事件。

  2. flags只是master。如果主人倒下了,我们也可以在这里看到s_downo_down标记。

  3. num-slaves正确设置为 1,因此 Sentinel 还检测到我们的 master 有一个附加的副本。

为了探索有关此实例的更多信息,您可能需要尝试以下两个命令:

SENTINEL replicas mymaster
SENTINEL sentinels mymaster


第一个将提供有关连接到主节点的副本的类似信息,第二个将提供有关其他 Sentinel 的信息。

#获取当前master的地址

正如我们已经指定的那样,Sentinel 还充当想要连接到一组主服务器和副本的客户端的配置提供程序。由于可能发生故障转移或重新配置,客户端不知道谁是给定实例集的当前活动主节点,因此 Sentinel 导出一个 API 来询问这个问题:

127.0.0.1:5000> SENTINEL get-master-addr-by-name mymaster
1) "127.0.0.1"
2) "6379"


描述如上所述。

#测试故障转移

此时,我们的玩具 Sentinel 部署已准备好进行测试。我们可以杀死我们的主人并检查配置是否改变。为此,我们可以这样做:

redis-cli -p 6379 DEBUG sleep 30

这个命令将使我们的主人不再可达,休眠 30 秒。它基本上模拟了出于某种原因悬挂的大师。

如果您检查 Sentinel 日志,您应该能够看到很多操作:

  1. 每个 Sentinel 都会通过+sdown事件检测到 master 已关闭。

  2. 此事件稍后升级为+odown,这意味着多个 Sentinel 同意 master 不可访问的事实。

  3. Sentinel 投票选出一个将启动第一次故障转移尝试的 Sentinel。

  4. 发生故障转移。

如果你再问当前的主地址是什么mymaster,最终我们这次应该会得到不同的答复:

127.0.0.1:5000> SENTINEL get-master-addr-by-name mymaster
1) "127.0.0.1"
2) "6380"

到目前为止一切顺利...此时您可以开始创建您的 Sentinel 部署,或者可以阅读更多内容以了解所有 Sentinel 命令和内部结构。

#哨兵API

Sentinel 提供了一个 API 来检查其状态、检查受监控的主服务器和副本的健康状况、订阅以便接收特定通知以及在运行时更改 Sentinel 配置。

默认情况下,Sentinel 使用 TCP 端口 26379 运行(注意 6379 是正常的 Redis 端口)。Sentinel 接受使用 Redis 协议的命令,因此您可以使用redis-cli或任何其他未修改的 Redis 客户端来与 Sentinel 对话。

可以直接查询 Sentinel 以从其角度检查受监控的 Redis 实例的状态,查看它知道的其他 Sentinel 等等。或者,使用 Pub/Sub ,每次发生某些事件(如故障转移或实例进入错误条件等)时,都可以从 Sentinel 接收推送式通知。

#哨兵命令

SENTINEL命令是 Sentinel 的主要 API。以下是其子命令的列表(在适用的情况下注明了最小版本):

  • SENTINEL CONFIG GET<name> ( >= 6.2) 获取全局 Sentinel 配置参数的当前值。指定的名称可以是通配符,类似于 Redis CONFIG GET 命令。

  • SENTINEL CONFIG SET<name> <value> ( >= 6.2) 设置全局 Sentinel 配置参数的值。

  • **SENTINEL CKQUORUM<master name>**检查当前的 Sentinel 配置是否能够达到故障转移主服务器所需的法定人数,以及授权故障转移所需的多数。此命令应用于监控系统以检查 Sentinel 部署是否正常。

  • SENTINEL FLUSHCONFIG强制 Sentinel 在磁盘上重写其配置,包括当前 Sentinel 状态。通常,Sentinel 会在其状态每次发生变化时重写配置(在重新启动后保留在磁盘上的状态子集的上下文中)。然而,有时配置文件可能会因为操作错误、磁盘故障、软件包升级脚本或配置管理器而丢失。在这些情况下,强制 Sentinel 重写配置文件的方法很方便。即使先前的配置文件完全丢失,此命令也有效。

  • **SENTINEL FAILOVER<master name>**强制进行故障转移,就好像主服务器不可访问一样,并且无需征求其他 Sentinel 的同意(但是将发布新版本的配置,以便其他 Sentinel 更新其配置)。

  • **SENTINEL GET-MASTER-ADDR-BY-NAME<master name>**返回具有该名称的主机的 ip 和端口号。如果此主服务器正在进行故障转移或成功终止,它将返回提升副本的地址和端口。

  • SENTINEL INFO-CACHE ( )从主服务器和副本服务器>= 3.2返回缓存的输出。 INFO

  • SENTINEL IS-MASTER-DOWN-BY-ADDR 从当前 Sentinel 的角度检查 ip:port 指定的主服务器是否已关闭。该命令主要供内部使用。

  • **SENTINEL MASTER<master name>**显示指定主站的状态和信息。

  • SENTINEL MASTERS显示受监控的主控列表及其状态。

  • SENTINEL MONITOR启动 Sentinel 的监控。有关详细信息,请参阅 *在运行时重新配置 Sentinel*部分

  • SENTINEL MYID ( >= 6.2) 返回 Sentinel 实例的 ID。

  • SENTINEL PENDING-SCRIPTS此命令返回有关未决脚本的信息。

  • SENTINEL REMOVE停止 Sentinel 的监控。有关详细信息,请参阅 *在运行时重新配置 Sentinel*部分

  • SENTINEL REPLICAS<master name> ( >= 5.0) 显示此主服务器的副本列表及其状态。

  • **SENTINEL SENTINELS<master name>**显示该 master 的哨兵实例列表及其状态。

  • SENTINEL SET设置 Sentinel 的监控配置。有关详细信息,请参阅 *在运行时重新配置 Sentinel*部分

  • SENTINEL SIMULATE-FAILURE (crash-after-election|crash-after-promotion|help) ( >= 3.2) 此命令模拟不同的 Sentinel 崩溃场景。

  • **SENTINEL RESET<pattern>**此命令将重置所有具有匹配名称的主机。模式参数是一个全局样式的模式。重置过程会清除 master 中的任何先前状态(包括正在进行的故障转移),并删除已发现并与 master 关联的每个副本和哨兵。

出于连接管理和管理目的,Sentinel 支持以下 Redis 命令子集:

  • ACL ( >= 6.2) 此命令管理 Sentinel 访问控制列表。有关详细信息,请参阅 ACL 文档页面和 *Sentinel 访问控制列表身份验证*

  • AUTH ( >= 5.0.1) 验证客户端连接。有关详细信息,请参阅 AUTH 命令和 *使用身份验证配置 Sentinel 实例*部分

  • CLIENT此命令管理客户端连接。有关更多信息,请参阅其子命令页面。

  • COMMAND ( >= 6.2) 此命令返回有关命令的信息。有关详细信息,请参阅该 COMMAND 命令及其各种子命令。

  • HELLO ( >= 6.0) 切换连接的协议。有关详细信息,请参阅 HELLO 命令。

  • INFO返回有关 Sentinel 服务器的信息和统计信息。有关更多信息,请参阅 INFO 命令。

  • PING这个命令只返回 PONG。

  • ROLE此命令返回字符串“sentinel”和受监控的主机列表。有关详细信息,请参阅 ROLE 命令。

  • SHUTDOWN关闭 Sentinel 实例。

最后,Sentinel 还支持、 SUBSCRIBE 和 UNSUBSCRIBE 命令。有关更多详细信息,请参阅 *发布/订阅消息* 部分 。 PSUBSCRIBEPUNSUBSCRIBE

#在运行时重新配置 Sentinel

从 Redis 版本 2.8.4 开始,Sentinel 提供了一个 API 来添加、删除或更改给定 master 的配置。请注意,如果您有多个哨兵,则应将更改应用于所有实例,以使 Redis Sentinel 正常工作。这意味着更改单个 Sentinel 的配置不会自动将更改传播到网络中的其他 Sentinel。

以下是SENTINEL用于更新 Sentinel 实例配置的子命令列表。

  • **SENTINEL MONITOR<name> <ip> <port> <quorum>**此命令告诉 Sentinel 开始监视具有指定名称、ip、端口和仲裁的新 master。它与配置文件中的sentinel monitor配置指令相同sentinel.conf,不同之处在于您不能在 as 中使用主机名ip,但您需要提供 IPv4 或 IPv6 地址。

  • **SENTINEL REMOVE<name>**用于移除指定的 master:master 将不再被监控,将完全从 Sentinel 的内部状态中移除,因此不再列出 bySENTINEL masters等等。

  • SENTINEL SET <name> <option> <value>...] SET 命令与 Redis 的命令非常相似,[CONFIG SET 用于更改特定 master 的配置参数。可以指定多个选项/值对(或根本不指定)。所有可以配置的配置参数也可以sentinel.conf使用 SET 命令进行配置。

以下是一个SENTINEL SET命令示例,用于修改down-after-milliseconds名为的主控器的配置objects-cache

SENTINEL SET objects-cache-master down-after-milliseconds 1000

如前所述,SENTINEL SET可用于设置启动配置文件中可设置的所有配置参数。此外,可以只更改主仲裁配置,而无需删除和重新添加主控,SENTINEL REMOVE后面跟着SENTINEL MONITOR,而只需使用:

SENTINEL SET objects-cache-master quorum 5

请注意,没有等效的 GET 命令,因为SENTINEL MASTER以易于解析的格式(作为字段/值对数组)提供所有配置参数。

从 Redis 6.2 版开始,Sentinel 还允许获取和设置全局配置参数,这些参数仅在之前的配置文件中支持。

  • **SENTINEL CONFIG GET<name>**获取全局 Sentinel 配置参数的当前值。指定的名称可以是通配符,类似于 Redis CONFIG GET 命令。

  • **SENTINEL CONFIG SET<name> <value>**设置全局 Sentinel 配置参数的值。

可以操作的全局参数包括:

  • resolve-hostnamesannounce-hostnames. 请参阅 *IP 地址和 DNS 名称*

  • announce-ipannounce-port. 请参阅 *Sentinel、Docker、NAT 和可能的问题*

  • sentinel-usersentinel-pass. 请参阅 *使用身份验证配置 Sentinel 实例*

#