MySQL 双向数据同步
简述
本文主要介绍 CloudCanal 如何实现 MySQL 双向同步并防循环,方案特点包括:
- 不依赖 GTID
- 不依赖事务的顺序,可并行
- 对端操作减少
- 对云数据库 (MySQL) 的普遍支持
- 支持库表列裁剪、映射以及自定义数据处理
技术点
防冲突标记
GTID 防冲突标记包含 MySQL 的 server_uuid 和事务号。CloudCanal 使用新方案,即 binlog 数据标记。
DML 在 binlog 中正常的事件顺序依次为 QueryEvent(TxBegin)、TableMapEvent、WriteRowEvent(IUD)、QueryEvent(TxEnd),如果需要对同步的数据打上标记,需要对 WriteRowEvent 做标记,根据当前的认知,这需要通过修改引擎代码来实现。
经过研究,ClouGence 注意到 MySQL binlog 中一个描述变更行 statement 的事件 RowsQueryLogEvent,这个事件只在打开 MySQL binlog_rows_query_log_events 参数才会出现,而这个事件可以带上执行 SQL 的注释。
为此,ClouGence 设计了 CloudCanal 写入对端时自动带上 /*ccw*/ 标记,这样在 RowsQueryLogEvent 的 SQL 语句中也会出现该标记。在双向同步中,如果遇到这个标记,过滤即可。
新的 DML 事件顺序变成了 QueryEvent(TxBegin)、TableMapEvent、RowsQueryLogEvent、WriteRowEvent(IUD)、QueryEvent(TxEnd)。