启动Sentinel
在了解了 Redis Sentinel 的基本作用之后,现在让我们来学习一下如何启动 Redis Sentinel 并让它去监视指定的主服务器。
Redis Sentinel 的程序文件名为 redis-sentinel,它通常和普通 Redis 服务器 redis-server 位于同一个文件夹。因为用户需要在配置文件中指定想要被 Sentinel 监视的主服务器,并且 Sentinel 也需要在配置文件中写入信息以记录主从服务器的状态,所以用户在启动 Sentinel 的时候必须传入一个可写的配置文件作为参数,就像这样:
$ redis-sentinel /etc/sentinel.conf
如果用户给定的配置文件是不可写的,那么 Sentinel 将放弃启动并报告一个错误。
一个 Sentinel 配置文件至少需要包含以下选项,用于指定 Sentinel 要监视的主服务器:
sentinel monitor <master-name> <ip> <port> <quorum>
选项中的 master-name 参数用于指定主服务器的名字,这个名字在执行各种 Sentinel 操作的时候会经常用到;ip 参数和 port 参数用于指定主服务器的 IP 地址和端口号;而 quorum 参数则用于指定判断这个主服务器下线所需的 Sentinel 数量。
举个例子,如果我们要监视主服务器 127.0.0.1:6379,并在 Sentinel 中将它命名为 website_db,那么可以在配置文件 sentinel.conf 里面包含以下选项:
sentinel monitor website_db 127.0.0.1 6379 1
因为我们目前只启动了一个 Sentinel,所以 quorum 参数的值被设置成了 1。也就是说,只要有一个 Sentinel 认为 website_db 主服务器下线了,Sentinel 就可以对 website_db 实施故障转移了。

图19-2 展示了 Sentinel 在启动之后,监视主服务器 6379 及其从服务器时的样子,而以下则是 Sentinel 在运行时打印出的日志:
$ redis-sentinel sentinel.conf
17866:X 21 Jun 2019 15:30:08.424 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
17866:X 21 Jun 2019 15:30:08.424 # Redis version=999.999.999, bits=64, commit=0cabe0cf, modified
=0, pid=17866, just started
17866:X 21 Jun 2019 15:30:08.424 # Configuration loaded
17866:X 21 Jun 2019 15:30:08.426 * Increased maximum number of open files to 10032 (it was origi
nally set to 256).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 999.999.999 (0cabe0cf/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 17866
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
17866:X 21 Jun 2019 15:30:08.429 # Sentinel ID is 9bba1b7b335d24d8a27f146e1fc3022911244892
17866:X 21 Jun 2019 15:30:08.429 # +monitor master website_db 127.0.0.1 6379 quorum 1
17866:X 21 Jun 2019 15:30:08.430 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ website_db 127.0
.0.1 6379
17866:X 21 Jun 2019 15:30:08.431 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ website_db 127.0
.0.1 6379
从日志可以看到,Sentinel 首先监视了我们指定的主服务器 127.0.0.1:6379,然后又自动发现并监视了它的两个从服务器 127.0.0.1:6380 和 127.0.0.1:6381 。
因为 Sentinel 开始监视一个主服务器之后,就会去获取被监视主服务器的从服务器名单,并根据名单对各个从服务器实施监视,整个过程是完全自动的,所以用户只需要输入待监视主服务器的地址就可以了,并不需要输入从服务器的地址。除此之外,Sentinel 还会对每个被监视的主从服务器实施心跳检测,并记录各个服务器的在线状态、响应速度等信息,当 Sentinel 发现被监视的主服务器进入下线状态时,它就会开始对下线的主服务器实施故障转移。
举个例子,如果我们故意杀死主服务器 6379,那么 Sentinel 将检测到 6379 已下线,并从 6380 和 6381 这两个从服务器之间选出一个新的主服务器,然后重新构建一个主从服务器连接。
redis-sentinel和redis-server之间的关系
因为 Redis Sentinel 实际上就是一个运行在特殊模式下的 Redis 服务器,所以用户也可以使用命令 redis-server sentinel.conf --sentinel
去启动一个 Sentinel:这里的 --sentinel 参数用于指示 Redis 服务器进入 Sentinel 模式,从而变成一个 Redis Sentinel 而不是普通的 Redis 服务器。
同时监视多个主服务器
一个 Sentinel 可以监视任意数量的主服务器,而不是仅仅监视一个主服务器。如果用户想要使用 Sentinel 去监视多个主服务器,那么只需要在配置文件中指定多个 sentinel monitor 选项,并为每个被监视的主服务器设置不同的名字即可,例如:
sentinel monitor website_db 127.0.0.1 6379 1
sentinel monitor api_db 192.168.0.5 6379 1
sentinel monitor background_job_db 192.168.0.101 6379 1
设置从服务器优先级
用户可以通过 replica-priority 配置选项来设置各个从服务器的优先级,优先级较高的从服务器在 Sentinel 选择新主服务器的时候会优先被选择。
replica-priority 的默认值为 100,这个值越小,从服务器的优先级就越高。举个例子,如果现在有 3 个从服务器,它们的优先级分别为 100、50 和 10,那么 Sentinel 将优先选用优先级为 10 的从服务器作为新的主服务器。
通过这个配置选项,用户可以给性能较高的从服务器设置较高的优先级来尽可能地保证新主服务器的性能。因为主服务器在下线并重新上线之后也会变成从服务器,所以用户也应该为主服务器设置相应的优先级。
replica-priority 值为 0 的从服务器永远不会被选为主服务器,用户可以通过这一设置将不适合用作主服务器的从服务器排除在新主服务器的候选名单之外。
新主服务器的挑选规则
当 Sentinel 需要在多个从服务器中选择一个作为新的主服务器时,首先会根据以下规则从候选名单中剔除不符合条件的从服务器:
-
否决所有已经下线以及长时间没有回复心跳检测的疑似已下线从服务器。
-
否决所有长时间没有与主服务器通信,数据状态过时的从服务器。
-
否决所有优先级为 0 的从服务器。
然后根据以下规则,在剩余的候选从服务器中选出新的主服务器:
-
优先级最高的从服务器获胜。
-
如果优先级最高的从服务器有两个或以上,那么复制偏移量最大的那个从服务器获胜。
-
如果符合上述两个条件的从服务器有两个或以上,那么选出它们当中运行 ID(运行 ID 是服务器启动时自动生成的随机 ID,这条规则可以确保条件完全相同的多个从服务器最终得到一个有序的比较结果)最小的那一个。