redis的Sentinel系统主要用于管理多个Redis服务器,是Redis Server的一个特殊工作模式,该系统执行以下三个任务:
监控: sentinel会不断监控Redis的主服务器和从服务器运作是否正常。当某个Redis服务器出现问题时,sentinel会通过API向应用程序或管理员发送通知
自动故障迁移(automatic failover): 当一个主服务器出现问题时,sentinel会发起一次自动故障迁移动作,它会将失效的主服务器的一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器成为新的主服务器的从服务器。通过sentinel集群可以查询到新的主服务器的地址
Redis Sentinel是一个分布式系统,你可以在一个架构中运行多个sentinel,这些进程使用gossip 协议来接受主服务器是否下线的信息。并且使用投票协议来决定是否执行自动故障迁移,以及选择哪个从服务器成为新的主服务器。
启动Redis Sentinel
之前说过,Redis Sentinel是一个运行在特殊模式下的redis server。因此,可以用redis-server来启动sentinel:
redis-server /path/to/sentinel.conf --sentinel
启动sentinel实例必须指定响应的配置文件,或者指定的配置文件不可写,那么sentinel会拒绝启动。
配置sentinel
启动一个sentinel需要的最小配置如下:
sentinel monitor mymaster 127.0.0.1 6379 2
表示去监视一个名为mymaster的主服务器,这个主服务器的ip地址和端口,最后一个是将主服务器判断为失效至少需要一个sentinel同意。只要同意sentinel的数量不达标,自动故障迁移就不会执行
sentinel down-after-milliseconds mymaster 60000
sentinel认为服务器已经断线所需的毫秒数
sentinel failover-timeout mymaster 180000
sentinel执行一次failover的超时时间
sentinel parallel-syncs mymaster 1
指定了在故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步。这个数字越小,完成故障转移所需的时间就越长。
主观下线和客观下线
redis sentinel关于下线有两个不同的概念:
主观下线:指的是单个sentinel实例对服务器做出的下线判断
如果一个服务器没有在down-after-milliseconds选项指定的时间内,对向它发送ping命令的sentinel返回一个有效回复,那么sentinel则认定这台服务器主观下线
客观下线:指的是多个sentinel实例在对同一个master做出主观下线判断,并且通过sentinel is-master-down-by-addr命令互相交流后,得出的服务器下线判断。
sentinel通过流言协议来判断master是否客观下线,一旦sentinel获得足够数量的服务器主观下线,那么它将认定服务器客观下线。客观下线只适用于master。
Sentinel定时执行的任务
1.每个sentinel以每秒一次的频率向它所知的主服务器,从服务器以及其他sentinel实例发送一个ping命令
2.如果一个master超时未响应,会被标记为主观下线
3.如果master被标记为主观下线,那么正在监视这个master的所有sentinel都要以每秒一次的频率确认主服务器的确进入了主观下线状态
4.判断主服务器是否进入了客观下线
5.当没有足够的sentinel同意master主观下线,master的客观下线状态会被移除
6.自动发现sentinel和从服务器
Sentinel命令
sentinel的端口是26379,可以通过redis-cli连接sentinel,sentinel支持以下命令:
1.ping 返回pong
2.sentinel masters 列出所有被监视的主服务器
3.sentinel slaves 列出给定主服务器的所有从服务器,以及这些从服务器的当前状态
4.sentinel get-master-addr-by-name 返回给定名字的主服务器的ip和端口号
5.sentinel reset 重置所有名字和给定模式pattern相匹配的主服务器
6.sentinel failover 在master失效的情况下,强制一次开始自动故障迁移
故障转移
一次故障转移操作由一下步骤组成:
1.发现主服务器已经进入客观下线状态
2.对当前epoch进行自增,并尝试在这个epoch当选为主
3.如果当选失败,在设定的故障迁移超时时间的两倍之后,重新尝试当选。如果当选成功,执行以下步骤:
a 选出一个从服务器,并将它升级为master(发slave of no one)
b 通过发布和订阅功能,将更新后的配置传给其他的sentinel
c 向其他从服务器发送slaveof命令,让他们去复制新的master
d 当所有从服务器都已近开始复制新的主服务器时,leader sentinel终止这次故障迁移操作
sentinel使用如下规则选择新的master:
1.选择复制偏移量最大的从服务器成为新的主服务器,如果复制偏移量不可用或者相同,则选择id最小的那个从服务器成为新的主服务器。
sentinel使用Raft算法来选举leader,执行故障迁移。