mysql怎么保证一致性 mysql保证数据一致性( 二 )


可能这样表示有点抽象,让我们看下图5
从上图中可以看的更形象一点,在sql执行的时候,会有磁盘IO将数据页加载到内存,然后在内存中将数据修改,修改后的数据页在内存中叫做脏页(叫脏页因为和磁盘中的数据不一致?。? ,又因为在内存中容易丢失,所以将数据页的变更记录如redolog中,随着记录插入、更新等操作的增多,redolog空间慢慢的满了,这时候就开始刷脏操作了,page cleaner thread线程会将所有的脏页数据刷新到磁盘 , 使得变更最终被持久化到磁盘 。
【mysql怎么保证一致性 mysql保证数据一致性】讲到这里一定还会有人不太理解,刷脏之前断电了咋办?
这就是redolog的另一个重要的作用,crash-safe能力 , 实现的逻辑是这样的,断电后内存的数据都没了,重启后读取redolog文件,因为redolog文件记录的是在Innodb页x的m处做了y的修改 , 所以根据redolog将涉及到的Innodb页重新加载到内存,根据redolog的记录将内存中的数据重新修改,这样就能恢复断电前的数据了 。

下期预告:还是MySQL , 敬请期待
本文首发自:程序员阿牛
mysql 如何解决数据一致性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-checksumpt-table-sync 两个工具来校验并修复数据,只要运行频率适当,是可行的 。
真想要提高多节点间的数据一致性,可以考虑采用PXC方案 。现在已知用PXC规模较大的有qunar、sohu,如果团队里初期没有人能比较专注PXC的话,还是要谨慎些,毕竟和传统的主从复制差异很大,出现问题时需要花费更多精力去排查解决 。

推荐阅读