导读

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

关于主从复制

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

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

在master上提交事务后,并且写入binlog,返回事务成功标记;

将binlog发送到slave,转储成relay log;

在slave上再将relay log读取出来应用。

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

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

首先,master和至少一个slave都要启用semi-sync replication模式;

某个slave连接到master时,会主动告知当前自己是否处于semi-sync模式;

在master上提交事务后,写入binlog后,还需要通知至少一个slave收到该事务,等待写入relay log并成功刷新到磁盘后,向master发送“slave节点已完成该事务”确认通知;

master收到上述通知后,才可以真正完成该事务提交,返回事务成功标记;

在上述步骤中,当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 工具来进行数据的校验和修复。

mysql主从怎么确保数据一致_如何保证主从复制数据一致性相关推荐

  1. mysql主从同步部分表_Mysql入门MySQL 主从同步部分数据表

    <Mysql入门MySQL 主从同步部分数据表>要点: 本文介绍了Mysql入门MySQL 主从同步部分数据表,希望对您有用.如果有疑问,可以联系我们. 导读:在配置MySQL主从同步的时 ...

  2. mysql单表最大数据量_你的Mysql库真需要Adaptive Hash Index

    说起AHI(Adaptive Hash Index),有的同学估计很陌生,都没听说,没关系,下面我会详细解释说明的,AHI是什么,mysql库为什么要设计AHI,解决什么问题,只有了解这些原理之后,才 ...

  3. mysql 不会丢失数据吗_讨论MySQL丢失数据的几种情况

    1. 概述 很多企业选择MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么情况下,各种原因导致MySQL会丢失部分数据.本文不讨论Oracle和MySQL的优劣,仅仅关 ...

  4. mysql 优化配置 大批量数据插入_[译] MySQL 最佳实践 —— 高效插入数据

    当你需要在 MySQL 数据库中批量插入数百万条数据时,你就会意识到,逐条发送 INSERT 语句并不是一个可行的方法. MySQL 文档中有些值得一读的 INSERT 优化技巧. 在这篇文章里,我将 ...

  5. mysql主从同步当天数据,mysql主从数据同步

    一,安装好主数据库和从数据库,此处省略 我已经准备好了以下数据库 主: centos 7 mysql 5.7 ip 192.168.1.2 从: centos 7 mysql 5.7 ip 192.1 ...

  6. 查看mysql整个库的数据大小_查看mysql数据库容量大小

    第一种情况:查询所有数据库的总大小,方法如下: mysql> use information_schema; mysql> select concat(round(sum(DATA_LEN ...

  7. mysql将备份的数据导入_成功将MySQL的大型数据导入导出和备份(转载)

    原来的数据使用的是MySQL4.1,大概有800M左右.使用 mysqldump -u username -p dbname > "filename" 导出的时候很容易死掉, ...

  8. mysql写入不了数据文件_求助,为何我的数据不能写入数据库

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 为何我的数据不能写入数据库 数据库表的结构 phpMyAdmin SQL Dump -- version 4.6.4 -- https://www.php ...

  9. mysql第3章数据定义_【MySQL数据库】第3章解读:服务器性能剖析 (下)

    软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...

  10. mysql主从表单如何设计_如何快速的10分钟制作一张主从表单及功能

    //#region 奖励管理--主单列表//奖励管理--主单列表--页面加载 function Reward_MainList_Init() { func_InitPageDataSource(); ...

最新文章

  1. Ubuntu下设置电信拨号上网(10.04版)
  2. java命令可以但是javac命令找不到
  3. 转载大神的一篇文章----【如何选择开源许可证?】
  4. 计算机卡在无法显示网页,我的电脑上网上银行一直“无法显示网页”
  5. python面试总结(二)列表去重与单例
  6. 二值化图像是什么?图像如何二值化?
  7. 复数基础—— i = 根号 -1 _3
  8. MyBatis+springMVC+easyUI (dataGirl)实现分页
  9. 访问艺术馆(codevs 1163)树形DP
  10. html时间显示在div中,在html页面实时显示系统时间
  11. tongweb java_home_中间件 东方通tongweb的使用
  12. windows痛苦面具-C盘瘦身法
  13. ansible——inventory主机清单
  14. python自动加减法_python实现随机加减法生成器
  15. 78 python - 打飞机案例(让敌机移动)
  16. (白光LED显色性)计算白光LED的显色指数(CRI)数据异常,色质指数CQS来替代
  17. 华为日志服务器文档,华为日志服务器配置
  18. 译:在ROS上发布Odometry信息
  19. shell怎样循环遍历字符串数组
  20. 驼峰命名法【规约与实践】

热门文章

  1. 项目沟通管理 试题分析
  2. DELL G3 3690耳机插入不显示,没声音
  3. android dns 设置,安卓手机怎么设置DNS Android手机修改DNS图文教程
  4. C64+DSP资源手册笔记
  5. jpg与gif的互换(使用ImageIO代替JPEGImageEncoder)
  6. iview vue 打包图标不显示_使用vue-cli生成的项目引用iview组件库,字体图标不显示...
  7. 基于Edge插件+格式工厂下载B站上的喜欢视频
  8. Edge浏览器启用ie模式,并且打开调试面板
  9. 电路交换、报文交换和分组交换的区别
  10. PPT转换为PDF后,图片背景变成了黑色的解决方法