跨互联网数据同步进阶
简介
CloudCanal 推出 跨互联网安全数据同步 方案之后,有一些商业客户落地,效果良好,不过客户也反馈了一些改进和新需求,其中最大的一个需求即双向同步防循环。
近期 CloudCanal 版本支持了这个特性,整体方案进一步升级,最大特点包括:
- 两端数据库完全不开放公网端口
- 两端数据库可双向同步,无循环
- 两端数据库元数据可映射
- 具备传输安全和鉴权
- 不依赖消息等软件
技术点
防循环
我们复用了 CloudCanal 处理 MySQL 双向同步防循环逻辑, 写入对端时, SQL 自动带上 /*ccw*/ 标记。
再打开 MySQL binlog_rows_query_log_events 参数, 将 binlog DML 事件顺序变成 QueryEvent(TxBegin)、TableMapEvent、RowsQueryLogEvent、WriteRowEvent(IUD)、QueryEvent(TxEnd)。
其中 RowsQueryLogEvent 中的 SQL 如果带有 /*ccw*/ ,则为循环事件, 进行过滤。从而达到防循环目的。
操作示例
数据源准备
使用阿里云杭州和上海 RDS for MySQL
- 打开 binlog_rows_query_log_events 参数,binlog 事件带上原始 SQL
- 数据库不开公网端口
- 数据走互联网, 采用 HTTPS 传输和用户名密码认证。
初始化两边数据库表结构(如需要)
CloudCanal 准备
杭州环境部署 CloudCanal ,并购买 RDS for MySQL
上海环境部署 CloudCanal , 并购买 RDS for MySQL
CloudCanal docker 安装包解压后 ,需 修改 docker-compose.yml 端口映射再安装/升级,以 18443 端口为例
开放 ECS 安全组相关端口,以便远程连接,以 18443 端口为例
添加 Tunnel 数据源
分别在 杭州 和 上海 CloudCanal 配置 Tunnel 数据源
因为双向同步,所以两个环境需要配置各自内网的 Tunnel 数据源和对方公网 Tunnel 数据源
杭州数据源列表
上海数据源列表
为 Tunnel 初始化元数据
杭州 创建两个 MySQL -> Tunnel 结构迁移,并完成
上海 创建两个 MySQL -> Tunnel 结构迁移,并完成
任务创建
使用 4 条同步任务进行双向同步,任务列表和能力如下
任务 数据源 任务参数 杭州任务 A 杭州 Tunnel(公网) -> 杭州 MySQL 杭州任务 B 杭州 MySQL -> 上海 Tunnel(公网) deCycle=true, 过滤回环事件 上海任务 C 上海 Tunnel(公网) -> 上海 MySQL 上海任务 D 上海 MySQL -> 杭州 Tunnel(公网) deCycle=true, 过滤回环事件
杭州任务 A 创建
选择 Tunnel(杭州) 和 MySQL数据库(杭州)
选择表、列、映射略
任务正常运行,监听端口并准备接收数据
上海任务 C 创建
选择 Tunnel(上海) 和 MySQL数据库(上海)
选择表、列、映射略
任务正常运行,监听端口并准备接收数据
杭州任务 B 创建
选择 MySQL (杭州) 和 Tunnel 数据源(上海)
选择数据同步,并 关闭任务自动启动
选择表、列、映射略
任务正常创建
任务详情 > 更多功能 > 参数设置,目标端数据源配置,deCycle 参数设置为 true
启动任务,正常运行
上海任务 D 创建
选择 MySQL (上海) 和 Tunnel 数据源(杭州)
选择数据同步,并 关闭任务自动启动
选择表、列、映射略
任务正常创建
任务详情 > 更多功能 > 参数设置,目标端数据源配置,deCycle 参数设置为 true
启动任务,正常运行
功能验证
杭州 MySQL 造增量数据
使用 CloudDM 在杭州 MySQL 上造增量数据
杭州写入上海 Tunnel 任务 有流量
上海接收数据任务 有流量
杭州接收数据任务 无流量
上海写入杭州 Tunnel 任务 无流量
上海 MySQL 造增量数据
使用 CloudDM 在上海 MySQL 上造增量数据
上海写入杭州 Tunnel 任务 有流量
杭州接收数据任务 有流量
杭州写入上海 Tunnel 任务 无流量
上海接收数据任务无流量
以上两者说明防循环生效
总结
本文主要介绍 CloudCanal 进行跨互联网数据双向同步,具备 两端数据库完全不开放公网端口,可双向同步无循环 等特点。