Otter 跨机房数据同步方案
Otter 跨机房数据同步方案
由于项目需求要把整个线上产品迁移上云,从自建IDC机房的所有服务都迁移至腾讯云。原先考虑采用腾讯云的DTS服务,但是发现他们产品属于公测阶段,在加上腾讯云RDS服务居然没有提供外网访问的tls安全传输保证,这样如果一旦开启外网地址,可能导致数据库被入侵或者攻击。基于以上考虑点,在加上我们同机房数据迁移采用otter的定制版,最终我们决定改造otter,支持跨机房安全传输。otter的改造点详细请查看文章
Otter工作原理
说明:
- 基于Canal开源产品,获取数据库增量日志数据。
- 典型管理系统架构,manager(web管理)+node(工作节点)
- manager运行时推送同步配置到node节点
- node节点将同步状态反馈到manager上
- 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作。
跨机房原理
说明:
- 数据涉及网络传输,S/E/T/L几个阶段会分散在2个或者更多Node节点上,多个Node之间通过zookeeper进行协同工作 (一般是Select和Extract在一个机房的Node,Transform/Load落在另一个机房的Node)。
- node节点可以有failover / loadBalancer. (每个机房的Node节点,都可以是集群,一台或者多台机器)。
跨机房传输开源方案
- Node都需要开通3个外网端口,分别是dubbo通信默认2088端口、http下载服务默认2089端口和mbean服务默认2090端口;
- 数据源需要公网ip访问;
- zookeeper需要实现跨机房数据同步;
- manager节点需要提供公网ip,用于跨机房node注册到manager节点;
由于开源方案需要node提供多个端口和数据库需公网访问,目前我们采用的rds云服务不支持ssl协议,故如果采用开源跨机房方案,会造成rds和业务服务器的安全漏洞,因此我们考虑适合公司的安全跨机房传输。
安全传输改造点
跨机房zk采用ip隧道网络打通,最外层由运维增加tls加密传输通行,跨机房的Node本地增加端口映射;
IDC机房的manager节点调用跨机房Node节点也是通过ip隧道打通(node提供dubbo接口),跨机房Node启用外部ip,由本地端口映射转到隧道入口;
跨机房node节点调用IDC机房的manager节点采用ip隧道打通(manager提供dubbo接口),跨机房Node的配置文件otter.properties调整otter.manager.address配置,由本地端口映射到隧道入口;
跨机房node相互通信采用https通信,数据文件加密,修改Pipeline配置,将传输模式配置为http,文件传输加密配置为true,启用公网同步(需改造构造下载地址映射转换);
全量同步改造点
由于全量同步我们是基于otter社区版本的自由门改造的,当在跨机房环境,逆向全量同步出现retl库和源库不在同一个机房,导致Node的extract阶段不能反查源库。考虑到逆向全量一般很少使用可以不解决,后来发现数据校验的一键修复功能也是采用了全量同步的原理来进行数据修正,最终我们决定直接将node的extract阶段给抽离出来,可以由用户选择。
数据校验改造点
由于之前的数据校验是通过manager阶段,分别想源库和目标库查询crc校验码来比较,但是在跨机房的场景下,manager节点不能直连跨机房的数据源,这里我们改造根据查询源库的情况下,直接查看select的node是否启用外网ip来判断该数据库是否是跨机房,然后提供对应的node上增加批量查询校验码的dubbo服务,由manager节点直接查询数据库或者调用对用node的dubbo服务来做比对。
总结
通过安全传输改造、全量同步改造、数据校验改造,otter跨机房传输可以支持源库跨机房、目标库跨机房、源库和目标库跨机房场景。