MySQL复制:故障转移方案

时间:2013-02-08 12:39:41

标签: mysql replication failover

我有以下MySQL实例,以及复制设置:

S1 -----> ( M1 < - > M2 ),其中:

M1 - M2是一种多主复制设置,

S1 - 从属设备复制在主M1上完成的写入。

现在,我正在尝试使用通道故障转移机制来增强设置,如果M1发生故障,S1将从M2开始复制。目前,我看到的唯一方法是:

(S1机器上的M1故障检测机制),然后:

- > S1从本地中继日志文件中获取M1查询的最新时间戳。

- > M2搜索(使用mysqlbinlog实用程序的bash脚本)本地 binlog文件 + binlog索引,这对应于S1的最新时间戳

- > S1终于可以做一个“STOP SLAVE”,“CHANGE MASTER TO master_host = M2 ... master_log_file = ... master_log_pos = ...”等命令继续复制,但是这次从M2开始

这样做的方法是否更好(且不易出错)?

谢谢

编辑:现在,由于可公开访问的MySQL群集解决方案常用的唯一Xid binlog查询标记,因此更容易实现。

1 个答案:

答案 0 :(得分:1)

有一种更简单的方法来检索所需的binlog和位置。

当M2知道它时,使用当前的binlog和位置会更有意义吗?您需要检查M2上的Slave状态。

实施例

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.64.51.130
                  Master_User: replicant
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000463
          Read_Master_Log_Pos: 453865699
               Relay_Log_File: relay-bin.001226
                Relay_Log_Pos: 453865845
        Relay_Master_Log_File: mysql-bin.000463
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB: search_cache
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 453865699
              Relay_Log_Space: 453866038
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 106451130
1 row in set (0.00 sec)

mysql>

对于此显示,有五个关键组件:

  • Master_Log_File(第6行):上次读取位置的主文件上的日志文件
  • Read_Master_Log_Pos(第7行):从主站读取从站的最后位置
  • Relay_Master_Log_File(第10行):上次执行其位置的主文件上的日志文件
  • Exec_Master_Log_Pos(第22行):从主人在奴隶身上执行的最后位置
  • Relay_Log_Space(第23行):来自所有中继日志的字节总和

Relay_Log_Space

请注意Relay_Log_Space。一旦此数字停止递增,就会读取从Master导入的每个SQL语句。不幸的是,由于突然的故障转移,最后一个中继日志可能已损坏或完全不完整。

Replication Coordinates

另请注意,复制坐标(Relay_Master_Log_File, Exec_Master_Log_Pos)。这是你正在寻找的位置。但是,与Relay_Log_Space一样,它可能仍在递增。实际上,这些复制坐标应该等于其他复制坐标(Master_Log_File,Read_Master_Log_Pos )。那就是你知道一切都赶上来的时候。如果这对复制坐标永远不会满足,那么就它何时停止递增而言,你应该更多地依赖Relay_Log_Space

Seconds_Behind_Master怎么样?

您无法使用Seconds_Behind_Master的原因很简单。一旦主人努力工作,只需要一个复制线程(Slave_IO_RunningSlave_SQL_Running)成为NoSeconds_Behind_Master转为NULL