Redis哨兵模式(Sentinel)详解

目录

文章目录

  • 一、Sentinel
    • 1. 何为Sentinel
    • 2. Sentinel启动流程
        • 当一个Sentinel启动时,它需要执行以下步骤:
      • 2.1 初始化服务器
      • 2.2 使用Sentinel专用代码
      • 2.3 初始化Sentinel状态
      • 2.4 初始化Sentinel状态的masters属性
      • 2.5 创建连向主服务器的网络连接
    • 3. Sentinel获取主服务器信息
    • 4. Sentinel获取从服务器信息
    • 5. Sentinel与主从服务器的发送和订阅信息
        • 向主服务器和从服务器发送信息
        • 接收来自主服务器和从服务器的频道信息
    • 6. Sentinel获取其他Sentinel信息
    • 7. 总结
  • 二、Sentinel模型结构
    • 1. Sentinel+Master+Slave之间的数据结构
        • `sentinelState`记录`Sentinel`监视的主服务器
        • 主服务器记录从属的从服务器
        • 主服务器记录所有监视自己的Sentinel
        • 服务器名字
        • 数据结构
    • 2. Sentinel+Master+Slave之间的连接结构
  • 三、Sentinel监测与故障转移
    • 1. 检测主观下线状态
    • 2. 检测客观下线状态
    • 3. 选举领头Sentinel
    • 4. 故障转移
        • 挑选新的主服务器
  • 参考文献

一、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使用的服务器命令表和普通服务器也不同,命令表里没有SETDBSIZEEVAL等这些命令,所以Sentinel不能执行这些命令;
  • 客户端可以对Sentinal执行的命令有7个:PINGSENTINELINFOSUBSCRIBEUNSUBSCRIBEPSUBSCRIBEPUNSUBSCRIBE;
  • 客户端可以对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    
# :主服务器命令
# :判断这个实例客观下线需要的投票数
sentinel monitor master1 192.168.1.2 6379 2

# 实例无响应多少毫秒之后才会被判断为主观下线
# SENTINEL down-after-millisecondes  
sentinel down-after-millisecondes master1 30000

# 在执行故障转移操作时,可以同时对新的主服务器进行同步的从服务器数量
# SENTINEL parallel-syncs  
sentinel parallel-syncs master1 1

# 刷新故障迁移状态的最大时限
# SENTINEL failover-timeout  
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启动时,它需要执行以下步骤:
  1. 初始化服务器;
  2. 将普通Redis服务器使用的代码替换成Sentinel专用代码;
  3. 初始化Sentinel状态;
  4. 根据给定的配置文件,初始化Sentinel的监视主服务器列表;
  5. 创建连向主服务器的网络连接;

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个命令

你可能感兴趣的:(Redis,redis)