多JDBC线程写入TDengine报Invalid table ID错误如何解决
问题诱因
- 高并发下建表与写入时序冲突:1000线程并发写入场景下,如果使用写入时自动建表逻辑,建表请求会先进入服务端元数据写入队列等待处理,在建表请求未完成提交的情况下,同表的写入请求提前到达vnode,内存中暂无对应表的元数据信息,就会返回
80000600: Invalid table ID错误,服务端日志中create-table is reput into mwrite queue的记录也可以印证该问题。 - vnode元数据处理能力饱和:1亿级写入量+1000并发线程的压力下,vgroup的元数据锁竞争剧烈,部分vnode的元数据处理队列被打满,无法及时响应写入请求,就会返回
80000014: Database not ready错误。
解决方案
- 优先使用预建表逻辑:提前创建所有测试需要的超级表、子表,避免依赖写入时的自动建表能力,从根源上消除建表和写入的时序冲突问题。
- 增加客户端重试机制:如果业务场景必须使用自动建表,可在客户端针对
80000600、80000014两个错误码增加指数退避重试逻辑,重试次数设置为3~5次即可覆盖绝大多数元数据延迟场景。 - 调整服务端配置参数:适当调大
mwriteQueueSize参数至2048或4096,缓解元数据写入队列的排队压力;同时调大numOfThreadsPerVnode参数,提升vnode的并行处理能力,降低元数据锁竞争概率。 - 优化并发压力分布:TDengine单客户端建议并发线程数不超过500,可将1000线程的压力拆分到2~3个客户端节点分散压力,避免单节点压测导致服务端元数据处理能力过载。
- 升级到稳定版本:如果当前使用的是2.x版本的TDengine,建议升级到最新的3.x稳定版,3.x版本对高并发下的元数据处理逻辑做了大量优化,可大幅降低该类报错的出现概率。
内容的提问来源于stack exchange,提问作者hook capt
相关产品推荐
相关产品推荐

