目录
一、Sentinel
1. 何为Sentinel
- Sentinel是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求;
- Sentinel实例本质上是一个运行在特殊模式下的Redis服务器;
- 和普通服务器不同,Sentinel在启动时会将一部分普通Redis服务器使用的代码替换成Sentinel专用代码,所以Sentinel不支持一些普通服务器使用的功能:
功能 | 使用情况 |
---|---|
数据库和键值对方面的命令,比如SET、DEL、FLUSHDB | 不使用 |
事务命令,比如MULTI 和 WATCH | 不使用 |
脚本命令,比如 EVAL | 不使用 |
RDB持久化命令,比如SAVE和BGSAVE | 不使用 |
AOF持久化命令,比如BGREWRITEAOF | 不使用 |
复制命令,比如 SLAVEOF | Sentinel内部可以使用,但是客户端不可以使用 |
- Sentinel使用的服务器命令表和普通服务器也不同,命令表里没有
SET
、DBSIZE
、EVAL
等这些命令,所以Sentinel不能执行这些命令; - 客户端可以对Sentinal执行的命令有7个:
PING
、SENTINEL
、INFO
、SUBSCRIBE
、UNSUBSCRIBE
、PSUBSCRIBE
、PUNSUBSCRIBE
; - 客户端可以对Sentinel执行的命令:是指通过客户端连接Sentinal服务器后,可以对Sentinel执行的命令;
- Sentinel内部执行的命令:是指Sentinel向其他服务器(主服务器、从服务器、Sentinel)发送的命令。例如,Sentinel需要监听主从服务器和连接其他的Sentinel服务器,在主服务器下线后,需要执行
Slaveof no one
命令将其中一个从服务器设置为新的主服务器,并且执行Slaveof
命令让其他的从服务器复制这个新的主服务器,这些命令都是在Sentinel内部执行的命令;
2. Sentinel启动流程
启动一个Sentinel可以使用以下两个命令中的任一个:
[shell]$ redis-sentinel sentinel.conf
[shell]$ redis-server sentinel.conf --sentinel
两种模式都是加载sentinel.conf
配置文件启动Sentinel,sentinel.conf
配置文件配置了如下信息:
# 监听的端口号
port 26379
# 是否以后台模式运行
daemonize no
#####################
# master1 configure #
#####################
# 监视的主服务器名称、地址、端口号、客观下线所需要的票数
# SENTINEL monitor <master-name> <ip> <port> <quorum>
# <master-name>:主服务器命令
# <quorum>:判断这个实例客观下线需要的投票数
sentinel monitor master1 192.168.1.2 6379 2
# 实例无响应多少毫秒之后才会被判断为主观下线
# SENTINEL down-after-millisecondes <master-name> <ms>
sentinel down-after-millisecondes master1 30000
# 在执行故障转移操作时,可以同时对新的主服务器进行同步的从服务器数量
# SENTINEL parallel-syncs <master-name> <number>
sentinel parallel-syncs master1 1
# 刷新故障迁移状态的最大时限
# SENTINEL failover-timeout <master-name> <ms>
sentinel failover-timeout master1 900000
#####################
# master2 configure #
#####################
sentinel monitor master2 192.168.1.3 6379 2
sentinel down-after-millisecondes master2 30000
sentinel parallel-syncs master2 1
sentinel failover-timeout master2 900000
- Sentinel启动的服务器默认端口号是
26379
; - 一个Sentinel可以同时监视多个Master;
当一个Sentinel启动时,它需要执行以下步骤:
- 初始化服务器;
- 将普通Redis服务器使用的代码替换成Sentinel专用代码;
- 初始化Sentinel状态;
- 根据给定的配置文件,初始化Sentinel的监视主服务器列表;
- 创建连向主服务器的网络连接;
2.1 初始化服务器
- Sentinel本质上只是一个运行在特殊模式下的Redis服务器,所以启动Sentinel的第一步,就是初始化一个普通的Redis服务器;
- 因为Sentinel并不使用数据库,所以初始化Sentinel时就不会载入RDB文件或者AOF文件;
2.2 使用Sentinel专用代码
启动Sentinel的第二步就是将一部分普通Redis服务器使用的代码替换成Sentinel专用代码:
- 使用
REDIS_SENTINEL_PORT
常量的值作为服务器端口,普通服务器使用的是REDIS_SEVERPORT
的值,即普通服务器默认端口是6379
,Sentinel服务器默认端口是26379
; - 使用
sentinelcmds
的值作为服务器的命令表,并且其中的INFO
命令会使用Sentinel模式下的专用实现;sentinelcmds
命令表只有7个命令,所以客户端只能对Sentinel服务器执行这7个命令
struct redis