在线配置Sentinel

在 Redis 2.8.4 版本以前,Redis Sentinel 只能通过载入配置文件来修改配置选项。如果用户想要修改针对主服务器的某个配置选项,那么就只能先停止 Sentinel,接着修改配置文件,然后再重启 Sentinel 并载入修改后的配置文件。

手动修改配置文件并重启的做法不仅麻烦、容易出错,而且在运行过程中停止 Sentinel 还可能导致主服务器失去有效的监控。为此,Redis 从 2.8.4 版本开始为 SENTINEL 命令新添加了一组子命令,这些子命令可以在线地修改 Sentinel 对于被监视主服务器的配置选项,并把修改之后的配置选项保存到配置文件中,整个过程完全不需要停止 Sentinel,也不需要手动修改配置文件,非常方便。

接下来就将对这些在线配置命令进行介绍。

SENTINEL monitor:监视给定主服务器

通过执行以下命令,用户可以让 Sentinel 开始监视一个新的主服务器:

SENTINEL monitor <master-name> <ip> <port> <quorum>

SENTINEL monitor 命令本质上就是 SENTINEL monitor 配置选项的命令版本,当我们想要让 Sentinel 监视一个新的主服务器,但是又不想重启 Sentinel 并手动修改 Sentinel 配置文件时就可以使用这个命令。

比如,我们可以通过执行以下命令,让 Sentinel 26379 开始监视名为 message_queue_db 的主服务器,这个主服务器目前的 IP 地址为 127.0.0.1 ,端口号为 10086:

127.0.0.1:26379> SENTINEL monitor message_queue_db 127.0.0.1 10086 2
OK

在此之后,如果我们执行 SENTINEL masters 命令,就会看到 Sentinel 现在除了监视着 website_db 主服务器之外,还监视着 message_queue_db 主服务器:

127.0.0.1:26379> SENTINEL masters
1) 1) "name"
2) "message_queue_db"
3) "ip"
4) "127.0.0.1"
5) "port"
6) "10086"
...
39) "parallel-syncs"
40) "1"
2) 1) "name"
2) "website_db"
3) "ip"
4) "127.0.0.1"
5) "port"
6) "6379"
...
39) "parallel-syncs"
40) "1"

其他信息

  • 复杂度:O(1)。

  • 版本要求:SENTINEL monitor 命令从 Redis 2.8.4 版本开始可用。

SENTINEL remove:取消对给定主服务器的监视

当用户想要在线取消 Sentinel 对某个主服务器的监视时,可以使用以下命令:

SENTINEL remove <masters-name>

接收到这个命令的 Sentinel 会停止对给定主服务器的监视,并删除 Sentinel 内部以及 Sentinel 配置文件中与给定主服务器有关的所有信息,然后返回 OK 表示操作执行成功。

在 19.4.1 节中,我们通过使用 SENTINEL monitor 命令,让 Sentinel 开始监视 message_queue_db 主服务器。现在,我们也可以通过执行以下命令,让 Sentinel 取消对 message_queue_db 主服务器的监视:

127.0.0.1:26379> SENTINEL remove message_queue_db
OK

在执行了这个命令之后,message_queue_db 主服务器就会从 Sentinel 的监视名单中消失,现在 Sentinel 只会继续监视 website_db 主服务器:

127.0.0.1:26379> SENTINEL masters
1) 1) "name"
2) "website_db"
3) "ip"
4) "127.0.0.1"
5) "port"
6) "6379"
...
39) "parallel-syncs"
40) "1"

其他信息

  • 复杂度:O(1)。

  • 版本要求:SENTINEL remove 命令从 Redis 2.8.4 版本开始可用。

SENTINEL set:修改Sentinel配置选项的值

通过使用以下命令,用户可以在线修改 Sentinel 配置文件中与主服务器相关的配置选项值:

SENTINEL set <master-name> <option> <value>

只要是 Sentinel 配置文件中与主服务器有关的配置选项,都可以使用 SENTINEL set 命令在线进行配置。命令在成功修改给定的配置选项值之后将返回 OK 作为结果。

举个例子,在 Sentinel 26379 的配置选项中,website_db 主服务器的 quorum 选项的值为 2:

127.0.0.1:26379> SENTINEL masters
1) 1) "name"
2) "website_db"
...
35) "quorum"
36) "2"
...
39) "parallel-syncs"
40) "1"

现在,如果我们想要将这个选项的值修改为 3,那么可以执行以下命令:

127.0.0.1:26379> SENTINEL set website_db quorum 3
OK

在执行以上命令之后,我们可以通过再次查看 website_db 的配置选项来确认修改已经发生:

127.0.0.1:26379> SENTINEL masters
1) 1) "name"
2) "website_db"
...
35) "quorum"
36) "3"
...
39) "parallel-syncs"
40) "1"

其他信息

  • 复杂度:O(1)。

  • 版本要求:SENTINEL set 命令从 Redis 2.8.4 版本开始可用。

使用在线配置命令的注意事项

需要注意的是,以上介绍的各个在线配置命令只会对接收到命令的单个 Sentinel 生效,但并不会对同一个 Sentinel 网络的其他 Sentinel 产生影响。为了将新的配置选项传播给整个 Sentinel 网络,用户需要对同一个 Sentinel 网络中的所有 Sentinel 都执行相同的命令。

举个例子,在 19.4.3 节中,我们通过向 Sentinel 26379 发送 SENTINEL set website_db quorum 3 命令,把该 Sentinel 对于 website_db 主服务器的 quorum 值修改成了 3,但这个修改只对 Sentinel 26379 有效,Sentinel 网络中的其他两个 Sentinel——Sentinel 26380 和 Sentinel 26381 的 quorum 值仍然是 2。为了让整个 Sentinel 网络的所有 Sentinel 都拥有相同的 quorum 值,我们必须向剩下的两个 Sentinel 发送相同的 SENTINEL set 命令:

127.0.0.1:26380> SENTINEL set website_db quorum 3
OK
127.0.0.1:26381> SENTINEL set website_db quorum 3
OK

现在,Sentinel 网络中的 3 个 Sentinel 都把自身对于 website_db 主服务器的 quorum 值设置成了 3。

Sentinel网络中的各个Sentinel可以拥有不同的quorum值

Redis Sentinel 允许用户为 Sentinel 网络中的每个 Sentinel 分别设置主服务器的 quorum 值,而不是让所有 Sentinel 都共享同一个 quorum 值,这种做法使得用户可以在有需要时,灵活地根据各个 Sentinel 所处的环境来调整自己的 quorum 值。

举个例子,如果一部分 Sentinel 与被监视主服务器的网络连接情况较好,或者两者在网络上的距离较近,那么这些 Sentinel 对于主服务器的下线判断就会更为准确,用户就可以把它们的 quorum 值调得小一些,使得这些 Sentinel 可以快速地对下线的主服务器进行故障转移。

相反,如果一部分 Sentinel 与被监视主服务器的网络连接情况较差,或者两者在网络上的距离较远,那么这些 Sentinel 对于主服务器的下线判断的准确性就会差一些,如果把它们的 quorum 值设置得太小,可能会错误地触发故障转移操作。为此,用户可以把这些 Sentinel 的 quorum 值调大一些,确保只有在多个 Sentinel 都认为主服务器已下线时,才执行故障转移操作。

示例:使用redis-py管理Sentinel

在学习了如何通过命令控制 Sentinel 之后,现在让我们来了解一下如何使用 redis-py 客户端连接 Sentinel 并执行相应的操作。

redis-py 把相应的 Sentinel 支持代码放到了 redis.sentinel 包中,为了使用 Sentinel 相关功能,我们必须先在 Python 中导入这个包:

>>> from redis.sentinel import Sentinel

然后根据 Sentinel 的 IP 地址和端口号创建出相应的 Sentinel 实例:

>>> sentinel = Sentinel([('localhost', 26379)])

在拥有 Sentinel 实例之后,就可以调用它的 discover_master() 方法以及 discover_slaves() 方法,查看给定主服务器的地址以及其从服务器的地址:

>>> sentinel.discover_master('website_db')
('127.0.0.1', 6379)
>>> sentinel.discover_slaves('website_db')
[('127.0.0.1', 6380), ('127.0.0.1', 6381)]

在有需要的情况下,我们也可以通过 Sentinel 直接获得主服务器或者从服务器的客户端实例,这样就可以直接对被监视的主从服务器执行命令操作了。其中,获取主服务器实例的操作可以通过 master_for() 方法完成:

>>> master = sentinel.master_for('website_db', decode_responses=True)
>>> master.set("msg", "hello world!")
True

而获取从服务器实例的操作则可以通过 slave_for() 方法完成:

>>> slave = sentinel.slave_for('website_db', decode_responses=True)
>>> slave.get('msg')
'hello world!'

除了上述方法之外,redis-py 的 Sentinel 实例还提供了 check_master_state()、discover_master() 和 filter_slaves() 等其他方法,它们的具体用法在内嵌的文档中都有详细的说明,此处不一一赘述。