导读

MySQL主从复制环境中,如何才能保证主从数据的一致性呢?

关于主从复制

现在常用的MySQL高可用方案,十有八九是基于 MySQL的主从复制(replication)来设计的,包括常规的一主一从、双主模式,或者半同步复制(semi-sync replication)。

我们常常把MySQL replication说成是MySQL同步(sync),但事实上这个过程是异步(async)的。大概过程是这样的:

  1. 在master上提交事务后,并且写入binlog,返回事务成功标记;
  2. 将binlog发送到slave,转储成relay log;
  3. 在slave上再将relay log读取出来应用。

步骤1和步骤3之间是异步进行的,无需等待确认各自的状态,所以说MySQL replication是异步的。

MySQL semi-sync replication在之前的基础上做了加强完善,整个流程变成了下面这样:

  1. 首先,master和至少一个slave都要启用semi-sync replication模式;
  2. 某个slave连接到master时,会主动告知当前自己是否处于semi-sync模式;
  3. 在master上提交事务后,写入binlog后,还需要通知至少一个slave收到该事务,等待写入relay log并成功刷新到磁盘后,向master发送“slave节点已完成该事务”确认通知;
  4. master收到上述通知后,才可以真正完成该事务提交,返回事务成功标记;
  5. 在上述步骤中,当slave向master发送通知时间超过rpl_semi_sync_master_timeout设定值时,主从关系会从semi-sync模式自动调整成为传统的异步复制模式。

半同步复制看起来很美好有木有,但如果网络质量不高,是不是出现抖动,触发上述第5条的情况,会从半同步复制降级为普通复制;此外,采用半同步复制,会导致master上的tps性能下降非常严重,最严重的情况下可能会损失50%以上。

这样来看,除非需要非常严格保证数据一致性等迫不得已的场景,就不太建议使用半同步复制了。当然了,事实上我们也可以通过加强程序端的逻辑控制,来避免主从数据不一致时发生逻辑错误,比如说如果在从上读取到的数据和主不一致的话,那么就触发主从间的一次数据修复工作。或者,我们也可以用 pt-table-checksum & pt-table-sync 两个工具来校验并修复数据,只要运行频率适当,是可行的。

真想要提高多节点间的数据一致性,可以考虑采用PXC方案。现在已知用PXC规模较大的有qunar、sohu,如果团队里初期没有人能比较专注PXC的话,还是要谨慎些,毕竟和传统的主从复制差异很大,出现问题时需要花费更多精力去排查解决。

如何保证主从复制数据一致性

上面说完了异步复制、半同步复制、PXC,我们回到主题:在常规的主从复制场景里,如何能保证主从数据的一致性,不要出现数据丢失等问题呢?

在MySQL中,一次事务提交后,需要写undo、写redo、写binlog,写数据文件等等。在这个过程中,可能在某个步骤发生crash,就有可能导致主从数据的不一致。为了避免这种情况,我们需要调整主从上面相关选项配置,确保即便发生crash了,也不能发生主从复制的数据丢失。

1. 在master上修改配置

innodb_flush_log_at_trx_commit = 1
sync_binlog = 1

上述两个选项的作用是:保证每次事务提交后,都能实时刷新到磁盘中,尤其是确保每次事务对应的binlog都能及时刷新到磁盘中,只要有了binlog,InnoDB就有办法做数据恢复,不至于导致主从复制的数据丢失。

2. 在slave上修改配置

master_info_repository = "TABLE"
relay_log_info_repository = "TABLE"
relay_log_recovery = 1

上述前两个选项的作用是:确保在slave上和复制相关的元数据表也采用InnoDB引擎,受到InnoDB事务安全的保护,而后一个选项的作用是开启relay log自动修复机制,发生crash时,会自动判断哪些relay log需要重新从master上抓取回来再次应用,以此避免部分数据丢失的可能性。

通过上面几个选项的调整,就可以确保主从复制数据不会发生丢失了。但是,这并不能保证主从数据的绝对一致性,因为,有可能设置了ignore\do\rewrite等replication规则,或者某些SQL本身存在不确定因素,或者人为在slave上修改数据,最终导致主从数据不一致。这种情况下,可以采用pt-table-checksum 和 pt-table-sync 工具来进行数据的校验和修复。

转载于:https://www.cnblogs.com/sandea/p/6906108.html

FAQ系列 | 如何保证主从复制数据一致性(转)相关推荐

  1. Veeam FAQ系列转载(三)

    Veeam FAQ系列转载(三) 重复数据删除 内置的广域网加速器 镜像的应用感知处理 重复数据删除 问:Veeam执行什么类型的重复数据删除? 答:我们执行无代理的.数据块级别的.内联的(在线传输时 ...

  2. Java之List系列--ArrayList保证线程安全的方法

    原文网址:Java之List系列--ArrayList保证线程安全的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java中的ArrayList.LinkedList如何进行线程安全的操作.为 ...

  3. mysql无法安装弹出Log_[MySQL FAQ]系列 -- 启用GTID binlog新安装完的MySQL提示无法登录...

    问:刚刚新安装的MySQL,提示下面信息,无法登入,怎么回事? [root@imysql mysql]# mysql mysql ERROR 1045 (28000): Access denied f ...

  4. Veeam FAQ系列转载(一):备份

    最近有很多Veeam今年新版本特性的系列文章,包括很多云端数据管理的话题,有兴趣的朋友可以参考Veeam云架构师Mars Zhang的系列推文: Veeam 9.5 U4 新功能,利用 Cloud M ...

  5. 保证分布式数据一致性的6种方案

    问题的起源 在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式调用时候数据的一致性? 具体业务场景如下,比如一个业务操作,如果同时调用服务 A.B.C,需要满足要么同时成功:要么同时失败.A ...

  6. 保证分布式系统数据一致性的6种方案

    编者按:本文由「高可用架构后花园」群讨论整理而成,后花园是一个面向架构师的增值服务,如需了解,请关注「高可用架构」后回复 VIP 有人的地方,就有江湖 有江湖的地方,就有纷争 问题的起源 在电商等业务 ...

  7. MySQL系列之E-1------MySQL主从复制原理

    主从复制是异步复制,可以通过google的一个插件实现半同步 E.1 主从复制原理 1.建立主从复制的用户名和密码 2.将master上主库需要进行复制的库"锁库" 3.通过mys ...

  8. 分布式丛林探险系列之 Redis 主从复制模式

    本文内容 主从复制概述 主从复制原理 连接建立阶段 数据同步阶段 命令传播阶段 主从复制实战 本文小结 如果说,单体架构系统是坐在家里悠闲地喝着下午茶,那么,毫无疑问,分布式系统将会是一场永远充满惊喜 ...

  9. MySQL在线环境,[MySQL FAQ]系列 — 线上环境到底要不要开启query cache

    Query Cache(查询缓存,以下简称QC)存储SELECT语句及其产生的数据结果,特别适用于:频繁提交同一个语句,并且该表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生变 ...

最新文章

  1. 队列加锁无锁栈实现一例
  2. mysql知识总结体会博客_可能是全网最好的MySQL重要知识点/面试题总结||CSDN博客精选...
  3. 移动负载均衡技术(MBL)
  4. Python安装第三方包package
  5. Struts值栈与Ognl
  6. linux当前时间 按格式化,Linux下date命令,格式化输出,时间设置
  7. linux命令取ip,linux下命令取IP地址的多种方法
  8. java parallel.for作用_“Parallel.For”for Java?
  9. 阿里云Ubuntu安装LNMP环境之Mysql
  10. 从零开始刷Leetcode——数组(1.26)
  11. java 数组 源码_Java数组转List的三种方式及对比
  12. linux磁盘管理の进阶篇一
  13. Python初识以及变量
  14. JSP 中 pageEncoding 和 charset 区别以及中文乱码解决方案
  15. 手动创建线程池_创建线程池
  16. C语言课程设计–成绩管理系统
  17. 才子进销存软件各版本说明
  18. aspjpeg组件在2008R2下“ActiveX 部件不能创建对象”
  19. 增加设备分类号之后,设备名称SOM聚类前九个子类
  20. The requested URL /xxxx.html was not found on this server web项目报错

热门文章

  1. RabbitMQ 七种队列模式应用场景案例分析(通俗易懂)
  2. 试试 IntelliJ IDEA 自带的高能神器!
  3. 一个丧心病狂的Github项目:东北话编程,大写的服!
  4. SpringMVC工作原理详解
  5. 告别痛苦,快乐学习Pandas!开源教程《Joyful-Pandas》发布
  6. 自学机器学习课程怕踩雷?有人帮你选出了top 5优质课
  7. 机器学习必知必会10大算法
  8. 2022斯坦福AI指数报告出炉!中国霸榜AI顶会,但引用量最低
  9. 让瘫痪失语患者「说话」,脑机接口首次从大脑活动解码完整句子,登上新英格兰医学杂志...
  10. golang-实现自己的事件驱动