MySQL数据库的成功离不开其replicaiton,相对于Oracle DG和Microsoft SQL Server Log Shipping来说,其简单易上手,基本上1,2分钟内根据手册就能完成环境的搭建。然而,随着使用的深入,replication自身的问题会慢慢显露,其中非crash safe的特性使得许多DBA感到头疼,甚至不能理解其所发问题的原因。简单来说,crash-safe replication是指当master/slave任何一个节点发生宕机等意外情况下,服务器重启后master/slave的数据依然能够保证一致性。

crash-safe master相对比较简单,只要使用事务的存储引擎,并且正确的配置就能达到crash safe的效果。对于最为常见的InnoDB存储引擎而言,只需在配置文件中进行如下的设置:

sync_binlog=l
innodb-flush-log-at-trx-commit=1

MySQL 5.6版本之前存在一个bug,即当启用上述两个参数时,会使得InnoDB存储引擎的group commit失效,从而导致在写密集的环境中性能的急剧下降。因此,DBA在性能和数据一致性中做了妥协,通常将参数innodb-flush-log-at-trx-commit设置为2,而这就导致了master不再是crash safe的,主从数据可能会不一致。MariaDB真正解决了该问题,因此很多分支版本,比如Percona,

Facebook MySQL,InnoSQL都将MariaDB的group commit方案移植到了自己的分支中,从而解决group commit失效的问题。

crash-safe slave的情况就有些复杂,而这可能是DBA更为常见的问题。例如slave不断的报1062错误,或者发现主从数据不一致(特别是表没有主键的情况)。而这时DBA的选择通常也很无奈,基本就是全库重建了。所以说,当你有运维超过200台以上的MySQL服务器的经验时,就会发现这是一个很大的问题。

导致不能实现crash-safe slave有两方面的原因,即replication中的SQL thread和IO thread。首先来看SQL thread,其主要完成两个操作:

  • 运行relay log中对应的事务信息

  • 更新relay-info.log文件

更新relay-info.log文件是为了记录已经执行relay log中的位置,当slave重启后可以根据这个位置继续同步relay log。但是,这里用户会发现这两个操作不是在一个事务中,一个是数据库操作,一个是文件操作,因此不能达到原子的效果。此外,MySQL数据库默认对于文件relay-info.log是写入到操作系统缓存,因此在发生宕机时可能导致大量的已更新位置的丢失,从而导致重复执行SQL语句,最终的现象就是主从数据不一致。MySQL 5.5新增了参数sync_relay_log_info,可以控制每次事务更新relay-info.log后就进行一次fdatasync操作,这加重了系统负担,而且即使这样也可能存在最后一个事务丢失的情况。

早在MySQL 4.0时Google就发布过补丁解决过该问题(https://code.google.com/p/google-mysql-tools/wiki/TransactionalReplication),其在每次InnoDB存储引擎提交时,记录二进制日志的位置信息到事务系统段的段头。当slave重启后将保存的这部分的信息重新生成relay-info.log文件。Percona也采用了这种方式,并通过参数innodb_recovery_update_relay_log来控制是否在启动时替换relay-info.log文件。

MySQL 5.6采用了另一种方法,就是将relay-info.log的信息保存在InnoDB的事务表中,这时两个操作都是数据库操作,在一个事务中就能得到原子性。例如对于slave的日志回放,其过程为:

BEGIN;
apply log event;
apply log event;
UPDATE mysql.slave_relay_log_info    SET Master_log_pos = Exec_Master_Log_Pos,Master_log_name = Relay_Master_Log_File,Relay_log_name = Relay_Log_File,Relay_log_pos = Relay_Log_Pos;COMMIT

这样的处理方式解决更新relay-info.log的原子性问题,但是这是最终完美的解决方案吗?很可惜,还是存在一些缺陷。可以看到由于最后表slave_relay_log_info的更新会锁住记录,从而导致slave上的事务提交都是串行的。虽然MySQL 5.6支持并行复制,但是由于串行更新表slave_relay_log_info,再次导致group commit失效。因此通过--log-slave-updates再立级联replication的话,性能又会受限。MariaDB正在解决该问题,非常有可能在MariaDB 10 GA版本中见到完美的解决方案。

IO thread用于同步master上的二进制日志,但是其在crash时依然会导致数据不一致的情况发生。IO thread将收到的二进制日志写入到relay log,每个二进制日志由多个log event组成,所以每接受到一个log event就需要更新master-info.log。和relay-info.log一样,其也是写入操作系统缓存,参数sync_master_info可以控制fdatasync的时间。由于IO thread的更新不能像SQL thread一样进行放到一个事务进行原子操作,因此其是对数据一致性会产生影响,设想一个log event传送到了relay log中两次的情形。

不过好在从MySQL 5.5版本开始提供了参数relay_log_recovery,当发生crash导致重连master时,其不根据master-info.log的信息进行重连,而是根据relay-info中执行到master的位置信息重新开始拉master上的日志数据(不过需要确保日志依然存在于master上,否则就。。。)

crash-safe是运维人员不能忽略的一点,否则DBA将忙于处理这些异常状况导致的slave服务停止的情形。MySQL 5.6虽然提供了crash safe的解决方案,但依然存在一些不完美的可能性。所以,小伙伴们,让我们期待MariaDB 10 GA版本的发布吧。

转载于:https://blog.51cto.com/402753795/1828540

MySQL crash-safe replication相关推荐

  1. 阿里云RDS深度定制-XA Crash Safe

    简介: 近几年,随着分布式数据库系统的兴起,特别是基于MySQL分布式数据库系统,会用到XA来保证全局事务的一致性.众所周知,MySQL对XA事务的支持是比较弱的,存在很多问题.为了满足分布式数据库系 ...

  2. replication crash safe

    什么是主从复制的replication crash safe? 参数master_info_repository有两个值: FILE (对应的文件master.info),  or TABLE (对应 ...

  3. 检查mysql的replication_MySQL Replication需要注意的问题

    MySQL Replication 大家都非常熟悉了,我也不会写怎么搭建以及复制的原理,网上相关文章非常多,大家可以自己去搜寻.我在这里就是想总结一下mysql主从复制需要注意的地方.有人说主从复制很 ...

  4. multi source replication mysql,Disabling Multi-Source Replication in MySQL 5.7

    Multi-channel replication is one of the great feature shipped with MySQL 5.7, With allowed the capab ...

  5. 深入解读MySQL8.0 新特性 :Crash Safe DDL

    前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...

  6. 账户系统db服务器为创建快照,Mysql 服务器同步(replication)设置.docx

    Mysql 服务器同步(replication)设置 Mysql 服务器同步(replication)设置MySQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服 ...

  7. 宋利兵 mysql_《MySQL 5.7 Replication新特性》分享之互动问题解答

    分享主题 <MySQL 5.7 Replication新特性> 嘉宾介绍 宋利兵,MySQL研发工程师.2009年加入MySQL全球研发团队,从事MySQL复制相关功能的开发. 主题介绍 ...

  8. Galera replication for MySQL(包括Galera replication原理)

    Galera replication for MySQL(包括Galera replication原理) 原文  http://www.gpfeng.com/?p=603 转自:http://blog ...

  9. mysql semi-synchronous_MySQL Semisynchronous Replication介绍

    前言 MySQL 5.5版本之前默认的复制是异步(Asynchronous )模式的, MySQL 5.5 以plugins的方式提供了Semisynchronous Replication 模式.在 ...

  10. mysql批量insert bug_MySQL Bug insert into on duplicate key update 语法更新 text blob 大字段导致 MySQL crash...

    1. 背景 业务执行 SQL 导致 MySQL 进程 Crash,做故障切换后,新的主库又 Crash 了.查看 MySQL 错误日志,发现多次 Crash 时的堆栈相同,如下: Thread poi ...

最新文章

  1. 用 Python 实现打飞机,让子弹飞吧!
  2. 对话李飞飞,揭秘国际体育赛事风“云”背后的黑科技
  3. 5 华为兼容性 双指缩放_华为EMUI10“滚屏翻译”之背后的学问
  4. 学习C++的五十条忠告
  5. phalanger php compiler,phalanger-php的.net编译器 _php技巧
  6. C++设计模式-访问者模式
  7. 《linux核心应用命令速查》连载一:accton:打开或关闭进程统计
  8. pong_计算机视觉与终极Pong AI
  9. tictac 立体井字棋
  10. 奈奎斯特与香农定理_奈奎斯特定律和香农定理
  11. excel mmult matlab,#excel 减法函数#用excel算两矩阵相乘
  12. php使用iframe框架,ThinkPHP后台首页使用iframe(框架)
  13. jQuery插件库链接
  14. 不用U盘安卓Linux系统,安卓Android-X86 安装教程 不使用U盘安装Androidx86教程
  15. acwing 3548.双端队列
  16. 最大进程线程数 连接数
  17. 用 HI3559A / Hi3519A 接入 BT1120或BT656视频
  18. Hibernate:could not execute query 列名无效
  19. access 重置索引_Microsoft Access中的索引
  20. ATtiny13与Proteus仿真-TM1637简单时钟仿真

热门文章

  1. 机器学习基础:极大似然估计(Machine Learning Fundamentals: Maximum Likelihood Estimation)
  2. OmniGraffle 7 Pro全新推出!V7.18.3(204.9.0)正式版 支持M1
  3. DNG格式转换器:​Adobe DNG Converter for Mac支持m1中文版
  4. iOS 应用的启动流程和优化详解
  5. 详解iMazing保障数据安全的设置
  6. Flask框架-模板
  7. 2017年——秋招面试总结(网宿、美图)
  8. ios 图片合成 处理合成模糊 水印 模板图片合成
  9. 简述Python类中的 __init__、__new__、__call__ 方法
  10. OA选型案例:建筑行业选型华天OA系统