写点什么

TiDB MVCC 问题处理

  • 2024-03-08
    北京
  • 本文字数:2076 字

    阅读完需:约 7 分钟

作者: WalterWj 原文来源:https://tidb.net/blog/7a77b926

背景

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_idFROM     information_schema.tikv_region_status AS rJOIN     information_schema.tikv_region_peers AS p    ON r.region_id = p.region_idJOIN     information_schema.tikv_store_status AS st    ON p.store_id = st.store_idWHERE     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:

  2. 使用 Compact 命令来压缩 write CF(Column Family):

  3. 同样的,对 default CF 进行 Compact 操作:

  4. 再次检查 Region 的属性以确认 Compact 操作之后删除键的数量:


通过以上步骤,你可以对 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_KEYFROM information_schema.tikv_region_statusWHERE 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_keytiup 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-clustertikv-ctl  --host  tikv_ip:port  compact -d kv -c defaulttikv-ctl  --host  tikv_ip:port compact -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 触发概率,推荐业务低峰做


发布于: 刚刚阅读数: 4
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
TiDB MVCC 问题处理_管理与运维_TiDB 社区干货传送门_InfoQ写作社区