IP 地址和 DNS 名称
旧版本的 Sentinel 不支持主机名,并且需要在任何地方指定 IP 地址。从 6.2 版开始,Sentinel提供对主机名的可选支持。
默认情况下禁用此功能。如果您要启用 DNS/主机名支持,请注意:
Redis 和 Sentinel 节点上的名称解析配置必须可靠并且能够快速解析地址。地址解析的意外延迟可能会对 Sentinel 产生负面影响。
您应该在任何地方使用主机名,并避免混淆主机名和 IP 地址。为此,请分别对所有 Redis 和 Sentinel 实例使用replica-announce-ip <hostname>
和sentinel announce-ip <hostname>
。
启用resolve-hostnames
全局配置允许 Sentinel 接受主机名:
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"
如您所见,它打印了许多关于主控的信息。有一些我们特别感兴趣的:
num-other-sentinels
是 2,所以我们知道 Sentinel 已经为这个 master 检测到了另外两个 Sentinel。如果您检查日志,您将看到+sentinel
生成的事件。
flags
只是master
。如果主人倒下了,我们也可以在这里看到s_down
或o_down
标记。
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 日志,您应该能够看到很多操作:
每个 Sentinel 都会通过+sdown
事件检测到 master 已关闭。
此事件稍后升级为+odown
,这意味着多个 Sentinel 同意 master 不可访问的事实。
Sentinel 投票选出一个将启动第一次故障转移尝试的 Sentinel。
发生故障转移。
如果你再问当前的主地址是什么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
命令。有关更多详细信息,请参阅 *发布/订阅消息*
部分 。 PSUBSCRIBE
、PUNSUBSCRIBE
在运行时重新配置 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 还允许获取和设置全局配置参数,这些参数仅在之前的配置文件中支持。
可以操作的全局参数包括:
resolve-hostnames
, announce-hostnames
. 请参阅 *IP 地址和 DNS 名称*
。
announce-ip
, announce-port
. 请参阅 *Sentinel、Docker、NAT 和可能的问题*
。
sentinel-user
, sentinel-pass
. 请参阅 *使用身份验证配置 Sentinel 实例*
。