我有以下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查询标记,因此更容易实现。
答案 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>
对于此显示,有五个关键组件:
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_Running
或Slave_SQL_Running
)成为No
而Seconds_Behind_Master
转为NULL
。