从 TiDB 集群迁移数据至兼容 MySQL 的数据库
- 搭建环境
- 迁移全量数据
- 迁移增量数据
- 平滑切换业务
部署上游 TiDB 集群。
使用 TiUP Playground 快速部署上下游测试集群。更多部署信息,请参考 。
部署下游 MySQL 实例。
在实验环境中,可以使用 Docker 快速部署 MySQL 实例,执行如下命令:
在生产环境中,可以参考 Installing MySQL 来部署 MySQL 实例。
模拟业务负载。
在测试实验环境下,可以使用 go-tpc 向上游 TiDB 集群写入数据,以让 TiDB 产生事件变更数据。执行如下命令,将首先在上游 TiDB 创建名为 tpcc 的数据库,然后使用 TiUP bench 写入数据到刚创建的 tpcc 数据库中。
tiup bench tpcc -H 127.0.0.1 -P 4000 -D tpcc --warehouses 4 prepare
tiup bench tpcc -H 127.0.0.1 -P 4000 -D tpcc --warehouses 4 run --time 300s
关于 go-tpc 的更多详细内容,可以参考。
搭建好测试环境后,可以使用 工具导出上游集群的全量数据。
注意
关闭 GC (Garbage Collection)。
为了保证增量迁移过程中新写入的数据不丢失,在开始全量导出之前,需要关闭上游集群的垃圾回收 (GC) 机制,以确保系统不再清理历史数据。
执行如下命令关闭 GC:
MySQL [test]> SET GLOBAL tidb_gc_enable=FALSE;
Query OK, 0 rows affected (0.01 sec)
查询
tidb_gc_enable
的取值,判断 GC 是否已关闭:MySQL [test]> SELECT @@global.tidb_gc_enable;
备份数据。
导出完毕后,执行如下命令查看导出数据的元信息,metadata 文件中的
Pos
就是导出快照的 TSO,将其记录为 BackupTS:cat dumpling_output/metadata
Started dump at: 2022-06-28 17:49:54
SHOW MASTER STATUS:
Log: tidb-binlog
Pos: 434217889191428107
Finished dump at: 2022-06-28 17:49:57
恢复数据。
使用开源工具 MyLoader 导入数据到下游 MySQL。MyLoader 的安装和详细用例参见 MyDumpler/MyLoader。执行以下指令,将 Dumpling 导出的上游全量数据导入到下游 MySQL 实例:
myloader -h 127.0.0.1 -P 3306 -d ./dumpling_output/
(可选)校验数据。
通过 工具,可以验证上下游数据在某个时间点的一致性。
sync_diff_inspector -C ./config.yaml
部署 TiCDC。
完成全量数据迁移后,就可以部署并配置 TiCDC 集群同步增量数据,实际生产集群中请参考 。本文在创建测试集群时,已经启动了一个 TiCDC 节点,因此可以直接进行 changefeed 的配置。
创建同步任务。
在上游集群中,执行以下命令创建从上游到下游集群的同步链路:
tiup ctl:v<CLUSTER_VERSION> cdc changefeed create --server=http://127.0.0.1:8300 --sink-uri="mysql://root:@127.0.0.1:3306" --changefeed-id="upstream-to-downstream" --start-ts="434217889191428107"
以上命令中:
--server
:TiCDC 集群任意一节点地址--sink-uri
:同步任务下游的地址--changefeed-id
:同步任务的 ID,格式需要符合正则表达式^[a-zA-Z0-9]+(\-[a-zA-Z0-9]+)*$
--start-ts
:TiCDC 同步的起点,需要设置为实际的备份时间点,也就是第 2 步:迁移全量数据中 “备份数据” 提到的 BackupTS
更多关于 changefeed 的配置,请参考 。
通过 TiCDC 创建上下游的同步链路后,原集群的写入数据会以非常低的延迟同步到新集群,此时可以逐步将读流量迁移到新集群了。观察一段时间,如果新集群表现稳定,就可以将写流量接入新集群,步骤如下:
-
[
{
"id": "upstream-to-downstream",
"summary": {
"state": "stopped", # 需要确认这里的状态为 stopped
"tso": 434218657561968641,
"checkpoint": "2022-06-28 18:38:45.685", # 确认这里的时间晚于停写的时间
"error": null
}
]