TiCDC长时间卡住不同步

【 TiDB 使用环境】
生产环境 /测试/ Poc

【 TiDB 版本】
1.TiDB集群版本v5.4.0
2.TiCDC版本为v5.3.0 (v5.4.0不支持写s3,老版本v5.3.0支持)
/cdc version
Release Version: v5.3.0
Git Commit Hash: 8b816c9717a6d18430f93a6b212f3685c88d4607
Git Branch: HEAD
UTC Build Time: 2022-08-10 04:27:19
Go Version: go version go1.16.13 linux/amd64
Failpoint Build: false

【复现路径】做过哪些操作出现的问题

根据实践使用TiCDC在v5.4.0版本不支持写S3,使用V5.3.0旧版本支持同步到S3。

  1. 集群的基量数据在 TB级别,10万+ Region Leader,整个集群的写QPS在2k~3k左右,不算大。

  2. 启动TiCDC同步后,puller阶段一直在拉取数据,sorter 一直有数据进来但是没有出去,导致后续没有数据sink出去,即同步到S3的QPS观察到为0。任务拉起将近10个小时,看到sorter使用的内存逐渐升高并保持在16GB,当达到16GB后数据开始落盘,可以看到磁盘空间在不断上涨,当前磁盘已使用空间接近100GB,还有不断上涨的趋势。

  3. 从 grfafna面板看到Dataflow各个阶段 event/s 为:
    puller output(8300-kv为3k,8300-resolved为25万)–>> sorter output (event/s为0)–>> mounter output((event/s为0) -->> sink output(event/s为0)

  4. ticdc同步流的checkpoint一直卡在同步任务启动的时刻,没有推进过。对外就是一直有ticdc同步任务延迟告警。

  5. 运行过程中集群没有内存、CPU或IO的性能瓶颈,剩余资源充足。

  6. 集群有两个CDC节点,
    一个节点不断有提示:[WARN] [schema_storage.go:733] [“GetSnapshot is taking too long, DDL puller stuck?”] [ts=449931778037383875] [duration=5h50m15.195304586s]。
    另一个节点则不断刷出日志在磁盘上建立sorter的临时文件,文件名类似 sort-20197-33303.tmp,任务启动至今共创建了 3.5万个临时文件,且还在不断创建。

  7. 当前配置:
    1)cdc-server的参数per-table-memory-quota配置为800MB,上游集群有80%的写流量集中在一个表。
    2)当前同步任务配置:

{
  "info": {
    "sink-uri": "s3://tidb-backup/ixxxxx?endpoint=xxxx",
    "opts": {},
    "create-time": "2024-05-22T09:39:17.871399198+08:00",
    "start-ts": 449928746197843972,
    "target-ts": 0,
    "admin-job-type": 0,
    "sort-engine": "unified",
    "sort-dir": "",
    "config": {
      "case-sensitive": true,
      "enable-old-value": true,
      "force-replicate": false,
      "check-gc-safe-point": true,
      "filter": {
        "rules": [
          "*.*"
        ],
        "ignore-txn-start-ts": null
      },
      "mounter": {
        "worker-num": 16
      },
      "sink": {
        "dispatchers": null,
        "protocol": "default"
      },
      "cyclic-replication": {
        "enable": false,
        "replica-id": 0,
        "filter-replica-ids": null,
        "id-buckets": 0,
        "sync-ddl": false
      },
      "scheduler": {
        "type": "table-number",
        "polling-time": -1
      },
      "consistent": {
        "level": "none",
        "max-log-size": 64,
        "flush-interval": 1000,
        "storage": ""
      }
    },
    "state": "normal",
    "history": null,
    "error": null,
    "sync-point-enabled": false,
    "sync-point-interval": 600000000000,
    "creator-version": "v5.3.0"
  },

该版本CDC之前在其他集群的优化经历:TiCDC双Sink同步增量备份到S3速度慢

在当前集群的这个场景下推测是有bug,按理来说应该是边拉取数据筛选,筛选结果直接输出给sorter及后续组件处理,即使数据量大,checkpoint也应该是缓慢更新的。

请问下大佬们有没有遇到过这种情况,如何处理?

TiCDC长时间卡住不同步的可能原因和解决方案

TiCDC长时间卡住不同步可能是由于多种原因造成的,以下是一些可能的原因以及相应的解决方案:

  1. 上游未提交事务:如果上游有运行时间较长的未提交事务,TiCDC会等待这些事务提交后再继续同步数据,这可能导致同步延迟2
  2. 内部处理能力不足:当TiCDC的内部处理能力不足时,可能会出现同步任务报错,如ErrBufferReachLimit。这种情况下,可以尝试调整TiCDC的配置,提高其处理能力2
  3. 内存溢出:如果TiCDC的内部处理能力不足或下游吞吐能力不足,可能会出现内存溢出(OOM)。可以通过增加资源或优化应用逻辑来解决这个问题2
  4. 事务超时:TiDB有事务超时的机制,当事务运行超过max-txn-ttl后,会被TiDB强制回滚。TiCDC遇到未提交的事务,会等待其提交后再继续同步其数据,因此会出现同步延迟2
  5. 物理导入模式和BR恢复数据:如果在使用TiCDC同步的表上使用了TiDB Lightning物理导入模式和BR恢复数据,可能会导致TiCDC同步出现卡顿甚至卡住。在这种情况下,应该避免在使用TiCDC同步的表上使用这些操作,或者在使用后重新配置TiCDC同步任务2
  6. DDL操作:如果上游执行了有损DDL操作,TiCDC会将一条新旧数据相同的DML事件同步到下游。从TiCDC v7.1.0开始,TiCDC会过滤掉这些无用的DML事件,不再将它们同步到下游2
  7. 同步任务重启:如果同步任务停止后重新启动,可能会出现同步延迟。这是因为TiCDC需要扫描TiKV中数据的历史版本,待扫描完毕后,才能继续推进复制过程,扫描过程可能长达数分钟到数十分钟2

解决步骤

  1. 监控和诊断:首先,应监控TiCDC的状态,特别是checkpoint时间与当前时间的对比,以便及时发现问题3
  2. 重启TiCDC:如果确认TiCDC已经卡住,可以尝试重启TiCDC服务,以清除可能的临时故障或状态异常3
  3. 调整配置:根据具体情况调整TiCDC的配置,如增加资源、优化处理能力等,以改善同步性能2
  4. 增量恢复:如果因为大事务导致同步中断,可以记录因大事务而终止的changefeed的checkpoint-ts,将这个TSO作为BR增量备份的–lastbackupts,并执行增量备份。增量备份结束后,可以在BR日志输出中找到BackupTS,执行增量恢复。然后建立一个新的changefeed,从BackupTS开始同步任务,删除旧的changefeed2
  5. 避免不适配操作:避免在使用TiCDC同步的表上使用TiDB Lightning物理导入模式和BR恢复数据,以免导致未知的错误2
  6. 检查数据一致性:在恢复同步任务后,应检查上下游数据的一致性,确保数据正确无误2

怀疑和这个bug有关: TiCDC changefeed’s resolved-ts is stuck #10157

https://github.com/pingcap/tiflow/issues/10157

麻烦看下 resolvedts 面板,是不是卡住了呢

大佬是的,resolved-ts 卡住一直没推进过,时间点一直在同步任务创建启动的时刻

卡住前的日志是什么

5.x 版本的 cdc 中,快慢表会相互影响,建议拆分 changefeed 试下:

  1. 有 80% 流量的表单独放在一个 changefeed 里。
  2. 其余的表放在一个或多个 changefeed 里。

另外,确认下总共有多少张表?

1 个赞

你说的对,我也是5.4版本,之前也是都放一个changefeed 会卡住不同步,拆分成了n个changefeed 就没问题了

1 个赞

一共19个表

大佬你们的是启动就开始卡住吗,还是同步到一半才卡住?

开始数据量少同步没有问题,数据量大了后卡住的,重启、删除任务重建都是直接卡住不同步,后来拆分成多个任务就好了。

1 个赞

嗯,数据量大直接启动就卡住,看起来现象是一样的。

先试试看拆分同步任务。

早期的ticdc真的这么差么

不要再挣扎了,想要用好ticdc,建议至少升级到7.1.3, 看看我之前的帖子就知道有多么无奈了,但是到了7.1.3整个世界亮了。

大佬我想告诉你,7.1.3版本里如果你使用TiCDC的过滤功能,还会有一个坑点,就是你想要过滤DDL(drop/truncate/rename等),它也会把后续所操作表的DML过滤掉,相当于不再同步那个表的数据了。

https://github.com/pingcap/tiflow/issues/10524

这个问题在 v7.1.4 以后修复。如果有用到,还是需要升级下。

好的消息是,官方接下来会集中精力优化和完善CDC这块内容,相信会越来越完善、越来越好用。