Datax 写入TIDB 慢,5000条/s 下降至 200条/s

【 TiDB 使用环境】生产环境
【 TiDB 版本】6.5.2
【复现路径】jdbc、channel 、batchsize
【遇到的问题:问题现象及影响】写入突然降低
【附件:截图/日志/监控】

reader : hdfs reder
channel 10
batchsize : 1024
“jdbcUrl”: “jdbc:mysql://xxxx:4000/ads_global?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=1000&prepStmtCacheSqlLimit=2048000&useConfigs=maxPerformance&rewriteBatchedStatements=true&allowMultiQueries=true&useCursorFetch=true&netTimeoutForStreamingResults=28800&sessionVariables=wait_timeout=123456”

用了 TiCDC 了吗?

:thinking: 是不是下游压力大?

写入表的表结构方便发一下看看不

granfa看看各个节点的负载情况。

CREATE TABLE ods_crm_biz_t_integral_account_log (
id bigint(64) NOT NULL AUTO_INCREMENT,
member_id bigint(64) NOT NULL COMMENT ‘会员ID’,
integral_type varchar(50) NOT NULL COMMENT ‘积分类型’,
integral_value decimal(12,2) DEFAULT NULL COMMENT ‘积分值’,
tran_id bigint(64) DEFAULT NULL COMMENT ‘交易ID’,
tran_no varchar(50) DEFAULT NULL COMMENT ‘交易号’,
update_type int(2) DEFAULT NULL COMMENT ‘变更类型(1:增加,2:扣减)’,
accruals_id bigint(64) DEFAULT NULL COMMENT ‘应计ID’,
oper_src int(2) DEFAULT ‘1’ COMMENT ‘来源(1:增加,2:扣减,4:初始化积分,5:手动调整 ,6 积分清零,7 积分兑优惠券,8 积分兑券)’,
repay_id varchar(10000) DEFAULT NULL COMMENT ‘偿还ID’,
tenant_id varchar(10) DEFAULT NULL COMMENT ‘租户ID’,
create_dept bigint(64) DEFAULT NULL COMMENT ‘创建部门’,
create_position bigint(64) DEFAULT NULL COMMENT ‘创建职位’,
create_user bigint(64) DEFAULT NULL COMMENT ‘创建人’,
create_time datetime DEFAULT NULL COMMENT ‘创建时间’,
update_user bigint(64) DEFAULT NULL COMMENT ‘修改人’,
update_time datetime DEFAULT NULL COMMENT ‘修改时间’,
status int(2) DEFAULT NULL COMMENT ‘状态’,
is_deleted int(2) DEFAULT ‘0’ COMMENT ‘是否删除(0:正常,1:删除)’,
original_member_id bigint(64) DEFAULT NULL COMMENT ‘合并原会员id’,
original_card_no varchar(100) DEFAULT NULL COMMENT ‘原会员卡号’,
original_member_comments varchar(2000) DEFAULT NULL COMMENT ‘合并会员备注’,
PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */,
KEY t_integral_account_log_index1 (member_id,integral_type),
KEY t_integral_account_log_index2 (tran_id),
KEY t_integral_account_log_index3 (tran_no),
KEY t_integral_account_log_index4 (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1594605659184571699 COMMENT=‘积分账户变更日志’

是考虑热点问题么?之前测试过表下边加东西,让他打散,不太管用呢

别的表同步没出现这个问题

目前暂时无压力

应该就是热点问题,你去dashboard下面看下导入的时候这个表热点情况,我的建议是将建表语句中的 AUTO_INCREMENT 改为 AUTO_RANDOM


其他任务目前都在以每秒1000条的速度写入,就这个任务,每秒200条。并且热点上找不到他

看你的表结构,可以看到 AUTO_INCREMENT 当前值是太大了,感觉是有问题的,建议检查下

另外,想问下,你这个数据迁移,id 这个字段是否带了值?
个人建议的话,可以带值,并且 batchsize 可以考虑改小一点

最后,我个人感觉是 AUTO_INCREMENT 的热点问题导致的 —— 比较这个自动增长,导致只能在一个 tidb 执行插入;其它 task 可以在不同的 tidb 执行插入的

带值,每个批次200条,差别不大。目前每秒最高1300条/s

带值,尽量乱序的话,应该会好许多

乱序可能没办法了,我这个是同步上游的数据,他的就这样

如果确认未来数据一直是以 同步方式向 TIDB 写入数据,可以考虑把 AUTO_INCREMENT 属性去掉,并且将主键改成 member_id ,integral_type, id ,并且删除 member_id ,integral_type 这个 二级索引
好处是利用业务 member_id 的离散型来打散数据。

但注意数据查询需要 id 进行过滤时候,尽量将其他二级索引改成 tran_id+id 等等来加速查询效果减少回表带来的 时延

这下降的太多了,环境正常?

应该有什么操作影响了吧?或者将target端修改成Mysql,验证下是不是tidb问题