Sentinel-Redis命令参考(二)

2015-07-24 08:40:08 · 作者: · 浏览: 2
指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的服务器下线判断。(一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线。)

如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内,对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply),那么 Sentinel 就会将这个服务器标记为主观下线。

服务器对 PING 命令的有效回复可以是以下三种回复的其中一种:

返回 +PONG 。返回 -LOADING 错误。返回 -MASTERDOWN 错误。

如果服务器返回除以上三种回复之外的其他回复,又或者在指定时间内没有回复 PING 命令,那么 Sentinel 认为服务器返回的回复无效(non-valid)。

注意,一个服务器必须在 master-down-after-milliseconds 毫秒内,一直返回无效回复才会被 Sentinel 标记为主观下线。

举个例子,如果 master-down-after-milliseconds 选项的值为 30000 毫秒(30 秒),那么只要服务器能在每 29 秒之内返回至少一次有效回复,这个服务器就仍然会被认为是处于正常状态的。

从主观下线状态切换到客观下线状态并没有使用严格的法定人数算法(strong quorum algorithm),而是使用了流言协议:如果 Sentinel 在给定的时间范围内,从其他 Sentinel 那里接收到了足够数量的主服务器下线报告,那么 Sentinel 就会将主服务器的状态从主观下线改变为客观下线。如果之后其他 Sentinel 不再报告主服务器已下线,那么客观下线状态就会被移除。

客观下线条件只适用于主服务器:对于任何其他类型的 Redis 实例,Sentinel 在将它们判断为下线前不需要进行协商,所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。

只要一个 Sentinel 发现某个主服务器进入了客观下线状态,这个 Sentinel 就可能会被其他 Sentinel 推选出,并对失效的主服务器执行自动故障迁移操作。

每个 Sentinel 都需要定期执行的任务

每个 Sentinel 以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值,那么这个实例会被 Sentinel 标记为主观下线。一个有效回复可以是: +PONG -LOADING 或者 -MASTERDOWN 。如果一个主服务器被标记为主观下线,那么正在监视这个主服务器的所有 Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。如果一个主服务器被标记为主观下线,并且有足够数量的 Sentinel (至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断,那么这个主服务器被标记为客观下线。在一般情况下,每个 Sentinel 会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。当一个主服务器被 Sentinel 标记为客观下线时,Sentinel 向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。当没有足够数量的 Sentinel 同意主服务器已经下线,主服务器的客观下线状态就会被移除。当主服务器重新向 Sentinel 的 PING 命令返回有效回复时,主服务器的主管下线状态就会被移除。

自动发现 Sentinel 和从服务器

一个 Sentinel 可以与其他多个 Sentinel 进行连接,各个 Sentinel 之间可以互相检查对方的可用性,并进行信息交换。

你无须为运行的每个 Sentinel 分别设置其他 Sentinel 的地址,因为 Sentinel 可以通过发布与订阅功能来自动发现正在监视相同主服务器的其他 Sentinel ,这一功能是通过向频道 __sentinel__:hello 发送信息来实现的。

与此类似,你也不必手动列出主服务器属下的所有从服务器,因为 Sentinel 可以通过询问主服务器来获得所有从服务器的信息。

每个 Sentinel 会以每两秒一次的频率,通过发布与订阅功能,向被它监视的所有主服务器和从服务器的 __sentinel__:hello 频道发送一条信息,信息中包含了 Sentinel 的 IP 地址、端口号和运行 ID (runid)。每个 Sentinel 都订阅了被它监视的所有主服务器和从服务器的 __sentinel__:hello 频道,查找之前未出现过的 sentinel (looking for unknown sentinels)。当一个 Sentinel 发现一个新的 Sentinel 时,它会将新的 Sentinel 添加到一个列表中,这个列表保存了 Sentinel 已知的,监视同一个主服务器的所有其他 Sentinel 。Sentinel 发送的信息中还包括完整的主服务器当前配置(configuration)。如果一个 Sentinel 包含的主服务器配置比另一个 Sentinel 发送的配置要旧,那么这个 Sentinel 会立即升级到新配置上。在将一个新 Sentinel 添加到监视主服务器的列表上面之前,Sentinel 会先检查列表中是否已经包含了和要添加的 Sentinel 拥有相同运行 ID 或者相同地址(包括 IP 地址和端口号)的 Sentinel ,如果是的话,Sentinel 会先移除列表中已有的那些拥有相同运行 ID 或者相同地址的 Sentinel ,然后再添加新 Sentinel 。

Sentinel API

在默认情况下,Sentinel 使用 TCP 端口 26379(普通 Redis 服务器使用的是 6379 )。

Sentinel 接受 Redis 协议格式的命令请求,所以你可以使用 redis-cli 或者任何其他 Redis 客户端来与 Sentinel 进行通讯。

有两种方式可以和 Sentinel 进行通讯:

第一种方法是通过直接发送命令来查询被监视 Redis 服务器的当前状态,以及 Sentinel 所知道的关于其他 Sentinel 的信息,诸如此类。另一种方法是使用发布与订阅功能,通过接收 Sentinel 发送的通知:当执行故障转移操作,或者某个被监视的服务器被判断为主观下线或者客观下线时,Sentinel 就会发送相应的信息。

Sentinel 命令

以下列出的是 Sentinel 接受的命令:

PING :返回 PONGSENTINEL masters :列出所有被监视的主服务器,以及这些主服务器的当前状态。 SENTINEL slaves :列出给定主服务器的所有从服务器,以及这些从服务器的当前状态。 SENTINEL get-master-addr-by-name :返回给定名字的主服务器的 IP 地址和端口号。如果这个主服务器正在执行故障转移操作,或者针对这个主服务器的故障转移操作已经完成,那么这个命令返回新的主服务器的 IP 地址和端口号。 SENTINEL reset :重置所有名字和给定模式 pattern