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

导读

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 工具来进行数据的校验和修复。

时间: 2024-09-30 15:50:54

如何保证主从复制数据一致性的相关文章

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

导读 MySQL主从复制环境中,如何才能保证主从数据的一致性呢? 关于主从复制 现在常用的MySQL高可用方案,十有八九是基于 MySQL的主从复制(replication)来设计的,包括常规的一主一从.双主模式,或者半同步复制(semi-sync replication). 我们常常把MySQL replication说成是MySQL同步(sync),但事实上这个过程是异步(async)的.大概过程是这样的: 在master上提交事务后,并且写入binlog,返回事务成功标记: 将binlog

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

保证分布式系统数据一致性的6种方案 数据的一致性协议有: 1.  两阶段提交协议  2PC 2.  三阶段提交协议  3PC 3.  RWN协议 4.  raft协议 5.  Paxos协议  参考下面网址:      http://chuansong.me/n/286764951149

kernel如何保证cache数据一致性

在嵌入式系统中,cache位于CPU与DDR之间,是一段SRAM,读写性能远高于DDR,利用cache line提供了预取功能,平衡CPU与DDR之间的性能差异,提高系统的性能. 据我了解,ARM/PPC/MIPS三款主流嵌入式处理器都是软件管理cache,即有专门的指令来进行cache操作,如PPC的iccci icbi,ARM的CP15协处理器也提供对cache的操作. cache的操作有2种:写回和无效.写回操作是将cache中数据写回到DDR中,无效操作是无效掉cache中原有数据,下次

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

保证分布式系统数据一致性的6种方案问题的起源 在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式调用时候数据的一致性? 具体业务场景如下,比如一个业务操作,如果同时调用服务 A.B.C,需要满足要么同时成功:要么同时失败.A.B.C 可能是多个不同部门开发.部署在不同服务器上的远程服务. 在分布式系统来说,如果不想牺牲一致性,CAP 理论告诉我们只能放弃可用性,这显然不能接受.为了便于讨论问题,先简单介绍下数据一致性的基础理论. 强一致性 当更新操作完成之后,任何多个后续进程或者线程的

保证分布式系统数据一致性的6种方案(转载)

问题的起源 在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式调用时候数据的一致性? 具体业务场景如下,比如一个业务操作,如果同时调用服务 A.B.C,需要满足要么同时成功:要么同时失败.A.B.C 可能是多个不同部门开发.部署在不同服务器上的远程服务. 在分布式系统来说,如果不想牺牲一致性,CAP 理论告诉我们只能放弃可用性,这显然不能接受.为了便于讨论问题,先简单介绍下数据一致性的基础理论. 强一致 当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值.这种是

MySQL 数据库主从复制架构

前文<MySQL 数据库事务与复制>分析了 MySQL 复制过程中如何保证 binlog 和事务数据之间的一致性,本文进一步分析引入从库后需要保证主从的数据一致性需要考虑哪些方面. 原生复制架构 MySQL 的原生复制架构原理如上图所示.从库的 I/O Thread 线程负责不断读取主库的 binlog 日志文件并写入本地的 Relay log 临时缓存.从库的 SQL Thread 线程则不断读取 Relay log 重放事件入库.整个过程看起来是比较简单清晰的,但其中有几个点对主从数据一致

MySQL主从复制Replication

主从复制原理 1.主从复制的前提1.1 两台以上mysql实例多台物理机多个mysql实例1.2 主库要开启二进制日志 1.3 主库要提供复制相关的用户replication slave,一个比较特殊的权限grant replication slave on . to repl@'10.0.0.%' identified by '123';1.4 从库需要将和主库相差的数据,进行追加一般情况下可以人为备份主库数据,恢复到从库上1.5 从应该从恢复之后的时间点,开始自动从主库获取新的二进制日志开始

第十章&#183; MySQL的主从复制

一.主从复制简介 ? 2015年5月28日11时,12小时后恢复,损失:平均每小时106.48W$ 1)高可用 2)辅助备份 3)分担负载 复制是 MySQL 的一项功能,允许服务器将更改从一个实例复制到另一个实例. 1)主服务器将所有数据和结构更改记录到二进制日志中. 2)从属服务器从主服务器请求该二进制日志并在本地应用其内容. 3)IO:请求主库,获取上一次执行过的新的事件,并存放到relaylog 4)SQL:从relaylog中将sql语句翻译给从库执行 二.主从复制原理 1.主从复制的

Redis主从复制以及主从复制原理

Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API.从 2010年 3 月 15 日起,Redis 的开发工作由 VMware 主持.从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助. 概述 在现有企业中 80%公司大部分使用的是 redis 单机服务,在实际的场景当中单一节点的 redis 容易面临风险. 面临问题 1. 机器故障.我们部署到一台 Redis 服务器,当发生机