zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    LeetCode:Length of Last Word
    Team Queue(POJ 2259)
    LeetCode:Largest Rectangle in Histogram(update)
    bzoj4821 && luogu3707 SDOI2017相关分析(线段树,数学)
    luogu1438无聊的数列(区间加等差数列,求一个数的和)
    luogu1081 开车旅行2012 D1T3 (倍增,set,O2)
    bzoj4094 && luogu3097 最优挤奶
    luogu3888 GDOI2014拯救莫里斯 (状压dp)
    noip2017D1T3逛公园(拓扑图上dp,记忆化搜索)
    bzoj1065 NOI2008奥运物流 (dp,树上背包,推式子)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351561.html
Copyright © 2011-2022 走看看