文章目录

  • 主从数据不一致的问题?
  • 主从如何做到故障自动切换的问题?
  • 主从切换时,如何减少数据丢失的问题?
    • 异步复制同步丢失
    • 集群产生脑裂数据丢失

我们一个问题一个问题的看:

主从数据不一致的问题?

我们先思考下为什么会出现主从数据不一致?

主从数据不一致,就是指客户端从从节点中读取到的值和主节点中的最新值并不一致。

之所以会出现主从数据不一致的现象,是因为主从节点间的命令复制是异步进行的,所以无法实现强一致性保证(注意:这里是强一致性,指的是主从数据时时刻刻保持一致,我们的主从同步是可以达到的是最终一致性)。

具体来说,在主从节点命令传播阶段,主节点收到新的写命令后,会发送给从节点。

但是,主节点并不会等到从节点实际执行完命令后,再把结果返回给客户端,而是主节点自己在本地执行完命令后,就会向客户端返回结果了。如果从节点还没有执行主节点同步过来的命令,主从节点间的数据就不一致了。

那么我们如何应对主从数据不一致的问题(但我们没办法彻底解决,只能减低问题的严重程度)?

第一种方法,尽量保证主从节点间的网络连接状况良好,避免主从节点在不同的机房。

第二种方法,可以开发一个外部程序来监控主从节点间的复制进度。具体做法:

  • Redis 的 INFO replication 命令可以查看主节点接收写命令的进度信息(master_repl_offset)和从节点复制写命令的进度信息(slave_repl_offset),所以,我们就可以开发一个监控程序,先用 INFO replication 命令查到主、从节点的进度,然后,我们用 master_repl_offset 减去 slave_repl_offset,这样就能得到从节点和主节点间的复制进度差值了。
  • 如果某个从节点的进度差值大于我们预设的阈值,我们可以让客户端不再和这个从节点连接进行数据读取,这样就可以减少读到不一致数据的情况。不过,为了避免出现客户端和所有从节点都不能连接的情况,我们需要把复制进度差值的阈值设置得大一些。

主从如何做到故障自动切换的问题?

一开始,主节点挂了 ,从节点是无法自动升级为主节点的,这个过程需要人工处理,在此期间 Redis 无法对外提供写操作。

那么能不能让他自动检测和切换呢?

此时,Redis 哨兵机制就登场了,哨兵在发现主节点出现故障时,由哨兵自动完成故障发现和故障转移,并通知给应用方,从而实现高可用性

哨兵机制如下所示:

Redis Sentinel(哨兵)是一个分布式架构,它包含若干个哨兵节点和数据节点。每个哨兵节点会对数据节点和其余的哨兵节点进行监控,当发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,它就会与其他的哨兵节点进行协商,当多数哨兵节点都认为主节点不可达时,它们便会选举出一个哨兵节点来完成自动故障转移的工作,同时还会将这个变化实时地通知给应用方。整个过程是自动的,不需要人工介入,有效地解决了Redis的主从自动切换的问题(同样也是解决了高可用的问题)!

一组哨兵可以监控一个主节点,也可以同时监控多个主节点,两种情况的拓扑结构如下图:

刚说完切换,那么在切换时,就会产生数据的丢失问题,那么:

主从切换时,如何减少数据丢失的问题?

主从切换过程中,产生数据丢失的情况有两种:

  • 异步复制同步丢失
  • 集群产生脑裂数据丢失

同样,我们不可能保证数据完全不丢失,只能做到使得尽量少的数据丢失。

异步复制同步丢失

Redis 主节点与从节点之间的数据复制,是异步复制的,在异步的过程当中是可能发生数据丢失的,比如:

  • 当客户端发送写请求给主节点的时候,客户端会返回 ok,接着主节点将写请求异步同步给各个从节点,但是如果此时主节点还没来得及同步给从节点时发生了断电,那么主节点内存中的数据会丢失。

减少异步复制的数据丢失的方案如下

Redis 配置里有一个参数 min-slaves-max-lag,表示一旦所有的从节点数据复制和同步的延迟都超过了 min-slaves-max-lag 定义的值,那么主节点就会拒绝接收任何请求。

假设将 min-slaves-max-lag 配置为 10s 后,根据目前 master->slave 的复制速度,如果数据同步完成所需要时间超过10s,就会认为 master 未来宕机后损失的数据会很多,master 就拒绝写入新请求。这样就能将 master 和 slave 数据差控制在10s内,即使 master 宕机也只是这未复制的 10s 数据。

那么对于客户端,当客户端发现 master 不可写后,我们可以采取降级措施,将数据暂时写入本地缓存和磁盘中,在一段时间(等 master 恢复正常)后重新写入 master 来保证数据不丢失,也可以将数据写入 kafka 消息队列,等 master 恢复正常,再隔一段时间去消费 kafka 中的数据,让将数据重新写入 master 。

集群产生脑裂数据丢失

什么是脑裂:集群的脑裂现象,这就好比一个人有两个大脑,那么集群到底是受谁控制呢

那么在 Redis 中,集群脑裂产生数据丢失的现象是怎样的呢,比如:

  • 由于网络问题,集群节点之间失去联系。主从数据不同步;重新平衡选举,产生两个主服务。等网络恢复,旧主节点会降级为从节点,再与新主节点进行同步复制的时候,由于会从节点会清空自己的缓冲区,所以导致之前客户端写入的数据丢失了。

减少脑裂的数据丢的方案:

当主节点发现从节点下线或者通信超时的总数量小于阈值时,那么禁止主节点进行写数据,直接把错误返回给客户端

具体做法为:

在 Redis 的配置文件中有两个参数我们可以设置:

  • min-slaves-to-write x,主节点必须要有至少 x 个从节点连接,如果小于这个数,主节点会禁止写数据。
  • min-slaves-max-lag x,主从数据复制和同步的延迟不能超过 x 秒,如果超过,主节点会禁止写数据。

我们可以把 min-slaves-to-write 和 min-slaves-max-lag 这两个配置项搭配起来使用,分别给它们设置一定的阈值,假设为 N 和 T。

这两个配置项组合后的要求是,主节点连接的从节点中至少有 N 个从节点,「并且」主节点进行数据复制时的 ACK 消息延迟不能超过 T 秒,否则,主节点就不会再接收客户端的写请求了。

即使原主节点是假故障,它在假故障期间也无法响应哨兵心跳,也不能和从节点进行同步,自然也就无法和从节点进行 ACK 确认了。这样一来,min-slaves-to-write 和 min-slaves-max-lag 的组合要求就无法得到满足,原主节点就会被限制接收客户端写请求,客户端也就不能在原主节点中写入新数据了

等到新主节点上线时,就只有新主节点能接收和处理客户端请求,此时,新写的数据会被直接写到新主节点中。而原主节点会被哨兵降为从节点,即使它的数据被清空了,也不会有新数据丢失。我再来给你举个例子。

假设我们将 min-slaves-to-write 设置为 1,把 min-slaves-max-lag 设置为 12s,把哨兵的 down-after-milliseconds 设置为 10s,主节点因为某些原因卡住了 15s,导致哨兵判断主节点客观下线,开始进行主从切换。同时,因为原主节点卡住了 15s,没有一个从节点能和原主节点在 12s 内进行数据复制,原主节点也无法接收客户端请求了。这样一来,主从切换完成后,也只有新主节点能接收请求,不会发生脑裂,也就不会发生数据丢失的问题了。

场景应用:如何解决Redis主从同步中出现的问题?相关推荐

  1. 【Redis】Redis主从同步中数据同步原理

    [Redis]Redis主从同步中数据同步原理 文章目录 [Redis]Redis主从同步中数据同步原理 1. 全量同步 1.1 判断是否第一次数据同步 2. 增量同步 3. 优化Redis主从集群 ...

  2. redis 主从同步到分布式集群

    Redis 集群是一个提供在多个Redis节点间共享数据的程序集 通过集群的配置可以解决:机器故障.容量瓶颈.QPS瓶颈等 主从同步 redis主从结构有一主多从和级联结构 一主多从:master将数 ...

  3. Day758.Redis主从同步与故障切换的坑 -Redis 核心技术与实战

    Redis主从同步与故障切换的坑 Redis 的主从同步机制不仅可以让从库服务更多的读请求,分担主库的压力,而且还能在主库发生故障时,进行主从库切换,提供高可靠服务. 接下来是对应会出现的3个坑,分别 ...

  4. Redis主从同步异常问题记录

    一.背景 2015.7.31 10.36.14.*网段的TOR故障一小时,网络故障恢复后,redis nj多个从主从同步异常: 除slave0外,其他slave的offset均比master大.注:r ...

  5. 五、Redis主从同步

    Redis 主从同步 一.复制 二.旧版复制功能的实现 2.1.同步操作 2.2.命令传播操作 三.旧版复制功能的缺陷 四.新版复制功能的实现 五.部分重同步的实现 5.1.复制偏移量 5.2.复制积 ...

  6. 浅析 Redis 主从同步与故障转移原理

    我们在生产中使用 Redis,如果只部署一个 Redis 实例,当该实例宕机,到恢复之前都不可用:虽说 Redis 一般都用来做缓存,但不可用给业务系统带来的影响也是不小的,流量大时甚至会导致整个服务 ...

  7. Redis主从同步模式(replication)

    主从同步模式(replication) 主从同步是指以一个节点为基准节点,将数据同步给从节点,使得主从节点的数据保持一致,主节点一般也称为Master,从节点Slave,一个Master节点可以有多个 ...

  8. 【图解】redis主从同步流程——全量同步、部分同步、命令传播

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.全量同步 二.部分同步 三.命令传播 总结 前言 本文主要介绍Redis高可用下的主从同步问题,包括全量同步.部分 ...

  9. sqlserver同步到redis_[redis 同步到数据库]一文让你明白Redis主从同步

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件本文摘自微信公众号:不仅Java 今天,我想与大家分享Redis主从同步(也称为"复制"). 我们 ...

最新文章

  1. JSP大作业数据库_本地MySQL【种种问题】
  2. 电话双音频拨码信号采集
  3. android-XML解析Dom,Sax,Pull
  4. java 指定文件格式_java删除指定目录下指定格式文件的方法
  5. 围棋人机大战明日上演,这份观赛指南请留好
  6. groupwise_GroupWise部分文档翻译
  7. Web框架之Tornado
  8. 二月1500-1999元性价比排行榜:前三都是魅族手机
  9. PHP textarea防止拖动,textarea dom元素 防止滚动冒泡
  10. fasfdfs安装记录(CentOS7)
  11. 精选| 2019年4月R新包推荐(Top40)
  12. 云原生网络性能优化:service mesh 篇
  13. 什么是驻点和拐点_拐点和驻点的区别有哪些
  14. 黑马程序员SpringBoot基础篇SSMP整合案例
  15. STM32 CAN通信之二:正常模式
  16. c++ 随机生成数独(不保证唯一解)
  17. 大厂成熟Foc电机代码STM32f031C6. 把原先的原理图,给整理了
  18. java kdj_基于java语言开发的个性化股票分析技术:随机指数(kdj).doc
  19. 【高等数学】为什么规定向量之间的夹角是0~180
  20. JAVA-张大坏02

热门文章

  1. Python异常重试解决方案 Python中异常重试的解决方案详解
  2. 询问HTG:在Windows 7中移动我的文档,备份Android和多监视器任务栏
  3. 火山引擎 MARS-APMPlus X 美篇 | 形成应用性能全面监控,大幅提升APP稳定性
  4. 编码踩坑——dubbo异常“Service not found“
  5. 学生DW静态网页设计——速鲜站餐饮食品(6页) HTML+CSS+JavaScript 关于食物食品的HTML网页设计-----餐饮
  6. android10与Flyme8,Emui10vsFlyme8 高手过招,细节见真章 !
  7. vue3 路由报错 Uncaught Error: Catch all routes (“*“) must now be defined using a param with a custom reg
  8. SPI之 ------- 片选信号CS
  9. 元宇宙的价值链:体验、发现、创造者经济、空间计算、人机界面
  10. typora---beta版本