MySQL双主同步恢复
高可用部署场景中,MySQL采用双主自动同步的高可用模式,通过keepalived在双主节点上切换VIP,实现MySQL双主集群对外的高可用服务。和传统的MySQL主从同步相比,可以实现服务在两个节点的自动无缝切换。
本文介绍在MySQL双主数据同步出现异常,恢复双主数据同步的步骤方法。
MySQL双主实际可以理解为两个MySQL实例互为主备,是基于传统的MySQL主从同步基础上发展而来。因此实现两个MySQL实例的双主同步,实际可以分解为两个步骤:
1)实现节点1为主,节点2为备的主从同步 2)实现节点2为主,节点1为备的主从同步
查看同步状态
分别以两个MySQL实例的真实IP登录MySQL,执行
SHOW SLAVE STATUS\G
查看两个从实例的状态,如果出现报错,则说明同步异常,需要修复。
修复双主同步的步骤
停止集群服务
为保险起见,首先要停止集群服务,避免再向数据库中写入数据。暂停集群服务的步骤请参见 https://v1.cloudpods.org/zh/docs/ops/k8s/halt_cluster/ 。
下面需要确定哪个节点是当前的主节点,MySQL的VIP所在节点就是主节点。
停止当前从节点的keepalived
停止当前从节点的keepalived,以防止MySQL VIP的自动主从切换。
在从节点执行
systemctl stop keepalived
主节点操作
首先需要停止数据库的主从同步。
首先登入当前主节点的MySQL,执行如下命令停止主节点和从节点的主从同步。
STOP SLAVE;
RESET SLAVE;
然后重置主节点的MASTER Status,并锁表
RESET MASTER;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
输出如下:
MariaDB [(none)]> SHOW MASTER STATUS;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000001 | 98 | | |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
记录下MASTER的bin-log文件名称和位置。
然后退出MySQL,执行mysqldump将主节点的数据导出:
mysqldump -u root -p --all-databases > /a/path/mysqldump.sql
再登入主节点MySQL,解锁READ LOCK。
UNLOCK TABLES;
从节点操作
再登入当前从节点的MySQL,执行如下命名停止从节点的主从同步。
STOP SLAVE;
退出MySQL,将主节点dump的数据导入从节点数据库:
mysql -uroot -p < mysqldump.sql
然后再登入MySQL,恢复从节点的主从同步。
RESET SLAVE;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;
START SLAVE;
此时检查从节点的SLAVE同步状态:
SHOW SLAVE STATUS\G
确保结果包含如下状态,则说明从节点的主从同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
恢复主节点的SLAVE状态
在从节点MySQL执行(注意这里不需要再锁表)。
RESET MASTER;
SHOW MASTER STATUS;
输出如下:
MariaDB [(none)]> SHOW MASTER STATUS;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000001 | 740 | | |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
记录从节点的MASTER日志文件和位置。
在主节点MySQL执行如下命令恢复对从节点的主从同步
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=740;
START SLAVE;
此时检查主节点的SLAVE同步状态:
SHOW SLAVE STATUS\G
确保结果包含如下状态,则说明主节点的主从同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
恢复从节点keepalived
在从节点执行如下命令恢复从节点的keepalived
systemctl start keepalived
恢复服务
在控制节点,参考 https://v1.cloudpods.org/zh/docs/ops/k8s/halt_cluster/ 恢复onecloud-operator容器运行,恢复所有服务组件。
至此,配置完成。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.