ticdc跨公网同步数据方案

【 TiDB 使用环境】生产环境
【 TiDB 版本】6.5.0
现在我们数据库需要从阿里云迁移到华为云,文档里面有相关的方案,但是有一些不明白的地方请教一下大家

这里我对ticdc部署在源端tidb还是目标端这个问题比较疑惑
方案一:ticdc部署在源端, --sink-uri= 填目标端的公网ip地址进行同步,这个方案我试过了,数据虽然能同步,但是速度非常慢。
方案二:按照文档的最佳实践说明,将ticdc部署在目标端,–sink-uri= 填写目标端的内网ip地址


但是这个方案我不太明白,公网同步的时候我ticdc如果部署在目标端,怎么拉到源端的数据呢,而且两边的pd保存的都是各自内网的ip关系,请求不出去。

麻烦大佬们指点一下方案,谢谢

文档的意思是cdc的服务器放在目标端的网段中,cdc的实例还是部署在源端tidb集群里。

因为目标端在另外一个云,如果ticdc实例归在原端tidb集群里管理,那他拿到原端pd tikv节点的IP都是内网IP,到时候怎么能访问的了呢

你这跨云了,所以两边都要有可访问的公网ip

ticdc跨公网的话,如果源端没开外网访问,但是能访问外网,那只能部署在源端,因为你部署在目标端无法访问源端,如果源端也能通过外网访问,那肯定是部署在目标端,但是跨外网的话,看你带宽有多大了,同步速度收带宽所限。

有,两边的都有公网ip并且可以互通访问

源端和目标端都能外网访问。如果ticdc部署在目标端机房但集群拓扑归属于源端,也就是pd使用源端的pd,那ticdc拿到源端的pd,kv的ip应该是内网ip,迁移的时候相当于目标端机房的ticdc用内网ip访问,好像也没办法拉到源端tikv的数据。

tiup ctl:v6.5.0 cdc  changefeed create --server=http://xxx.xxx.50.118:8300 --sink-uri="mysql://root:youmai456@192.168.0.101:4000" --changefeed-id="mall-task1" --start-ts="439701707253350615" 

这里我尝试过–server=使用目标端ticdc的外网ip,–sink-uri=输出到目标端内网ip的tidb集群,最终在–start-ts=这步报错,ticdc拿不到源端之前记录的时间点进行增量同步。

确实,跨公网ticdc部署在目标端无法获取到本地tikv的变化数据了,pd倒是可以指定为pd的外网ip和端口,然后在阿里云的安全组中开放一下pd的ip和端口给ticdc。。。

这个操作我也试过了,我尝试扩容一个公网的pd想给ticdc来用,结果原端集群直接炸了,我还把生产给搞崩了。看这个帖子:救急!!!,生产集群崩了,pd没办法选举.

你现在两个集群不是部署在阿里云和华为云的ecs上吗?每个ecs应该能开放外网ip加端口的,但是你部署的时候肯定是要以内网ip来进行部署的,因为网络延迟低,所以你现在只能在源端(阿里云)部署ticdc然后连接到目标端(华为云)进行同步了,部署在目标端(华为云)的话,虽然ticdc能够连接到源端(阿里云)的pd的外网ip,但是连接不到tikv的内网ip,所以确实第二种方法是行不通了。。。

这种方案传输是OK的,但是cdc输出端垮了公网,速度非常慢的,基本类似于同步不出去(公网宽带都有100M),所以也是不可用的。

大佬还有其他的迁移办法吗

对于跨云(或者跨地区)的同步,推荐以下操作:

  • 将 TiCDC 部署到下游,是 TiCDC 到下游 TiDB 的网络延时进可能低。
  • 打通上下游的网络,使得 TiCDC 能访问到所有 TiKV 和 PD。

这时同步速度上限取决于上下游之间网络的带宽。

上游和下游tidb集群都是用内网ip部署的,请教下怎么能让ticdc能访问到所有 TiKV 和 PD呢

用阿里云的dts 同步到华为云的mysql 或tidb

看了一下,阿里云DTS居然支持同步tidb了,这个好像挺少人用的,你那边有试过成功的吗

这个只是写入端支持TiDB了吧,上游应该还不支持

对数据的同步周期有要求么?如果是6.5.0的话,其实也可以考虑通过OSS来搞,通过PiTR把增量更新同步到OSS上,阿里云周期性的应用一下增量日志。不过这种方案适合做一次性的数据切换,但是做不了常态的热备。

我看了下,算间接支持支持了。利用Pump 和 Drainer输出到kafka,DTS消费kafka再输出到目标端

1 个赞

要不断的做增量同步,等业务切割完检查再没有增量同步后就结束了。我试下这方案行不行

PiTR和TiCDC一样,都可以保证RPO完全不丢数据,就是RTO有些长,需要每隔一段时间来应用changelog,对业务验证读是可以了。唯一缺点是读写得一起切换过去,没办法先切读,后切写。