1. TiKV-Detail>Coprocessor Overview
或者通过 Prometheus 获取指标数据
sum(rate(tikv_coprocessor_request_error[10m])) by (reason)
2. TiDB>KV Errors
指标解释:
- regionMiss:Region缺失
- txnLock:代表出现了写冲突
- tikvLockFast:代表出现了读写冲突
通过监控可以看到写冲突并不高,而且也没有读写冲突。那么为什么会meet_lock指标会这么高?下面我们再通过 TiDB 日志分析一下。
3. TiDB 日志分析
通过关键字"prewrite encounters lock" 过滤预写阶段遇到的锁冲突的tableID:
grep “prewrite encounters lock” tidb.log |awk -F “tableID” ‘{print $2}’ | awk -F “,” ‘{print $1}’ | sort | uniq -c > pe.log
通过关键字"Write conflict 过滤写冲突的tableID:
grep “Write conflict” tidb.log |awk -F “tableID” ‘{print $2}’ | awk -F “,” ‘{print $1}’ | sort | uniq -c > wc.log
cat wc.log
1 =24289
86 =24900
5 =25849
3 =27930
86表示冲突次数,24900表示tableID。
但量过滤出来的冲突次数也不多,说明锁冲突的原因不在这里,下面查找TiKV日志。
4 TiKV 日志分析
[2021/06/23 14:59:24.085 +08:00] [WARN] [endpoint.rs:537] [error-response] [err=“Key is locked (will clean up) primary_lock: 7480000000000073E15F728000000000201B3C lock_version: 425834987480679159 key: 7480000000000073E15F728000000000201B3C lock_ttl: 20631 txn_size: 10 lock_for_update_ts: 425834987480679159”]
[2021/06/23 14:59:24.085 +08:00] [WARN] [endpoint.rs:537] [error-response] [err=“Key is locked (will clean up) primary_lock: 7480000000000073E15F728000000000186E7D lock_version: 425834987454465021 key: 7480000000000073E15F72800000000104676B lock_ttl: 21177 txn_size: 28 lock_for_update_ts: 425834987454465021”]
[2021/06/23 14:59:24.088 +08:00] [WARN] [endpoint.rs:537] [error-response] [err=“Key is locked (will clean up) primary_lock: 7480000000000073E15F728000000000186E7D lock_version: 425834987454465021 key: 7480000000000073E15F72800000000104676F lock_ttl: 21177 txn_size: 28 lock_for_update_ts: 425834987454465021”]
[2021/06/23 14:59:24.089 +08:00] [WARN] [endpoint.rs:537] [error-response] [err=“Key is locked (will clean up) primary_lock: 7480000000000037A95F698000000000000001013036363634366239FF6661636532623036FF3635353738613837FF3139333964313330FF0000000000000000F7 lock_version: 425834986536960179 key: 7480000000000037A95F698000000000000004013735333464366666FF3166313439373739FF3365366431333531FF3835363861386464FF0000000000000000F7038000000065F421CC lock_ttl: 5380 txn_size: 2 lock_type: Del lock_for_update_ts: 425834986536960179”]
TiKV日志当中有很多Key is locked (will clean up),这段报错信息表示出现了读写冲突,当读数据时发现 key 有锁阻碍读,这个锁包括未提交的乐观锁和未提交的 prewrite 后的悲观锁。
- primary_lock:锁对应事务的 primary lock。
- lock_version:锁对应事务的 start_ts。
- key:表示被锁的 key。
- lock_ttl: 锁的 TTL。
- txn_size:锁所在事务在其 Region 的 key 数量,指导清锁方式。
下面过滤出出现次数最多的 primary_lock
cat tikv.log |grep error-response | awk -F “primary_lock:” ‘{print $2}’ | awk -F " " ‘{print $1}’ | sort | uniq -c | sort -n
通过region key 命令找到 region
tiup ctl pd -u http://{pdip:port} -i
region key 7480000000000073E15F728000000000415EDF
然后通过region查找表结果显示not found
curl http://{tidbip}:10080/regions/1412629
region not found for regionID 1412629
查看一下 region 元数据信息,显示这是个空region
SELECT * FROM INFORMATION_SCHEMA.TIKV_REGION_STATUS
WHERE region_id=1412629
通过监控面板发现集群有1700+empty-region-count,下面合并空 region 看看能不能解决锁冲突异常监控数据。
tiup ctl pd -u http://{pdip:port} -i
config set max-merge-region-keys 10
config set max-merge-region-size 100
config set merge-schedule-limit 16
config set region-schedule-limit 4
config set key-type raw
合并完记得修改回来
config set max-merge-region-keys 200000
config set max-merge-region-size 20
config set merge-schedule-limit 16
config set region-schedule-limit 4
config set key-type table
结果:
大概2小时左右空region合并完,最后还有50个左右无法合并。
锁冲突信息明显降低,说明有效果。 具体为什么空region会导致锁冲突还不知道。
如果还有很多锁冲突,可以通过tidb和tikv日志继续排查。
或者通过慢查询日志过滤:Exec_retry_count 表示重试次数
grep Exec_retry_count /data/tidb_data/log/tidb_slow_query.log