一次 meet_lock 告警异常处理过程
作者: dba_gc 原文来源:https://tidb.net/blog/52b39abc
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
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/224310dc1c7541e42f401ba40】。文章转载请联系作者。
评论