2
1
2
0
专栏/.../

TiDB MVCC 问题处理

 WalterWj  发表于  2024-03-07

背景

TiDB 在应对 delete 和 update 产生的 mvcc 数据,compact 触发概率一般比较低,导致空间释放慢,甚至一些 SQL 由于 mvcc 原因导致查询慢,因此在比较低版本可以用一下方法来解决。

按照 Region 查找与压缩操作

查找指定表在特定 TiKV 节点上的 Region

要查询与test.sbtest2表关联的Region ID(仅限表数据,非索引数据),并且确定该Region的副本位于指定TiKV节点(172.16.201.18:20160)上,请使用以下SQL查询:

SELECT 
    r.region_id
FROM 
    information_schema.tikv_region_status AS r
JOIN 
    information_schema.tikv_region_peers AS p
    ON r.region_id = p.region_id
JOIN 
    information_schema.tikv_store_status AS st
    ON p.store_id = st.store_id
WHERE 
    r.table_name = "sbtest2"
    AND r.db_name = "test"
    AND r.is_index = 0
    AND st.address = '172.16.201.18:20160'
ORDER BY 
    r.start_key ASC 
LIMIT 1;

这个查询返回与表test.sbtest2关联的第一个Region ID,这个Region的副本位于172.16.201.18:20160地址的TiKV节点上。

按照 Region ID 进行 Compact 操作

在获取到Region ID之后(例如,假设Region ID为98),你可以使用TiUP的ctl工具对该Region进行Compact操作,以此来减少空间占用和提高读写性能。以下是按照Region ID进行Compact操作的步骤:

  1. 首先,检查Region的属性以确认是否需要执行Compact:

    tiup ctl:v6.5.8 tikv --host 172.16.201.18:20160 region-properties -r 98 | grep delete
    
  2. 使用Compact命令来压缩write CF(Column Family):

    tiup ctl:v6.5.8 tikv --host 172.16.201.18:20160 compact --bottommost force -c write -r 98
    
  3. 同样的,对default CF进行Compact操作:

    tiup ctl:v6.5.8 tikv --host 172.16.201.18:20160 compact --bottommost force -c default -r 98
    
  4. 再次检查Region的属性以确认Compact操作之后删除键的数量:

    tiup ctl:v6.5.8 tikv --host 172.16.201.18:20160 region-properties -r 98 | grep delete
    

通过以上步骤,你可以对TiKV中的指定Region进行Compact操作,优化数据存储结构。

请注意,版本号(如v6.5.8)和TiKV节点的地址(如172.16.201.18:20160)需要根据实际环境进行更改。务必保证使用与集群版本对应的ctl工具版本,以避免不兼容的问题。

这个方法影响最小,但是操作最复杂,如果表比较大,region 数量较多的情况下非常麻烦,推荐脚本化处理

TiKV 按照表手动 Compaction 操作指南

在执行 compaction 之前和之后,需要记录表的行数,以便验证 compaction 的效果。以下是详细步骤:

步骤 1:验证 Compaction 效果

在执行 compaction 前后,运行以下 SQL 语句并保存结果:

EXPLAIN ANALYZE SELECT COUNT(1) FROM table_name;

table_name 替换为待 compaction 的表名。

步骤 2:执行手动 Compaction

2.1 查询表的最小和最大 Key

执行 SQL 查询以获取表的最小和最大 Key:

SELECT MIN(START_KEY) AS START_KEY, MAX(END_KEY) AS END_KEY
FROM information_schema.tikv_region_status
WHERE db_name = 'db_name' AND table_name = 'table_name';

db_nametable_name 替换为数据库名和表名。

2.2 转换 Key 为 Escaped 格式

使用 tikv-ctl 将获取到的最小和最大 Key 转换为 escaped 格式:

tiup ctl:v7.1.1 tikv --host 172.16.201.73:25160 --to-escaped start_key
tiup ctl:v7.1.1 tikv --host 172.16.201.73:25160 --to-escaped end_key

替换 start_keyend_key 为上一步骤查询到的实际值。

例如,假设转换后的 start_key 和 end_key 为:r\000\000\001\000\000\000\000\373t\200\000\000\000\000\000\000\377[\000\000\000\000\000\000\000\370,在 compaction 时,需要在 key 前面加上字符 z

2.3 执行 Compaction

Compact Write CF

tiup ctl:v7.1.1 tikv --host IP:port compact --bottomost force -c write --from 'zr\000\000\001\000\000\000\000\373' --to 'zt\200\000\000\000\000\000\000\377[\000\000\000\000\000\000\000\370'

如果 Write CF Compaction 无效,尝试 Compact Default CF

tiup ctl:v7.1.1 tikv --host IP:port compact --bottomost force -c default --from 'zr\000\000\001\000\000\000\000\373' --to 'zt\200\000\000\000\000\000\000\377[\000\000\000\000\000\000\000\370'

IP:port 替换为目标 TiKV 节点的实际 IP 地址和端口号。

通过以上步骤,可以对指定的表进行手动 compaction 操作。

确保在执行这些步骤时,替换示例中的 table_namedb_namestart_keyend_key 以及 IP:port 等占位符为你实际环境中的具体值。

这个方法相对简单,但是影响也不小,推荐业务低峰期做。

其他方法

cluster compact 和 compact 实例相对来说操作简单,但是影响最大:

tikv-ctl --pd 127.0.0.1:2379 compact-cluster
tikv-ctl  --host  tikv_ip:port  compact --bottommost force -d kv -c default
tikv-ctl  --host  tikv_ip:port compact --bottommost force -d kv -c write --bottommost force

新版本优化

region-compact-min-redundant-rows 从 v7.1.0 版本开始引入

  • 触发 RocksDB compaction 需要的冗余的 MVCC 数据行数。
  • 默认值:50000
  • 最小值:0

region-compact-redundant-rows-percent 从 v7.1.0 版本开始引入

  • 触发 RocksDB compaction 需要的冗余的 MVCC 数据行所占比例。
  • 默认值:20
  • 最小值:1
  • 最大值:100

可以考虑临时调小,调大 compact 触发概率,推荐业务低峰做

2
1
2
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论