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

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

为什么会发生脑裂?

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

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

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

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

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

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

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

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

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

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

569064180c304ae1a879f95dd0a3c8e4.png

如何应对脑裂问题?

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加速服务了解一下!

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

2d18428484224fc1ce9442e047a3f48a.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】C#实现SM4国密加密

本文主要讲解“国密加密算法”SM系列之SM4的C#实现方法&#xff0c;加密规则请详阅国密局发布的文档。 首先需第三方Nuget包&#xff1a;Portable.BouncyCastle &#xff08;源码来自http://www.bouncycastle.org/csharp/&#xff09; 1.1 SM4主类 /// <summary>/// //…

vscode怎么自动将px转换成vw_基于react/vue移动端适配之px自动转rem、vw

作为一名前端开发&#xff0c;在做移动端适配时rem、vw是我们经常用到的单位&#xff0c;但是我们在实际开发过程中需要将设计稿上的px转换成rem&#xff0c;如果手动去计算&#xff0c;将是一个很耗时、费力的过程。这是就需要一个工具可以帮我们自动将px转成rem、vw。开始之前…

【转】TransactionScope事务简介

在.NET 1.0/1.1 版本我们使用SqlTransaction.处理事务 string connString ConfigurationManager.ConnectionStrings["db"].ConnectionString; using (var conn new SqlConnection(connString)) { conn.Open(); using (IDbTransaction tran conn.BeginTransact…

后台接收datetime_input上传date日期时间数据到后台报400怎么办?

前端上传日期时间数据到后台时&#xff0c;上传失败我这里是用里存放时间&#xff0c;上传到后台的controller方法时&#xff0c;参数类型是java.util.Date&#xff0c;发现没有到controller方法里面。报错&#xff1a;不能将String转成Date。我想错误的原因是前端传上来的是St…

【转】C#中使用TransactionScope类(分布式事务) 和 锁

如果在C#中使用TransactionScope类(分布式事务),则须注意如下事项: 1、在项目中引用using System.Transactions命名空间&#xff08;先要在添加net组件的引用&#xff09;; 2、具体示例如下&#xff1a; public static void sendMessage(){ TransactionOptions tran…

网络通道数2的倍数_限流笔记-通道限流(二)

在工作中的时候&#xff0c;由于我负责的一个系统需要调用很多的第3方的系统&#xff0c;可是呢&#xff0c;这些个第3方的系统的性能完全不一致&#xff0c;有的好有的坏&#xff0c;还成本都不一样&#xff0c;当然了平时把&#xff0c;直接使用成本低的就行了&#xff0c;但…

【转】[技术回顾系列]--WebService事务处理

如果在WEB服务中有这样一个场景&#xff0c;某个WEB服务的方法要执行两个任务&#xff0c;它首先要在数据库中创建一个新表&#xff0c;接着调用对象来收集和格式化数据&#xff0c;并在新表中插入数据。象这样的一组方法&#xff0c;我们必须保证他们都成功执行&#xff0c;否…

mysql题目_MySQL练习题

创建下列表并创建相关约束问题1&#xff1a;查询出成绩表&#xff0c;而且student_id 后面要有对应的学生名&#xff0c;course_id 后面要有对应的课程名.1 SELECT2 score.sid,3 score.student_id,4 student.sname,5 score.course_id,6 course.cname,7 score.number8 FROM scor…

【转】BASE64编码规则

Base64编码要求把3个8位字节&#xff08;3*824&#xff09;转化为4个6位的字节&#xff08;4*624&#xff09;&#xff0c;之后在6位的前面补两个0&#xff0c;形成8位一个字节的形式。&#xff08;将字符串转换为二进制&#xff0c;从前往后&#xff0c;每6位一取&#xff0c;…

查看mysql数据库的死锁日志_【MySQL】mysql死锁以及死锁日志分析

1.死锁的概念死锁&#xff1a;死锁一般是事务相互等待对方资源&#xff0c;最后形成环路造成的。对于死锁&#xff0c;数据库处理方法&#xff1a;牺牲一个连接&#xff0c;保证另外一个连接成功执行。发生死锁会返回ERROR&#xff1a;1213 错误提示&#xff0c;大部分的死锁In…

【转】二进制文件和ASCII文件有何区别

二进制文件和ASCII文件&#xff08;即文本文件&#xff09;的区别&#xff0c;对于和计算机亲近时间尚短的同学是个难题。本文用简单的例子&#xff0c;试图展示其中的道道&#xff0c;希望能对菜鸟们有些帮助。 1、一个例子&#xff1a;两种100000 有程序&#xff1a; #includ…

mysql优化和索引_mysql优化和索引

表的优化1.定长与变长分离如 int,char(4),time核心且常用字段&#xff0c;建成定长&#xff0c;放在一张表&#xff1b;而varchar,text,blob这种变长字段适合单放一张表&#xff0c;用主键与核心表关联。2.常用字段和不常用字段要分离3.在 1 对多需要关联统计的字段上&#xff…

【转】为什么不能使用字符流读取非文本的二进制文件?

读取文件 刚学Java的IO流部分时&#xff0c;书上说只能使用字节流去读取图片、视频等非文本二进制文件&#xff0c;不能使用字符流&#xff0c;否则文件会损坏。所以我就一直记住这一点了&#xff0c;但是为什么不能使用&#xff0c;这一直是我的一个疑惑。今天&#xff0c;我…

mysql更新一条语句_MySQL一条更新语句是如何执行的

一条查询语句是经过连接器 分析器 优化器 执行器等功能模块&#xff0c;最后到达存储引擎。image以下所说的都基于InnoDb引擎。当有一条记录需要更新的时候&#xff0c;InnoDB引擎会先把记录写到redo log里面&#xff0c;并更新内存&#xff0c;这个时候更新就算完成了。InnoDb…

【转】文本文件和二进制文件区别及java中字节流和字符流归纳

首先在物理上文本文件和二进制文件并没有区别&#xff0c;都是以二进制&#xff10;&#xff11;的形式存放于存储介质中&#xff0c;他们的区别只是逻辑上的区别&#xff0c;这两种方式只是在编码层次上有差别。文本文件是基于字符编码的文件&#xff0c;常见的编码有ASCII编码…

mysql查询后从高到低排序_[MySQL基础]三、排序查询

排序查询语法&#xff1a;SELECT查询列表FROM表[WHERE 筛选条件]ORDER BY 排序列表 [ASC|DESC]; #[ ]中的内容表示可选特点&#xff1a;asc代表的是升序&#xff0c;desc代表的是降序&#xff0c;如果不写&#xff0c;默认是升序order by子句中可以支持单个字段、多个字段、表达…

【转】如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)

转自&#xff1a;http://blog.csdn.net/jiangqin115/article/details/42684017 UTF-8编码的文本文档&#xff0c;有的带有BOM (Byte Order Mark, 字节序标志)&#xff0c;即0xEF, 0xBB, 0xBF&#xff0c;有的没有。Windows下的txt文本编辑器在保存UTF-8格式的文本文档时会自动…

cesium获取模型实时坐标_Cesium 顶点着色器中求解模型坐标

1. 由世界坐标转模型坐标顶点着色器&#xff1a;attribute vec3 position3DHigh;attribute vec3 position3DLow;attribute vec3 normal;attribute vec2 st;attribute float batchId;varying vec3 v_positionEC;varying vec3 v_normalEC;varying vec2 v_st;void main(){vec3 pos…

【转】关于CLR内存管理一些深层次的讨论[上篇]

半年之前&#xff0c;PM让我在部门内部进行一次关于“内存泄露”的专题分享&#xff0c;我为此准备了一份PPT。今天无意中将其翻出来&#xff0c;觉得里面提到的关于CLR下关于内存管理部分的内存还有点意思。为此&#xff0c;今天按照PPT的内容写了一篇文章。本篇文章不会再讨论…

mysql数据库连接地址utf8_在Python中连接到MySQL数据库时UTF8不工作

我正在努力使Python更好地使用UTF-8编码的MySQL数据库&#xff0c;例如&#xff0c;挪威字符。我找了好几个小时&#xff0c;但没能找到像预期的那样有效的东西。以下是从数据库中提取的示例表&#xff1a;mysql> select * from my_table;---------------------| id | shop_…