golang 程序压测tidb 偶发 bad connection 报错

  • 【TiDB 版本】:v4.0.8
  • 【问题描述】:golang 程序压测tidb 出现异常

在docker 中使用golang 100并发 压测tidb ,批量写入数据
偶尔出现以下报错:
{“level”:“ERROR”,“time”:“2021-01-20 17:54:19”,“file”:“service/devicerecord.go:76”,“msg”:“BatchInsert Failed:device record batch insert error: db insert error: driver: bad connection”,“logId”:“3789006240”,“requestId”:“3789013727”,“module”:“gocrius”,“localIp”:“192.168.240.239”,“uri”:""}

在tidb 日志中会有如下warn 出现:
[2021/01/20 17:45:27.151 +08:00] [WARN] [session.go:686] [“transaction association”] [conn=297930] [“retrying txnStartTS”=422349616234103758] [“original txnStartTS”=422349616103032055]
[2021/01/20 17:45:27.177 +08:00] [WARN] [client_batch.go:632] [“wait response is cancelled”] [to=172.29.238.134:20160] [cause=“context canceled”]
[2021/01/20 17:45:27.177 +08:00] [WARN] [session.go:462] [sql] [conn=298059] [label=general] [error="[kv:9007]Write conflict, txnStartTS=422349616470032731, conflictStartTS=422349616470032675, conflictCommitTS=4223496164700
32823, key={tableID=308182, handle=7493989779946307838} primary={tableID=308182, handle=1152921504608649724} [try again later]"] [txn=“Txn{state=invalid}”]

[2021/01/20 17:57:07.234 +08:00] [WARN] [session.go:487] [“commit failed”] [“finished txn”=“Txn{state=invalid}”] [error="[domain:8028]Information schema is changed during the execution of the statement(for example, table definition may be updated by other DDL ran in parallel). If you see this error often, try increasing tidb_max_delta_schema_count. [try again later]"]

请问上述的warn 是否会导致程序端的 连接失败的报错 ?

1 个赞

Write conflict 是写冲突的问题。
TiDB 有两阶段提交,prewrite 阶段和 commit 阶段。
在 prewrite 阶段,TiDB 会对 key 上加锁,可能会导致写冲突的问题。
发生写冲突后会重试。所以这个是一个 warning。

可以看一下 tidb_retry_limit 参数。
https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_retry_limit

日志中的warn 问题不大。
程序端压测是连接池配置的有问题,会拿到失效的连接。问题已解决
感谢回复

1 个赞

感谢反馈~

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。