Redis 高可用之Sentinel

前言

Redis-Sentinel是Redis官方推荐的高可用方案。Redis的主从复制方案时,假如master宕机了,是无法自动主备切换到slave的,而Redis-sentinel是一个独立运行的进程,它能监控Redis主从集群,发现master宕机后能进行自动切换。

由于sentinel本身也存在单点问题, 所以,使用单个sentinel来监控redis是不可靠的。通常我们会使用sentinel集群来监控redis。

机制

与普通集群不同,你不用告诉sentinel其他sentinel的地址,sentinel可以通过redis的发布与订阅功能来自动发现正在监视相同主实例的其他sentinel。同样的,你也不必手动列出redis主实例属下的所有从实例,sentinel可以通过查询redis主实例来获得所有从实例的配置信息。

高可用原理:

  • 启动N个Sentinel实例,这些Sentinel实例会去监控你指定的Redis Master/Slaves。
  • 当Redis Master节点挂掉后,Sentinel实例通过ping检测失败发现这种情况就认为该节点进入 SDOWN状态,也就是检测的Sentinel实例主观地(Subjectively)认为该Redis Master节点已经挂掉(但可能是网络等原因造成的,并不是真正挂掉)。
  • 当一定数目(由Quorum参数设定)Sentinel实例都认为该Master挂掉的情况下,该节点将转换进入ODOWN状态,也就是客观地(Objectively)挂掉的状态(此时该Master已经大概率不可用)。
  • 接下来Sentinel实例之间发起选举,选择其中一个Sentinel实例发起failover过程:从Slave中选择一台作为新的Master,让其它Slave从新的Master复制数据,并通过Pub/Sub发布事件。
  • 使用者客户端从任意Sentinel实例获取Redis配置信息,并监听(可选)Sentinel发出的事件: SDOWN, ODOWN以及failover等,并做相应主从切换(通过更新redis配置和修改redis.conf配置文件完成)。

测试

1.启动两个redis进程,监听不同的端口,主(6379)从(6380)复制

注意:如果master有密码,slave需要配置master密码

redis-server /etc/redis.conf
redis-server /etc/redis-slave.conf

查看日志,主从配置成功

redis-master-slave
redis master-slave高可用日志

2.修改sentinel配置文件/etc/redis-sentinel.conf和/etc/redis-sentinel2.conf, 分别监听26379和26380端口

# 当前sentinel进程监听的端口
port 26379
# sentinel监控的redis进程ip及端口号,最后的2表示需要两个sentinel判断mymaster挂了,才认为它不可用
sentinel monitor mymaster 127.0.0.1 6379 2
# 如果redis master设置了密码,也需要告知sentinel
sentinel auth-pass mymaster MYDEMOPASSWORD
# 指定failover时,最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover的时间越长,但如果这个数字越大,那就意味着越多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的同步状态。
sentinel parallel-syncs mymaster 1

3.启动两个sentinel进程

redis-sentinel /etc/redis-sentinel.conf

查看sentinel日志

sentinel-log
sentinel日志
redis-sentinel /etc/redis-sentinel.conf

再次查看sentinel日志

sentinel-log2
sentinel-log2

4.杀死redis master进程(6379)

5.查看sentinel failover日志

sentinel-failover
sentinel-failover日志

6.重新启动redis, 监听6379端口 redis-server /etc/redis.conf

注意:此时,sentinel监听到6379端口的redis重新可用,会让6379端口的redis变成6380的slave(/etc/redis.conf配置也被修改),请看sentinel日志

sentinel-failover2
sentinel-failover2

redis日志也印证了这一点

redis-resync
redis-resync

sentinel仲裁

当failover主从切换真正被触发后,failover并不会马上进行,还需要sentinel中的大多数sentinel授权后才可以进行failover。
当ODOWN时,failover被触发。failover一旦被触发,尝试去进行failover的sentinel会去获得“大多数”sentinel的授权(如果sentinel monitor中配置的票数比大多数还要大的时候,则需要询问更多的sentinel)
这个区别看起来很微妙,但是很容易理解和使用。例如,集群中有5个sentinel,票数被设置为2,当2个sentinel认为一个master已经不可用了以后,将会触发failover,但是,进行failover的那个sentinel必须先获得至少3个sentinel的授权才可以实行failover。
如果票数被设置为5,要达到ODOWN状态,必须所有5个sentinel都主观认为master为不可用,要进行failover,那么得获得所有5个sentinel的授权。

客户端用法

客户端不再直接连接redis,而是连接到sentinel,通过sentinel获取到当前的master和slaves 列表,然后再进行使用。

sentinel-redis-info
sentinel-redis-info

参考文档:

https://redis.io/topics/sentinel

http://debugo.com/redis-sentinel/

https://segmentfault.com/a/1190000002680804

http://www.yunweipai.com/archives/20444.html

%1 $ S

发表回复