背景
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操作的步骤:
-
首先,检查Region的属性以确认是否需要执行Compact:
tiup ctl:v6.5.8 tikv --host 172.16.201.18:20160 region-properties -r 98 | grep delete
-
使用Compact命令来压缩write CF(Column Family):
tiup ctl:v6.5.8 tikv --host 172.16.201.18:20160 compact --bottommost force -c write -r 98
-
同样的,对default CF进行Compact操作:
tiup ctl:v6.5.8 tikv --host 172.16.201.18:20160 compact --bottommost force -c default -r 98
-
再次检查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_name
和 table_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_key
和 end_key
为上一步骤查询到的实际值。
例如,假设转换后的 start_key 和 end_key 为:r\000\000\001\000\000\000\000\373
和 t\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_name
、db_name
、start_key
、end_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 触发概率,推荐业务低峰做