双向数据同步(进阶)
· 阅读需 5 分钟
简述
本文主要介绍 CloudCanal MySQL 双向同步新版本功能,特点包括:
- 不依赖 GTID
- 不依赖事务的顺序,可并行
- 对端操作减少
- 对云数据 库(MySQL)的普遍支持
- 支持库表列裁剪、映射以及自定义数据处理
技术点
防冲突标记
GTID 防冲突标记包含 MySQL 的 server_uuid 和事务号,新方案我们选择 binlog 数据标记。
DML 在 Binlog 中正常的事件顺序依次为 QueryEvent(TxBegin)、TableMapEvent、WriteRowEvent(IUD)、QueryEvent(TxEnd) , 如果需要对同步的数据打上标记,除非对 WriteRowEvent 做标记,否则没有可下手的地方。但是要达成这个目标,以我们的认知来看,除非改引擎代码。
然后,我们盯上了 MySQL binlog 中一个描述变更行 statement 的事件 RowsQueryLogEvent ,这个事件只在打开 MySQL binlog_rows_query_log_events 参数才会出现,而这个事件可以带上执行 sql 的注释。
为此,我们设计了 CloudCanal 写入对端时自动带上 /*ccw*/ 标记,这样在 RowsQueryLogEvent 的 sql 语句中也会出现该标记,在双向同步中,如果遇到这个标记,过滤即可。
新的 DML 事件顺序变成了 QueryEvent(TxBegin)、TableMapEvent、RowsQueryLogEvent、WriteRowEvent(IUD)、QueryEvent(TxEnd)。
操作示例
准备 CloudCanal
- 下载安装 CloudCanal 私有部署版本,使用参见快速上手文档
添加数据源
- 本案例采用 阿里云 RDS for MySQL, 为测试便利起见,2台数据库都位于 hangzhou 区域
- 在 RDS 实例详情->参数设置,设置 binlog_rows_query_log_events 为 on
- 登录 CloudCanal 平台 ,数据源管理 -> 添加数据源 , 将准备的数据库逐步添加进来
- 建议对数据源进行描述修改,防止配置正反链路时,识别错数据库

创建正向同步任务
-
任务管理->新建任务
-
双向同步中,正向任务一般指源端有数据,目标端无数据的链路,涉及对端数据初始化
-
第一个页面,选择源端和目标端数据源和相关信息,点击下一步

