mysql-5.6 Slave支持crash-safe

slave支持crash-safe是mysql-5.6复制功能最重要的改进之一。但是如何正确配置开启这个功能呢?我们来澄清一下如何完成.
具体方法:
1、停止slave的mysql实例
2、my.cnf文件中添加relay_log_info_repository=TABLE 和 relay_log_recovery=ON
3、重启slave的mysql实例
重要的细节:
为了完全明白为什么要这样设置才能开启crash-safe的功能,首先看看什么原因会导致slave crash后复制中断。
在slave上,复制包含两个线程:
IO线程负责从master拷贝binlog文件保存到本地,拷贝过来的binlog称为relay-log.SQL线程负责执行relay-log.
当前两个线程的执行进度(偏移量)都保存在文件中.IO线程的进度保存在master.info,SQL线程的进度保存在relay-log.info文件。
到目前为止还没有问题。第一个问题是这些文件被修改后不是同步写入磁盘的,每当发生crash,存储的偏移量可能都不准确.mysql-5.5修复了这个问题,使用sync_master_info=1和
sync_replay_log_info=1来保证两个文件的修改和写入是一个事务。同步当然不是免费的,需要消耗性能,如果你的raid设备设置为write-back,那么这种方法是可以接受的。
但是,即时设置了sync_master_info=1和sync_relay_info=1,坏事还是可能发生。原因是复制信息是在transactions提交后写入的,如果crash发生在事务提交和写文件之间,那么relay-log.info就可能
是错误的。当slave从新启动的时候,最后那个事务可能会被执行两次.具体的影响取决于事务的具体操作.复制可能会继续运行,或者报错,主从数据的一致性可能会被破坏。
mysql-5.6可以通过将复制的信息存放到表中代替文件来解决此问题.当relay_log_info_repository=TABLE时,mysql.slave_relay_log_info表会被创建。master_info_repository=TABLE时,mysql.slave_master_info表会被创建.
这个方法很简单,就是把SQL线程的事务和更新mysql.slave_replay_log_info的语句看成一个事务处理,这样就会一直同步的.
伪代码如下:

old:
START TRANSACTION;
--Statement 1
--...
--Statement N
COMMIT;

--Update replication info files

new:
START TRANSACTION;
--...Statement1
.....
--...Statement N
UPdate replication info
COMMIT;
不幸的是,这不是看起来那么简单,现在sql线程看上去没有问题了,但是IO线程,他更新表没有办法依赖任何事务。所以服务器不知道什么时候更新表?
答案就是:通过sync_master_info来控制.默认值是10000,表示IO线程的偏移量每10000个事务更新一次.这个样明显的不能支持slave的crash-safe.一种解决方案是sync_master_info=1,
但是注意,这样会影响性能.
另外一种更加高雅的处理方案是使用relay_log_recovery = ON,但是设置这个参数生效,需要服务器重启。这个参数可以让slave重启的时候,抛弃现有的IOthread的偏移量,从slave_relay_log_info表中获取当前的
IO线程偏移量,这样你就不需要以为crash-safe存储IO线程的信息到表里。也就是说master_info_repository = TABLE不是必须的。
最后注意,relay_log_info_repository = TABLE和sync_relay_log_info是没有关联的.所以你可以放心的从配置文件中移除sync_relay_log_info。
http://www.mysqlperformanceblog.com/2013/09/13/enabling-crash-safe-slaves-with-mysql-5-6/
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
TIPS:
针对mariadb-10.0.12环境.
还不支持master_info_repository功能.但是支持sync_master_info,sync_relay_log,sync_relay_log_info,relay_log_recovery
所以可以通过这些参数最大限度保证slave crash safe。

你可能感兴趣的:(mysql-5.6 Slave支持crash-safe)