Redis(十)哨兵模式
2022-09-22 22:46:38

为什么需要哨兵?

当主服务宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费时费力,还会造成一段时间内服务不可用,这不是一种推荐的方式

Redis从2.8开始正式提供了Sentinel(哨兵)架构来解决这个问题。它能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

哨兵具体是什么?

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,他会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例

image.png

这里的哨兵有两个作用

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器
  • 当哨兵检测到Master宕机,会自动将Slave切换成Master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让他们切换主机

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

image.png

假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是对哨兵1主观的认为主服务器不可用,这个现象称为主观下线,当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover【故障转移】操作。切换成功后,就会通过发布的订阅模式,让各个哨兵把自己监控的从服务器切换成主机,这个过程称为客观下线

**

如何配置?

我是在本机Windows系统下单机配置的,Linux下区别不大,这里只启动了一个哨兵。

真实环境一般启动三个哨兵,来进行监控,方便投票选举(即可以二vs一选出下一个Master,若是两个个哨兵投票结果就是1:1无法可靠确定结果)

  1. 首先,需要配置一主二从的服务器(参考我的上一篇文章

  2. 然后再Redis目录里新建文件sentinel.conf,内容如下:

    1
    2
    3
    #sentinel monitor <master-name> <ip> <redis-port> <quorum>
    sentinel monitor myredis 127.0.0.1 6379 1
    ##告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum#是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效

    当然,这里只配置了这一个核心的参数,其他参数最后有介绍

  3. 执行 redis-sentinel.exe sentinel.conf来启动哨兵
    (然后我发现Redis3.2版本的Windows安装包里居然没有sentinel.exe…,我在Linux上实践一下在更新这部分,贴个图什么的)

测试

我是在本机

  1. 首先模拟主机6379挂掉,redis-cli里执行shutdown

  2. 然后等待一会就会发现6380或6381这两个从节点的某一个就会自动变为Master。

  3. 当6379重连后,它的角色会变为新主机的从机,而自己不再是主机了。

总结

优点:

  • 哨兵集群,基于主从复制,所有的主从配置优点,他全有

  • 主从可以切换,故障可以转移,系统的可用性会更好

  • 哨兵模式及时主从模式的升级,手动到自动,更加健壮

缺点:

  • Redis不好在线扩容,集群容量一旦到达上限,在线扩容就会十分麻烦
  • 配置哨兵模式比较麻烦

全部参数如下:

port 26379 若是哨兵集群的话,需要配置哨兵的端口

daemonize yes 是否后台运行

logfile “26379.log” 日志

dir “./“

sentinel monitor mymaster 192.168.250.132 7000 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 15000

sentinel auth-pass mymaster 123

bind 192.168.250.132 127.0.0.1

sentinel monitor 告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效

sentinel auth-pass 设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。

sentinel down-after-milliseconds 这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒

sentinel parallel-syncs 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。

sentinel failover-timeout 可以用在以下这些方面: 1. 同一个sentinel对同一个master两次failover之间的间隔时间。 2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。 3.当想要取消一个正在进行的failover所需要的时间。 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。

详细了解Redis的哨兵可以阅读这篇文章:

Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

Prev
2022-09-22 22:46:38
Next