问题现象
1、drainer worker3 queue size高。
2、数据同步到下游tidb延迟。
3、drainer日志正常推进,但是savepoint有延迟
问题排查
1、检查大事务,未发现有写入量大的事务。
2、检查下游集群状态
下游tidb集群状态正常,集群没有负载,通过select * from information_schema.cluster_processlist where info is not null;
执行多次,只抓到一次正在执行的sql,检查从集群的慢SQL,也没有任何记录,说明从集群是没有任何问题的,那么问题就是卡在drainer。
3、抓取drainer debug分析
curl http://drainer_ip:8249/debug/pprof/profile?seconds=30 > debug.info
sample 只有 90ms,是 profile 30s 的 0.3%,所以cpu是很空闲的。
4、检查是否有大量的小事务
发现在问题时间有大量的小事务在执行,通过select * from information_schema.cluster_processlist where info is not null;多次抓取发现都是同一张表的update
问题结论
worker_N 的 N 是由 crc32(all unique keys) % worker_count计算,并且如果SQL有因果关系会分发到一个worker上执行。而更新同一张表是有因果关系的,只能分发给同一个worker进行,所以需要尽量避免大量的单表更新。