【MySQL】MySQL5.6新特性之crash-safe

一 介绍

MySQL 5.6 针对复制功能提供了新特性: slave支持crash-safe. 该功能可以解决之前版本中系统异常断电可能导致的SQL thread 信息不准确的问题。本文从原理方面对该特性进行介绍。


二 原理

在了解crash-safe slave 之前,我们先分析一下MySQL 5.6 之前的版本出现 crash-unsafe 的原因。在slave上,复制包含两个线程:即replication中的IO thread和SQL thread。IO thread负责从master拷贝binlog文件并保存到本地,拷贝过来的binlog称为relay-log.

SQL thread负责执行relay-log.两个线程的执行进度(偏移量)都保存在文件中.IO thread的执行状态信息保存在master.info文件,SQL thread的执行状态信息保存在relay-log.info文件。系统运行正常的情况下,这种模式到目前为止还没有问题。需要注意的是这些文件被修改后不是同步写入磁盘的,每当系统发生crash,存储的偏移量可能都不准确.MySQL 5.5通过两个参数修复了该问题,使用sync_master_info=1和sync_replay_log_info=1 来保证Slave 的两个线程每次写一个事务就分别向两个文件同步一次 IO thread和SQL thread当前执行的信息。当然同步操作不是免费的,频繁更新磁盘文件需要消耗性能,如果你的RAID设备的IO策略设置为WRITEBACK 模式,那么这种方法便可以接受的。

MySQL 5.6版本通过将复制信息存放到表中来解决此问题.通过配置两个参数 relay_log_info_repository=TABLE,master_info_repository=TABLE,relay log info 会存放到 mysql.slave_relay_log_info表中,master info 会存放mysql.slave_master_info表中。就是把SQL线程执行事务和更新mysql.slave_replay_log_info的语句看成一个事务处理,这样就会一直同步的.

从上面的改变解决了SQL thread记录执行状态可能导致不一致的风险,但是对于IO thread 依然存在问题 。IO thread 从master上拷贝binlog写入 relay log中,每个二进制日志由多个log event组成,所以每接收到一个log event就需要更新master-info.log而且该是写入操作系统缓存。从IO thread的工作原理来看,它没有办法 将写入master info和拉取binlog放到同一个事务中而保持原子操作,因此IO thread 的行为是会对数据一致性会产生影响,设想一个log event传送到了relay log中两次的情形。如何解决呢?

方案一 通过参数sync_master_info可以控制fdatasync的时间。默认值是10000,表示IO线程的偏移量每10000个事务更新一次 ,通过设置其为1,每写一次事务便同步到master.info 。

方案二 通过MySQL 5.5版本开始提供的参数relay_log_recovery ,当slave发生crash后重启之后重连master时,slave不根据master-info.log的信息进行重连,而是根据relay-info中执行到master的位置信息重新开始拉master上的日志数据。


三 如何使用

1 停止slave的mysql实例
2 my.cnf文件中添加
master-info-repository=TABLE
relay-log-info-repository=TABLE
relay-log-recovery = 1

注意:
如果是MySQL 5.6.5 或者更早期。slave_master_info 和 slave_relay_log_info 表默认使用MyISAM 引擎。所以还得修改成innodb,如下:

ALTER TABLE mysql.slave_master_info ENGINE=InnoDB; 
ALTER TABLE mysql.slave_relay_log_info ENGINE=InnoDB

四 小结

MySQL 5.6 版本为MySQL的稳定性做出了很多改进,这点值得MySQL DBA 去关注,也值得大家去思考,这些改善点还有那些不足之处?有如何解决?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值