7.哨兵模式

哨兵机制:主库挂了,如何不间断服务?


在主从复制模式下,如果从库发生故障了,客户端可以继续向主库或其他从库发送请求,进行相关的操作,但是如果主库发生故障了,那就直接会影响到从库的同步,因为从库没有相应的主库可以进行数据复制操作了。无论是写服务中断,还是从库无法进行数据同步,都是不能接受的。所以,如果主库挂了,我们就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。这就涉及到三个问题:

  • 主库真的挂了吗?
  • 该选择哪个从库作为主库?
  • 怎么把新主库的相关信息通知给从库和客户端呢?

1.哨兵机制如何实现

工作流程:监控->选主->通知

(1)监控:主观下线和客观下线

哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。通常会采用多实例组成的集群模式进行部署,这也被称为哨兵集群。

  • 主观下线:哨兵redis进程通过ping命令检测和主从库之间的网络的连接情况,如果ping超时了就认为该主/从库主观下线。但是主观下线并不能代表这个库就一定下线了,这样会导致误判。主观下线的判断主要是和配置项down-after-milliseconds有关
image-20221118144503452
  • 客观下线:只有大多数的哨兵实例,都判断主库已经“主观下线”了,主库才会被标记为“客观下线”。具体要多少票赞成主观下线才转换为客观下线,要根据配置来定:sentinel monitor。客观下线才是真正的下线

    img

(2)选主:筛选和打分

如果监控到主库下线了,那么哨兵集群就会开始所有从库的筛选和打分,以决定出新的主库。

  • 筛选:在没下线的从库中,选择出网络状态好的。需要根据配置项:down-after-milliseconds * 10,down-after-milliseconds是我们认定主从库断连的最大连接超时时间。如果在 down-after-milliseconds 毫秒内,主从节点都没有通过网络联系上,我们就可以认为主从节点断连了。如果发生断连的次数超过了 10 次,就说明这个从库的网络状况不好,不适合作为新主库。
  • 打分:分为3轮打分,一轮中打分最高的就会被选为主库,如果有平票的则进入下一轮打分
    • 优先级高的得分高:通过slave-priority配置项决定,这个参数越小,优先级越高
    • 和旧主库同步程度最接近的从库得分高:有从库的 slave_repl_offset 最接近 master_repl_offset,那么它的得分就最高,可以作为新主库。
    • RID小的得分高:前两轮都抉择不出来的话,RID越小,则选举为主库

(3)通知:从库和客户端

在执行通知任务时,哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。同时,哨兵会把新主库的连接信息通知给客户端(客户端侧需要去监听),让它们把请求操作发到新主库上。

2.哨兵机制配置详解

不论是正常的redis集群节点,还是特殊的哨兵集群节点,它们的配置统一都在 ‘redis.conf’ 中配置(除了RDB的配置文件在dump.rdb)。至于名字可以不用叫这个,在启动服务时指明配置文件即可。

下面示例redis哨兵集群的配置

1.sentinel-26379.conf

port 26379
# 设置守护进程模式
daemonize yes
# 添加指明日志文件名
logfile "/usr/local/redis/6379/sentinel26379.log"
# 修改工作目录
dir "/usr/local/redis/6379"
##其中,sentinel monitor mymaster 192.168. 92.128 6379 2配置的含义是:该哨兵节点监控192.168.92.128:6379这个redis主节点,该主节点的名称是mymaster(自定义),最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移。主节点的名称可以自定义
sentinel monitor mymaster 192.168.92.128 6379 2
#哨兵使用ping命令对主节点和从节点进行心跳检测,如果节点超过down-after-milliseconds配置的时间没有回复,哨兵就会将其进行主观下线
sentinel down-after-milliseconds mymaster 50000

2.sentinel-26380.conf

port 26380
daemonize yes
logfile "/usr/local/redis/6379/sentinel26379.log"
dir "/usr/local/redis/6379"
sentinel monitor mymaster 192.168.92.128 6379 2

3.sentinel-26381.conf

port 26381
daemonize yes
logfile "/usr/local/redis/6379/sentinel26379.log"
dir "/usr/local/redis/6379"
sentinel monitor mymaster 192.168.92.128 6379 2

依次启动:两种方式,效果一样

redis-sentinel sentinel-26379.conf
redis-server   sentinel-26379.conf --sentinel

sentinel sentinel-26379.conf
redis-server sentinel-26379.conf --sentinel






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值