ticdc同步任务tso不变

【 TiDB 使用环境`】生产
【 TiDB 版本】5.1.4
【遇到的问题】
ticdc同步任务tso不变,一共6个cdc任务,3个实时同步,3个延迟,tso一直不变。

{
“id”: “6f1ad1ff-c230-4cb1-a44b-c542dcdd1a20”,
“summary”: {
“state”: “normal”,
“tso”: 434351548455452762,
“checkpoint”: “2022-07-04 15:27:44.213”,
“error”: null
}
}

状态看着也是正常的

现象就是cdc有6个任务,3个一直实时更新,tso一直有变化,另三个任务的tso一直没变化,下游是同一套kafka,只是topic不同,tidb里的数据也是一直写入的。任务之间会相互影响吗?比如一个任务tso不变,会影响其他的同步任务?

而且将tso不变的三个任务删除一个,新建一个任务也是不行(无论指定不指定–start-ts)。目前是将三个任务全部删除,新建任务可以。

  1. 理论上不同任务的 tso 不会相互影响
  2. 对于异常任务的排查,先看看 cdc.log 有什么 ERROR/WARNING 信息

cdc_stderr.log里的信息如下:
{“level”:“warn”,“ts”:“2022-07-04T20:11:29.415+0800”,“caller”:“clientv3/retry_interceptor.go:62”,“msg”:“retrying of unary invoker failed”,“target”:“endpoint://client-49583f76-bc68-4c7e-a0f6-c2b3c34335f2/10.108.182.133:3379”,“attempt”:0,“error”:“rpc error: code = DeadlineExceeded desc = context deadline exceeded”}

现在有一点不太明白,按理说3个任务还是正常的,说明cdc本身应该没问题,有问题的三个任务,逐个删除重建应该就可以了,但实际情况是,3个任务必须全停,然后全删除后,重建任务才正常。

cdc.log里的error信息:
[2022/07/04 17:35:29.728 +08:00] [ERROR] [client.go:319] ["[pd] getTS error"] [error="[PD:client:ErrClientGetTSO]rpc error: code = Unknown desc = [PD:tso:ErrGenerateTimestamp]generate timestamp failed, generate global tso maximum number of retries exceeded"]

[2022/07/04 17:35:29.729 +08:00] [ERROR] [pd.go:130] [“updateTS error”] [error=“rpc error: code = Unknown desc = [PD:tso:ErrGenerateTimestamp]generate timestamp failed, generate global tso maximum number of retries exceeded”] [errorVerbose=“rpc error: code = Unknown desc = [PD:tso:ErrGenerateTimestamp]generate timestamp failed, generate global tso maximum number of retries exceeded\ngithub.com/tikv/pd/client.(*client).processTSORequests\ \tgithub.com/tikv/pd@v1.1.0-beta.0.20210105112549-e5be7fd38659/client/client.go:355\ github.com/tikv/pd/client.(*client).tsLoop\ \tgithub.com/tikv/pd@v1.1.0-beta.0.20210105112549-e5be7fd38659/client/client.go:304\ runtime.goexit\ \truntime/asm_amd64.s:1357\ github.com/tikv/pd/client.(*tsoRequest).Wait\ \tgithub.com/tikv/pd@v1.1.0-beta.0.20210105112549-e5be7fd38659/client/client.go:466\ github.com/tikv/pd/client.(*client).GetTS\ \tgithub.com/tikv/pd@v1.1.0-beta.0.20210105112549-e5be7fd38659/client/client.go:486\ github.com/pingcap/tidb/util/execdetails.InterceptedPDClient.GetTS\ \tgithub.com/pingcap/tidb@v1.1.0-beta.0.20210512055339-e25d1d0b7354/util/execdetails/pd_interceptor.go:60\ github.com/pingcap/tidb/store/tikv/oracle/oracles.(*pdOracle).getTimestamp\ \tgithub.com/pingcap/tidb@v1.1.0-beta.0.20210512055339-e25d1d0b7354/store/tikv/oracle/oracles/pd.go:103\ github.com/pingcap/tidb/store/tikv/oracle/oracles.(*pdOracle).updateTS\ \tgithub.com/pingcap/tidb@v1.1.0-beta.0.20210512055339-e25d1d0b7354/store/tikv/oracle/oracles/pd.go:128\ runtime.goexit\ \truntime/asm_amd64.s:1357”]

同步任务 tso 中断可以排查一下是否是这个问题: https://github.com/pingcap/tiflow/issues/4516#issuecomment-1049540773
tikv 残留锁,查看 metrics cdc -> tikv min resolved ts

今日有出现了3个任务正常,3个任务突然tso就不再变化,导致延迟了,询问业务得知,是tidb有带有大字段的任务在跑,将任务停掉后,tso开始变化,延迟慢慢追上了。
所以有个疑问,面对这种可能会有大字段的同步,cdc是如何处理的。

可以把脱敏后的带 blob 字段的测试数据发一下吗?我们这边复现一下

这个大字段存的就是一些json串

现在同步带 blob 字段的表还会有问题吗,这个问题是否可以稳定复现?看上面的报错信息,是 TiCDC 到 PD 取 tso 出的问题

能稳定复现,开发那边只要加上这个json串的字段,对应cdc任务的tso就不变了。

稳定复现具体步骤能描述下吗 ? 或者提供下复现方法。我们看一下。

就是一旦遇到涉及这个表的刷数,比如大量的update、delete,cdc就会不同步了,平时不刷数的时候,这个字段还是可以同步过去的,是需要调整cdc的什么参数?