从上面日志过滤和分析可以看到:10 分钟的日志,这个表的冲突出现了 1147 次 。
- [kv:9007]Write conflict:表示出现了写写冲突
- txnStartTS=417517629610917903:表示当前事务的 start_ts 时间戳,可以通过 pd-ctl 工具将时间戳转换为具体时间
- conflictStartTS=417517692315762921:表示冲突事务的 start_ts 时间戳,可以通过 pd-ctl 工具将时间戳转换为具体时间
- conflictCommitTS=417517692315762921:表示冲突事务的 commit_ts 时间戳,可以通过 pd-ctl 工具将时间戳转换为具体时间
- key={tableID=93643, indexID=1, indexValues={string, }}:表示当前事务中冲突的数据,tableID 表示发生冲突的表的 ID,indexID 表示是索引数据发生了冲突 。如果是数据发生了冲突,会打印 handle=x 表示对应哪行数据发生了冲突
- indexValues 表示发生冲突的索引数据
- primary={tableID=93643, indexID=1, indexValues={string, }}:表示当前事务中的 Primary Key 信息
./pd-ctl -u https://{PDIP}:2379 tso {TIMESTAMP}
通过 tableID 查找具体的表名:curl http://{TiDBIP}:10080/db-table/{tableID}
通过 indexID 查找具体的索引名:SELECT * FROM INFORMATION_SCHEMA.TIDB_INDEXES WHERE TABLE_SCHEMA='{table_name}' AND TABLE_NAME='{table_name}' AND INDEX_ID={indexID};
版本差异在 v3.0.8 版本之前,TiDB 默认采用乐观事务模型,在事务执行过程中并不会做冲突检测,而是在事务最终 COMMIT 提交时触发两阶段提交,并检测是否存在写写冲突 。当出现写写冲突,并且开启了事务重试机制,则 TiDB 会在限定次数内进行重试,最终重试成功或者达到重试次数上限后,会给客户端返回结果 。因此,如果 TiDB 集群中存在大量的写写冲突情况,容易导致集群的 Duration 比较高 。
另外在 v3.0.8 及之后版本默认使用悲观事务模式,从而避免在事务提交的时候因为冲突而导致失败,无需修改应用程序 。悲观事务模式下会在每个 DML 语句执行的时候,加上悲观锁,用于防止其他事务修改相同 Key,从而保证在最后提交的 prewrite 阶段不会出现写写冲突的情况 。
写写冲突的原因
TiDB 中使用 Percolator 事务模型来实现 TiDB 中的事务 。Percolator 总体上就是一个二阶段提交的实现 。具体的二阶段提交过程可参考乐观事务文档 。当客户端发起 COMMIT 请求的时候,TiDB 开始两阶段提交:
- TiDB 从所有要写入的 Key 中选择一个作为当前事务的 Primary Key
- TiDB 向所有的本次提交涉及到的 TiKV 发起 prewrite 请求,TiKV 判断是否所有 Key 都可以 prewrite 成功
- TiDB 收到所有 Key 都 prewrite 成功的消息
- TiDB 向 PD 请求 commit_ts
- TiDB 向 Primary Key 发起第二阶段提交 。Primary Key 所在的 TiKV 收到 commit 操作后,检查数据合法性,清理 prewrite 阶段留下的锁
- TiDB 收到两阶段提交成功的信息
写写冲突发生在 prewrite 阶段,当发现有其他的事务在写当前 Key (data.commit_ts > txn.start_ts),则会发生写写冲突 。
TiDB 会根据 tidb_disable_txn_auto_retry 和 tidb_retry_limit 参数设置的情况决定是否进行重试,如果设置了不重试,或者重试次数达到上限后还是没有 prewrite 成功,则向 TiDB 返回 Write Conflict 错误
排查步骤
监控
从监控信息,初步排查是因为 tikv 比较繁忙,出现了 server is busy 的情况 。导出了 21 日异常时间段的 tidb 以及 tikv-details 的监控信息,开始进行排查 。
Query Details
推荐阅读
- 襄樊卖房一月能赚多少,卖房的最好时机
- 服务器芯片的三个战场,谁能笑傲江湖?
- 存储的未来:分布式存储、原子存储、DNA存储
- 分布式存储:边缘计算应用落地的催化剂
- 杭州嘉悦天地的电话是多少,嘉悦X7嘉悦X7实拍
- 台式机使用核显的方法,已有独立显卡如何使用核显
- 保险杠拆了再装会不会松动
- 《变形金刚》是如何拍出来的,如何拍摄机器零件
- 正时皮带没对准的表现
- 汽车顶上的盒子是什么