所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话,脑裂会进一步导致数据丢失。

为什么会发生脑裂?

1.确认是不是数据同步出现了问题

在主从集群中发生数据丢失,最常见的原因就是主库的数据还没有同步到从库,结果主库发生了故障,等从库升级为主库后,未同步的数据就丢失了。如果是这种情况的数据丢失,我们可以通过比对主从库上的复制进度差值来进行判断,也就是计算 master_repl_offset 和 slave_repl_offset 的差值。如果从库上的 slave_repl_offset 小于原主库的 master_repl_offset,那么,我们就可以认定数据丢失是由数据同步未完成导致的。

2.排查客户端的操作日志,发现脑裂现象

在排查客户端的操作日志时,我们发现,在主从切换后的一段时间内,有一个客户端仍然在和原主库通信,并没有和升级的新主库进行交互。这就相当于主从集群中同时有了两个主库。根据这个迹象,我们就想到了在分布式主从集群发生故障时会出现的一个问题:脑裂。

但是,不同客户端给两个主库发送数据写操作,按道理来说,只会导致新数据会分布在不同的主库上,并不会造成数据丢失。那么,为什么我们的数据仍然丢失了呢?

3.发现是原主库假故障导致的脑裂

我们是采用哨兵机制进行主从切换的,当主从切换发生时,一定是有超过预设数量(quorum 配置项)的哨兵实例和主库的心跳都超时了,才会把主库判断为客观下线,然后,哨兵开始执行切换操作。哨兵切换完成后,客户端会和新主库进行通信,发送请求操作。

但是,在切换过程中,既然客户端仍然和原主库通信,这就表明,原主库并没有真的发生故障(例如主库进程挂掉)。

为什么脑裂会导致数据丢失?

主从切换后,从库一旦升级为新主库,哨兵就会让原主库执行 slave of 命令,和新主库重新进行全量同步。而在全量同步执行的最后阶段,原主库需要清空本地的数据,加载新主库发送的 RDB 文件,这样一来,原主库在主从切换期间保存的新写数据就丢失了。

如何应对脑裂问题?

Redis 已经提供了两个配置项来限制主库的请求处理,分别是 min-slaves-to-write 和 min-slaves-max-lag。

  • min-slaves-to-write:这个配置项设置了主库能进行数据同步的最少从库数量;
  • min-slaves-max-lag:这个配置项设置了主从库间进行数据复制时,从库给主库发送 ACK 消息的最大延迟(以秒为单位)。

我们可以把 min-slaves-to-write 和 min-slaves-max-lag 这两个配置项搭配起来使用,分别给它们设置一定的阈值,假设为 N 和 T。这两个配置项组合后的要求是,主库连接的从库中至少有 N 个从库,和主库进行数据复制时的 ACK 消息延迟不能超过 T 秒,否则,主库就不会再接收客户端的请求了。

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

往期推荐

一个几乎每个系统必踩的坑儿:访问数据库超时

设计模式行为型:观察者模式(ObserverPattern)

API和SDK有什么区别?

雪花算法的实现思想

设计模式行为型:中介模式(MediatorPattern)

网络资源加载很慢?CDN加速服务了解一下!

如何保证核心链路稳定性的流控和熔断机制?

中发生数据丢失_如何防止Redis脑裂导致数据丢失?相关推荐

  1. Redis集群脑裂导致数据丢失问题处理

    什么是Redis的集群脑裂: Redis的集群脑裂指在主从集群中,同时有两个master主节点,它们都能接收写请求.而脑裂最直接的影响,就是客户端不知道应该往哪个master主节点写入数据,结果就是不 ...

  2. redis脑裂是什么意思?如何预防?如何处理?

    redis脑裂是什么意思?如何预防?如何处理? reids脑裂分为两种模式: 一.哨兵模式(sentinel)的脑裂 因为网络问题,导致sentinel(哨兵)与master(主节点)通讯中断,当哨兵 ...

  3. layui上传报错会有哪些原因_数据丢失如何恢复?哪些原因会导致数据丢失

    数据丢失如何恢复?不管您使用电脑还是手机的时候都会遇到数据丢失的问题!对于很多的小伙伴来说,如果遇到类似的问题都会第一时间去找一些恢复的方法.而正所谓"知己知彼百战不殆",想要知道 ...

  4. Oracle显示表裂开,【案例】Oracle RAC脑裂导致节点重启原因分析

    天萃荷净 Oracle研究中心案例分析:运维DBA反映Oracle RAC重启,分析原因为脑裂导致,结合日志分析产生原因. 本站文章除注明转载外,均为本站原创: 转载自love wife & ...

  5. redis中存集合_如何在Redis中管理集合

    redis中存集合 介绍 (Introduction) Redis is an open-source, in-memory key-value data store. Sets in Redis a ...

  6. mysql脑裂_说说Keepalived的脑裂

    1. 工作场景 Keepalived提供了Loadbalancing和High-Availability的功能, 本文说的是其为2个Mycat节点提供HA功能的场景. 2. 关键配置如下, 为主备非抢 ...

  7. redis api 中文文档_我的Redis学习资料库

    最近经常有人问我,我这边学习Redis都有哪些资料,能不能发他们一下.作为一个习惯"慢慢啃"技术学习的人,我确实积累了大量资料,这里可以介绍给大家. 注明:本文提供的书籍.视频.源 ...

  8. REDIS哨兵【Sentinel】模式+哨兵的核心知识点+redis哨兵主从切换的数据丢失问题+上一章铺垫的【异步复制数据丢失问题】+【集群脑裂】

    1.redis哨兵模式的前言: 一年一度的问题来了,为啥子要用redis的哨兵模式的呢? 简单粗暴的理解下子,顺带开个玩笑,没有理解好,还望不要见笑: 其实redis的哨兵模式,个人理解:只是说法搞大 ...

  9. 11 | 脑裂: 一次奇怪的数据丢失

    1. 前言 脑裂就是指在主从集群中,同时有两个主节点,它们都能接收写请求.而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据.而且,严重的话, ...

最新文章

  1. Python OpenCV应用K均值聚类进行颜色量化
  2. const在函数声明中的应用(转)
  3. 安卓PopupWindow使用详解与源码分析(附项目实例)
  4. Xamarin.Forms 5.0 项目实战发布!
  5. php 可维护性的代码,软件的可复用性和可维护性
  6. 免费网络管理软件大全
  7. 离散数学 习题篇 —— 关系的性质
  8. 微信小程序:全新圣诞节头像框制作生成微信小程序源码下载支持多模板
  9. 用c语言简单的指针求进制,求助!C语言用指针函数实现十进制转,十六进制,八进制,二进制...
  10. 后端接口如何提高性能?
  11. 如何解决WIN10电脑搜索文件慢的问题办法
  12. 腾讯云自建k8s对接文件存储CFS
  13. Shell脚本之免交互
  14. logback日志使用记录
  15. 为什么要有SerialVersionUID?
  16. 实力技能+1 Get~恭喜北汇新增静态代码测试工具技能考核认证
  17. 网络军火商泄漏惊天内幕:中国才是受害者!
  18. 历史上的一些“大”芯片回顾
  19. Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送
  20. excel表格xlsx解开加密软件,excel表格xlsx不能复制打印怎么办?

热门文章

  1. CSS-posiziton
  2. iOS开发UI篇-在UItableview中实现加载更多功能
  3. 三白话经典算法系列 Shell排序实现
  4. eclipse下创建Maven项目
  5. DotNET内存管理与垃圾回收[转]
  6. 解决用户控件循环引用的笨办法
  7. 广州.NET俱乐部 VSTS活动报道
  8. 【小技巧】【Java】 创建指定数目m的Set数组
  9. [Leetcode][第81题][JAVA][N皇后问题][回溯算法]
  10. [剑指offer]面试题第[67]题[Leetcode][JAVA][第8题] 字符串转换整数 (atoi)[字符串]