redis哨兵是怎么工作的

哨兵作用

  • 监控整个主数据库和从数据库,观察它们是否正常运行
  • 当主数据库发生异常时,自动将从数据库升级为主数据库,继续保证整个服务的文档

哨兵是怎样工作的

  • 每隔sentinel以每秒钟一次的频率向他所知的主节点,从节点以及其他sentinel实例发送一个ping命令
  • 如果一个实例(instance)距离最后一次有效恢复PING命令的时间超过 down-after-milliseconds 选项所指定的值,则这个实例会被当前的sentinel标记为主观下线
  • 如果一个主节点被标记为主观下线,则正在监视这个主节点的所有sentinel要以每秒一次的频率确认主节点确定既然进入了主观下线状态
  • 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认主节点的确进入了主观下线状态,则这个主节点会被标记为客观下线。
  • 当主节点被sentinel标记为客观下线时,sentinel向下线的主节点的所有从节点发送INFO命令的频率会从10s一次改为每秒一次(在一般情况下,每个sentinel会议每10 秒一次的频率向它已知的所有主节点,从节点发送 INFO 命令 )
  • 若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会变成主观下线。若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
  • sentinel节点会与其他sentinel节点进行“沟通”,投票选举一个sentinel节点进行故障处理,在从节点中选取一个主节点,其他从节点挂载到新的主节点自动复制新主节点的数据

哨兵的选举过程

  • 第一个发现该master挂了的哨兵,会向每个哨兵发送命令,让对方选举自己成为领头哨兵
  • 其他哨兵如何没有选举过他人,就会将这一票投给第一个发现该master挂了的哨兵
  • 第一个发现该master挂了的哨兵如果发送有超过一般的哨兵投给自己,并且其数量也超过了设定的quoram参数,那么该哨兵就成了领头哨兵
  • 如果多个哨兵同时参与这个选举,那么就会重复该过程,知道选出一个领头哨兵

选出领头哨兵后,就开始了故障修复,会从选出一个从数据库作为新的master

故障转移时会从剩下的slave选举一个新的master,被选举为master的标准是什么?

如果一个master被认为宕机了,而且领头哨兵允许了主从切换,那么某个哨兵就会执行主从切换操作,此时时首先要选举一个slave来,会考虑slave的一些信息

  1. 跟master断开连接的时长

如果一个slave跟master断开连接已经超过了down-after-milliseconds的10倍,外加master宕机的时长,那么slave就被认为不适合选举为master.

  1. slave优先级

按照slave优先级进行排序,slave priority越低,优先级就越高

  1. 复制offset。

如果slave priority相同,那么看replica offset,哪个slave复制了越多的数据,offset越靠后,优先级就越高

  1. run id

如果上面两个条件都相同,那么选择一个run id比较小的那个slave

执行切换的那个哨兵在完成故障转移后会做什么

会进行configuration配置信息传播

哨兵完成切换之后,会在自己本地更新生成最新的master配置,然后通过pub/sub消息机制同步给其他的哨兵。

同步配置的时候其他哨兵根据什么更新自己的配置呢?

执行切换的那个哨兵,会从要切换的新主节点(slave->master)哪里得到一个configuration epoch,这就是一个version号,每次切换的version号都必须是唯一的

如果第一个选举出的哨兵切换失败了,那么其他哨兵,会等待failover-timeout时间,然后接替继续执行切换,此时会重新获取一个新的configuration epoch 作为新的version号。

这个version就很重要了,因为各种消息都是通过一个channel去发布和监听的,所以一个哨兵完成一次新的切换之后,新的master配置是跟着新的version号的,其他的哨兵都是根据版本号的大小来更新自己的master配置的

哨兵模式主从切换数据丢失问题

会产生数据丢失的场景

异步复制导致的数据丢失

因为主节点–> 从节点的复制是异步的,所以可能有部分数据还没有复制到从节点,主节点就宕机了,此时主节点中的数据和从节点中的数据不同步,即数据丢失。

脑裂导致数据丢失

什么是脑裂

当某个主节点所在的机器突然脱离正常的网络,不能与其他的从节点连接,但实际上主节点还在运行着,这时候哨兵就会认为主节点宕机了,然后开启选举,将其他的从节点推举为新节点,这时候集群中就会出现两个主机,这种现象就是脑裂

脑裂引发的数据丢失问题

当一个从节点被推举为新的主节点时,但此时的客户端还没来得及切换到新的主节点,客户端仍然继续向旧的主节点中传输数据,因此当旧的主节点恢复的时候,会成为一个新的主节点,并挂在新的主节点上,自己的数据就会清空,重新从新的主节点复制数据

解决方案

redis层面:通过配置控制同步事件

redis.conf配置如下:

min-slaves-to-write 1
min-slaves-max-lag 10

配置说明:

  • 该配置必须至少有1个从节点,数据复制和同步延迟不能超过10s
  • 如果说一旦所有的从节点,数据复制和同步的延迟超过了10s,那么主节点就会拒绝接收任何请求

作用:

  • 减少异步复制的数据丢失

    • 配置min-slaves-max-lag为10s之后,根据目前主节点–>从节点的复制速度,如果数据同步完成所需要时间超过10s,就会认为主节点未来宕机后损失的数据会很多,主节点就拒绝写入新请求
    • 这样就能将主节点和从节点的数据差控制在10s之内,即使主节点宕机也只是这未复制的10s数据
  • 减少脑裂的数据丢失:

    • 如果不能继续给指定数量的从节点发送数据,而且从节点超过10s没有给自己ack消息,那么就直接拒绝写入新请求,这样脑裂后的旧主节点就不会接收客户端的新数据,也就避免了数据丢失
    • 因此在脑裂场景下,最多就丢失10秒的数据

生产者方面:降级限流

  • 降级:先将消息写到本地磁盘中或者放到临时的消息队列中,每隔10分钟去本地磁盘或者队列中取,来尝试重新发给主节点
  • 限流:在网关减慢请求涌入的速度

redis面试:哨兵模式主从切换数据丢失问题相关推荐

  1. Redis主从复制哨兵模式自动切换

    Redis主从复制 1.概念 主从复制,是指将一台Redis服务器的数据复制到其他的redis服务器上.前者为主节点master,后者为从节点slave,数据的复制是单向的,由主节点复制到从节点(主节 ...

  2. redis哨兵模式没有切换主机_Redis的哨兵模式

    微信公众号:51码农网 网站:http://www.51manong.com51码农网,让程序员的坚持学习变得可能 Redis哨兵(Sentinel)模式 Redis的主从复制,当主机出现了宕机时,需 ...

  3. ip地址转换数字函数 iton_redis深度剖析: 03 redis读写哨兵模式

    什么叫系统不可用: 什么是99.99高可用性: 高可用计算规则,全年 系统可用的时间 / 全年 redis不可用是什么? redis主从基于哨兵模式的高可用: 哨兵的主要功能: (1)集群监控,负责监 ...

  4. Redis:哨兵模式(针对某一模块,数据量有限)

    Redis:哨兵模式(针对某一模块,数据量有限) 关键词 主从(读写分离,高新能),没有实现高可用 主从+哨兵:可以实现主从切换,实现高可用 哨兵检测(1s1ping),哨兵确认(接受回复,主观下线: ...

  5. Redis的哨兵模式搭建

    Redis的哨兵模式搭建 1.Redis的哨兵模式 Redis的哨兵是反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库.哨兵(sentinel) 是一个分布式系统, ...

  6. Redis(3)--哨兵模式,集群

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

  7. Redis之哨兵模式

    文章目录 Redis之哨兵模式 1.哨兵介绍 2.哨兵作用 3.哨兵相关配置 4.配置哨兵 5.演示(配置哨兵) 6.主从切换过程 7.阶段一监控阶段 8.阶段二通知阶段 9.阶段三故障转移阶段 Re ...

  8. redis的哨兵模式测试

    上篇文章我们说到,一主二从的模式,如果主机挂掉,从机等待主机连上之后,继续成为主机的slave. 但是这样会影响我们业务的正常运转呀,我们怎么来做呢? 目前的我的服务器: 192.128.116.12 ...

  9. php redis主从自动切换,Redis 集群的主从切换

    Redis 集群的主从切换不再使用 Sentinel 作为外置监控, 而是集群内部在主节点挂掉之后选举出一个从节点取代主节点, 处理相应的分片的数据请求. 当然前提条件是对应的主节点有至少一个可连通的 ...

最新文章

  1. 架构师速成-架构目标之可用性
  2. 线性回归最小二乘法和梯度下降法-详细
  3. C++ 删除字符串的首尾空字符
  4. 使用AndroidStudio编译NDK的方法及错误解决方式
  5. 2015年职称计算机考试宝典,2015年职称计算机考试宝典模块软件.doc
  6. Hexo博客主题安装及Next主题个性化修改
  7. socket pro
  8. [系统安全] 反病毒与免杀原理概论
  9. HTML的简要学习---超链接(待补充)
  10. 【数学建模】主成因分析
  11. 阿里云国际版账号如何申请
  12. 北京python培训班价格
  13. Visual Studio 2017, 2019 官网下载地址
  14. 单片机蓝牙烧录_怎么样蓝牙模块给单片机烧程序?
  15. 从冷备到多活,阿里毕玄谈数据中心的异地容灾
  16. 计算机教师个人诊改总结,教师个人诊改报告
  17. Android-skin-support 一款用心去做的Android 换肤框架
  18. 找工作必看:上海知名互联网公司盘点(全)
  19. 计算机鼠标一直转圈圈 打不开文件,电脑鼠标一直在转圈圈,什么软件也打不开,也关不了机怎么处理...
  20. 搜索功能实现思路及流程图

热门文章

  1. 蓝桥杯--模拟1 AcWing 1241. 外卖店优先级
  2. App地推营销成为趋势,破局增长数据赋能是关键
  3. python01 初识 bmi测量
  4. mysql的information_schema数据库
  5. win7系统(64/32位)安装office2010时提示需要msxml6.10.1129,问题的解决记录
  6. C语言实现简单卡尔曼滤波
  7. SQL判断某列中是否包含中文字符、英文字符、纯数字,数据截取
  8. dw2019连接mysql数据库_VS 2019 连接MySQL数据库配置记录
  9. 借贷管理系统-初审阶段
  10. layui镜像网站分享