Dav*_*eau 8 mysql disaster-recovery mysql-replication master-master
我已经实现了一个基于主-主复制的 mysql HA 解决方案。前端部分有一种机制可以保证在给定时间只有一个 db 将被读/写(即我们只对 HA 使用复制)。
我已经确认复制按预期工作,但我想知道故障场景和恢复。特别是,我担心当一个 master 在不可恢复状态下失败时会发生什么,并且需要从另一个 master 重新创建:
mysqldump
(我们的数据库相当大,并且mysqldump
在使用几个月后很容易花费数小时)。第一个问题的简单解决方案是使用第三个数据库作为备份,我可以从中执行mysqldump
. 但是,我如何确保重新创建的 master 可以以一致的方式从正在运行的 master 开始复制?
小智 2
据我所知,解决这个问题有两种基本方法。首先,如果您运行的是 InnoDB 而不是 Myisam,那么您可以在事务中进行备份(--single-transaction --lock-tables=FALSE),它与 --flush-logs 结合使用(不是必需的,但很好)和--master-data 将为您提供具有复制位置信息的一致备份。刷新日志将在创建转储之前重置日志,这意味着位置始终为 106,并且 --master-data 会将日志文件名称和位置放在转储文件中。当然,您必须在主服务器上运行它才能使 --master-data 工作。
您提到的第二种方法是使用第三台主机来创建备份。在这种情况下,您需要停止复制,确保数据库是只读的(尽管实际上,所有副本都应该是只读的,因为这不会影响复制的写入),然后创建备份并记录复制位置。在这种情况下,您不能使用 --master-data。相反,你可以这样做:
echo 'stop slave' | mysql {options)
mysqldump {your options} > DB.sql
echo 'show slave status\G' > DB.replication
echo 'start slave' | mysql {options)
Run Code Online (Sandbox Code Playgroud)
如果您需要从此备份进行恢复,则可以运行恢复,然后设置复制,其中两个参数 master_log_file 和 master_log_pos 来自 DB.replication 文件:
master_log_file = value of Master_Log_File
master_log_pos = value of Exec_Master_Log_Pos
Run Code Online (Sandbox Code Playgroud)
注意:您可以并且应该从另一个副本进行测试。
附加说明:如果您有一个副本池(例如,如果您将 Web 应用程序的读取与写入分开),则副本可能与新主服务器不同步;如果故障转移发生在大量写入 I/O 期间,则可能会发生这种情况,因为副本流是异步的,并且无法保证故障转移时您的备用副本与其他副本处于相同位置。然而,这还没有发生在我身上......
归档时间: |
|
查看次数: |
3040 次 |
最近记录: |