线上MySQL数据库迁移的一个方案

对线上正在使用的数据库做迁移,很少遇到这样的情况,考虑到没有长连接, 开始想到的方案很简单:
0、新建一个MySQL主从库
1、旧主单向往新主实时同步(毫秒级),新主不往旧主同步。
2、切换连DB的读账号信息,观察读是否正常。
3、切换连DB的写账号信息。
4、观察一段时间,旧库没有新写入内容即可断开往新主的同步。

实施的过程中遇到了很多问题,实际执行的方案如下:
0、申请新MySQL账号信息。
1、申请业务机授权访问新库。
2、业务机上做新库账号的联通性测试(一般跑脚本测试)。
3、确认旧库的长连接。
4、架双主,库中表自增ID区分单双号,老库中的表用单号,新库中的表用双号。老库往新库同步,新库不往老库同步。
老表:

SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 2     |
| auto_increment_offset    | 1     |
+--------------------------+-------+

新表:

SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 2     |
| auto_increment_offset    | 2     |
+--------------------------+-------+

5、灰度一台机器应用读新库。
6、全量下发读账号配置。
7、全量下发写账号配置。
8、观察N周删除老库。

下图左边是老库的单号,右边是新库同步后的结果,即使短连接,也还是会有双写的情况(一个原因是下发配置不同机器的时延)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注