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. 详解C#特性和反射(四)

    本篇内容是特性和反射的最后一篇内容,前面三篇文章: 详解C#特性和反射(一) 详解C#特性和反射(二) 详解C#特性和反射(三) 一.晚期绑定(Late Binding)是一种在编译时不知道类型及其成 ...

  2. SVN安装后,右键不显示SVN菜单项

    打开svn->setting对话框,找到Icon Overlays, show overlays and context menu only explorer当中显示, 重启电脑.配置如下所示:

  3. CentOS7安装sogou输入法

    centos7中自带的ibus用起来相当不爽,就决定自己换个搜狗,遇到阻力不少,在此记下,防止下次不会也给大家提供一些参考.(参见<kali下安装中文输入法>) 准备阶段: 安装fcitx ...

  4. 交换排序:冒泡排序vs快速排序

    在开发的过程中, 经常会遇到集合排序, 那么一般情况下, 我们都是使用list.OrderBy()的方式来排序, 也无需关注到里面算法的实现是个什么样子. 正好这几天准备回顾一下数据结构与算法. 首先 ...

  5. 【区块链Go语言实现】Part 1:区块链基本原型

    0x00 介绍 区块链(Blockchain)是21世纪最具革命性的技术之一,目前它仍处于逐渐成熟阶段,且其发展潜力尚未被完全意识到.从本质上讲,区块链只是一种记录的分布式数据库.但它之所以独特,是因 ...

  6. SpringBoot学习(二)——Spring的Java配置方式

    Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 一.@Configuration 和 @Bean Spring的Java配置方式是通过@Configuration和@Bean ...

  7. Javascript权威指南阅读笔记--第3章类型、值和变量(1)

    之前一直有个想法,好好读完JS权威指南,便于自己对于JS有个较为全面的了解.毕竟本人非计算机专业出生,虽然做着相关行业的工作,但总觉得对于基础的掌握并没有相关专业学者扎实,正好因为辞职待业等原因,还是 ...

  8. 【Vue.js实战案例】- Vue.js递归组件实现组织架构树和选人功能

    大家好!先上图看看本次案例的整体效果. 浪奔,浪流,万里涛涛江水永不休.如果在jq时代来实这个功能简直有些噩梦了,但是自从前端思想发展到现在的以MVVM为主流的大背景下,来实现一个这样繁杂的功能简直不 ...

  9. js设计模式总结3

    1.模板方法模式 模板方法就是将多个模型抽象化归一,从中取出一个最基本的模板,当然这个模板可以作为实体对象也可以作为抽象对象,看你具体需求,其他模块只需要继承这个模块方法,也可以扩展这个方法. 举例子 ...

  10. MVC母版页_Layout.cshtml

    记得在asp.net时候,我们常会使用母版页MasterPage.而在MVC也有此功能,应用起来比MasterPage更加便捷. 在本次练习之前,所有MVC的练习均是创建单独的网页.Insus.NET ...