MySQL 5.6 对复制功能提供了新特性:slave 支持 crash-safe,可以解决之前版本中系统异常断电可能导致的 SQL thread 信息不准确的问题。

原文:Enabling crash-safe slaves with MySQL 5.6

可以对从库进行配置 crash-safe 功能是 MySQL 5.6 关于复制的一个重大改进。然而,我们注意到对如何正确开启这个特性存在着一些困惑,那么让我们一起来理清它要怎么做。

简而言之

1.停止从库 MySQL 服务
2.在配置文件 my.cnf 中添加 relay_log_info_repository = TABLErelay_log_recovery = ON
3.重启 MySQL 服务

详情

如果要在从库启用 crash-safe 功能,你需要完全理解为什么要做上面所说的配置。首先,让我们看看当从库崩溃时,同步会断开的原因。

在一个从节点上,同步涉及到 2 个线程:把主节点的二进制日志( binary log )复制到本地中继日志( relay log )的 IO 线程,和执行中继日志中的语句的 SQL 线程。

每个线程当前的位置都存储在一个文件里:IO 线程存在 master.info 文件,SQL 线程存在 relay-log.info 文件。

目前为止,还不错。第一个问题是,这些文件不是每次写入都同步到磁盘:如果发生崩溃,写入到文件中的位置很可能是不准确的。MySQL 5.5 对这个进行了修复:你可以设置 set sync_master_info = 1sync_relay_log_info = 1 来确保写入两个日志文件,且在每个事物完成之后同步到磁盘。同步到磁盘是有消耗的,但如果服务器有回写缓存(write-back cache)策略,这些设置还是会起到积极作用,可以接受。

但是,等等,尽管设置了 set sync_master_info = 1sync_relay_log_info = 1,还是可能会出现问题。这是因为复制信息是在事务提交后才写到日志文件的。因此,如果在事务提交之后,复制信息更新之前,发生了崩溃,当服务重启的时候,复制信息是错的,并且一个事务会被执行两次。这个影响取决于这些事务:复制可能还可以正常运行,或者断开,或者导致数据不一致。

MySQL 5.6 通过让我们把复制信息存储在表中,而不是之前的日志文件,来解决这个问题(当 relay_log_info_repository = TABLE 时,会创建表 mysql.slave_relay_log_info,当 master_info_repository = TABLE 时,会创建表 mysql.slave_master_info)。想法很简单:我们可以把复制信息的更新包含在事务当中,确保它和数据同步/一致。

伪代码,写入到日志文件:

START TRANSACTION;
-- Statement 1
-- ...
-- Statement N
COMMIT; -- Update replication info files

写入到表:

START TRANSACTION;
-- Statement 1
-- ...
-- Statement N
-- Update replication info
COMMIT;

然而,这并没有看起来那么简单。对于 SQL 线程而言,因为实例会在一个事务提交的同时更新表 slave_relay_log_info,所以它可以很好的工作。但对于 IO 线程而言,表的更新与事务的执行并没有关系,那么实例是如何知道什么时候去更新这个表呢?

答案是:它由 sync_master_info 控制。默认值是 10000,表示 IO 线程的位置,只会每提交 10000 个事务更新一次。这明显不利于从节点开启 crash-safe 功能。一个办法是,设置 sync_master_info = 1,但正如前面所说,它可能会影响性能(这就是为什么默认值不是 1)。

还有一个更加优雅的解决方法,那就是设置 relay_log_recovery = ON,但它要求重启 MySQL 服务。这个设置确保当 MySQL 服务启动时,会从表 slave_relay_log_info 恢复出最新的 IO 线程的位置。因此,你甚至不需要为了从节点要开启 crash-safe 功能而去把 IO 线程信息存储到表里面。换句话说,没有必要再去设置 master_info_repository = TABLE

最后再说一下,一旦设置了 relay_log_info_repository = TABLE,因为这个表会在每个事物提交之后更新,所以 sync_relay_log_info 的设置是什么就无关紧要了。因此,你可以安全地把它从配置文件中删除。

MySQL crash-safe replication(1)的更多相关文章

  1. InnoSQL HA Suite的实现原理与配置说明 InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync replicaiton)的功能 MySQL 5.6支持了crash safe功能

    InnoSQL HA Suite的实现原理与配置说明  InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync repl ...

  2. MySQL crash-safe replication(3): MySQL的Crash Safe和Binlog的关系

    2016-12-23 17:29 宋利兵 作者:宋利兵 来源:MySQL代码研究(mysqlcode) 0.导读 本文重点介绍了InnoDB的crash safe和binlog之间的关系,以及2阶段提 ...

  3. MySQL Crash Errcode: 28 - No space left on device

    一台MySQL服务器突然Crash了,检查进程 ps -ef | grep -i mysql 发现mysqld进程已经没有了, 检查错误日志时发现MySQL确实Crash了.具体如下所示: 注意日志中 ...

  4. 【原创】获取MySQL crash 时的core file

    最近有台服务器的MySQL经常crash,为了进一步定位问题,开启了mysql core file功能,开启步骤如下,供参考 [开启步骤] 1. my.cnf文件中增加2个配置选项 [mysqld] ...

  5. System.TypeInitializationException: 'The type initializer for 'MySql.Data.MySqlClient.Replication.ReplicationManager' threw an exception.'

    下午在调试的时候报错数据库连接就报错我就很纳闷后面用原来的代码写发现还是报错 System.TypeInitializationException: 'The type initializer for ...

  6. 《MySQL 5.7 Replication新特性》分享之互动问题解答

    原创 2016-07-21 宋利兵 MySQL中文网 分享主题 <MySQL 5.7 Replication新特性> 嘉宾介绍 宋利兵,MySQL研发工程师.2009年加入MySQL全球研 ...

  7. 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash

    背景 近期线上MySQL 5.7.20集群不定期(多则三周,短则一两天)出现主库mysql crash.触发主从切换问题,堆栈信息如下: 从堆栈信息可以明显看出,在调用 try_acquire_loc ...

  8. MySQL 5.7 Replication 相关新功能说明

    背景: MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制.基于组提交的并行复制.在线修改Replication Filter.GTID增强.半同步复制增强等.因为都是和复制相关, ...

  9. Mysql 5.5 replication 多数据库主从备份Master-Slave配置总结

    配置Mysql server 5.5 的双机备份,也就是master-slave模式.本例子还是一个多database复制的情况. 现在有两个database在同一台mysql server,也就是m ...

  10. Latch导致MySQL Crash

    作者:沃趣科技数据库专家 董红禹 问题概述 最近我们遇到一个MySQL的问题,分析后很有代表意义,特地写出来供大家参考.出现问题是,数据库先是被置为只读,然后过了一段时间,MySQL直接Crash掉了 ...

随机推荐

  1. PTA (Advanced Level) 1003 Emergency

    Emergency As an emergency rescue team leader of a city, you are given a special map of your country. ...

  2. 代码统计工具cloc

    https://sourceforge.net/projects/cloc/files/cloc/v1.64/

  3. Java设计模式学习记录-建造者模式

    前言 今天周末,有小雨,正好也不用出门了,那就在家学习吧,经过了两周的面试,拿到了几个offer,但是都不是自己很想去的那种,要么就是几个人的初创小公司,要么就是开发企业内部系统的这种传统开发,感觉这 ...

  4. MongoDB的“not master and slaveok=false”错误解决

    在客户端操作MongoDB时经常会如下错误: SECONDARY> show collections; Fri Jul :: uncaught exception: error: { } 原因是 ...

  5. python学习之内存机制

    不可变对象(字符串.元组) 1. a = 1 首先在内存中创建对象1,并记录对象的引用计数为1次. id(a) 查看变量a引用的对象的内存地址 2. b = 1 内存中已存在对象1,变量b引用对象1, ...

  6. RabbitMQ远程不能访问问题的解决

    刚刚安装的RabbitMQ-Server-3.3.5,并且也已经开启了Web管理功能,但是现在存在一个问题: 出于安全的考虑,guest这个默认的用户只能通过http://localhost:1567 ...

  7. SQL SERVER存储过程中使用事务

    存储过程格式: CREATE PROCEDURE YourProcedure AS BEGIN SET NOCOUNT ON; BEGIN TRY---------------------开始捕捉异常 ...

  8. 全局唯一订单号生成方法(参考snowflake)

    backgroud Snowflake is a network service for generating unique ID numbers at high scale with some si ...

  9. 【ibatis】入门讲例

    Ⅰ .Ibatis项目机构 打开资源包,可以看到里面有一个simple_exzample的文件夹,在MyEclipse8.5中新建一个JAVA项目,将刚才的文件夹中内容复制到项目SRC下,这样的话呢, ...

  10. 编译java代码出现 错误: 需要class, interface或enum 提示

          出现这种错误: 需要class, interface或enum 提示,一般分两种情况: 1.代码编写有误: 2.编码器选择编码格式有问题.(主要是用非记事本编写代码文件,存在编码格式转换问 ...