https://book.tidb.io/session4/chapter7/compact.html
    TiKV 作为 TiDB 的存储节点,用户通过 SQL 导入或更改的所有数据都存储在 TiKV。这里整理了一些关于 TiKV 空间占用的常见问题

TiKV 的空间放大

  • 监控上显示的 Number files at each levels 是什么含义? 如果用户向 TiDB 中写入了 10G 数据,那么实际占用的物理空间是多大?

TiKV 采用 LSM-Tree 架构的 RocksDB 作为底层存储引擎,最新写入的数据会在最上层,最老的数据在最底层。 如果用户只执行过 INSERT 而没有 UPDATE 和 DELETE 的话,那么按照默认配置 max-bytes-for-level-multiplier,每一层的大小是上一层的十倍。 RocksDB 相同层不会有重复的数据,再乘以三个副本,因此 10GB 数据最多占据 (512MB + 1GB + 10GB) * 3 的物理空间,由于 RocksDB 还采取了针对对 key 的前缀压缩, 以及针对 block 的 LZ4 或 ZSTD 压缩,因此最终占用的磁盘空间肯定小于 33.5GB. (512MB 为L0 的 SST 文件大小。这里没有考虑索引的大小)

  • TiDB 文档和配置中提到的 GC 是什么意思?

    TiDB 采用 MVCC 事务模型,并且支持了 Snapshot Isolation 级别的事务隔离,因此为了保证正在进行中的事务能够读取到一致的数据,所有的 DELETE 以及 UPDATE 操作在 TiDB 中都不会立刻将原来的数据在物理上删除或者更改,而是为其新增一个版本,这样就保证了旧的版本仍然能被尚未结束的事务读取到。 每隔一段时间 TiDB 会确认某个时间点之前的事务已经全部结束了,那么所有的数据在该时间点之前的版本都可以只保留最新的那一个,于是 TiDB 会将这个 时间点通知给 TiKV,TiKV 则会发起清理旧版本数据以回收物理空间的操作,这个操作被称作 GC

  • 为什么我执行了 UPDATE SQL 之后,集群占用的空间在不停地增长? UPDATE 的数据会占用额外的空间吗?

    参见上一条,对于 UPDATE 的数据不会立刻覆盖其原有的数据,而是为其新增一个版本,因此会占用额外的物理空间。 TiDB 默认的 tikv_gc_life_time 为 10 分钟,因此 UPDATE 所覆盖的旧版本数据会在至少 10 分钟后才被删除。由于 TiKV 上的 GC 线程为单线程,因此目前的版本还存在 UPDATE 过快而导致旧版本来不及回收,数据大小膨胀的问题,未来 TiDB 会解决这个问题。 倘若 GC 及时的话,那么用户 UPDATE 后 TiKV 占用的实际空间为 "用户 10 分钟内更新的数据量+数据库有效数据量 * 1.12".(这里的 1.12 参考 上上条推断的空间放大系数)

  • TiKV 的写入性能周期性下降( 10~20 分钟一轮)这是怎么回事?

    建议检测 TiKV 监控中的 GC 一栏中,GC speed 的指标是否与 TiKV 写入性能下降的周期波动重合。TiKV 的 GC 由 raft leader 发起,然后将需要 删除的旧版本通过一致性协议发送给 follower 删除,因此会抢占正常的业务写入的资源。可以通过 TiKV 的配置 gc.max-write-bytes-per-sec 来限制 GC 的速度,根据机器配置建议该值设置为 128KB ~ 512KB,默认值为 0KB,即不进行任何限速。

如何高效地回收磁盘空间

  • 为什么我执行了 DELETE FROM table_xx; 后磁盘空间迟迟没有回收?(监控上显示的磁盘剩余空间并没有增大)

    参考上文中对 GC 的解释,TiDB 删除数据也是为其增加一个特殊的新版本,旧版本要等待至少 10 分钟后才会真正从 RocksDB 中删除,而 RocksDB 回收物理空间还需要更多的额外时间。因此我们建议用户如果要删除某个表的数据尽量使用 DROP TABLE table_xxx,而不是 DELETE FROM table_xx。 前者会在超过 GC 时间后,直接删除 RocksDB 在磁盘上的物理文件。

  • TiDB 旧版本数据过期时间是可配置的吗?应该如何调整这个配置的大小?

    可以通过 MySQL 客户端连接 TiDB,查看 TiDB 的系统表 SELECT * from mysql.tidb, tikv_gc_life_time 即为旧版本的过期时间, 用户可以动态调整该配置,但是 TiDB 不允许该配置的值低于 10 分钟,更低的值将被忽略。建议用户不要把这个值设置得过大,以免浪费更多的磁盘空间, 同时还可能因积累旧版本数据过多,导致 GC 流量过大影响了其他业务。

  • GC 删除数据所占据的物理空间能在 RocksDB 中被立刻回收吗?

    GC 删除的数据会很快被 compact 到下一层。在 TiKV 的 CPU 资源充足,RocksDB compact 足够及时的情况下,由于相同层内不会有 重复数据,因此最多存在 12% 应该被删除的重复无效数据,这是由于 rocksdb 的写放大带来的数据。

Dynamic Level 相关问题

  • 为什么 TiKV 的监控上显示 level-1 和 level-2 都没有数据,但是 level-3 和 level-4 却有数据?

    因为 TiKV 使用 RocksDB 开启了 Dynamic Level Bytes, 所以数据文件会优先放更底层。计算规则:如果当前数据总大小低于 max-bytes-for-level-base(默认为 512MB),则所有数据都会在 level-6, 此时 level-6 实际上相当于 level-1。如果数据总大小超过 max-bytes-for-level-base ,但低于 max-bytes-for-level-base * max-bytes-for-level-multiplier , 则 level-6 视作 level-2,level-5 视作 level-1。但是无论如何,除了 level-0 以外的各层数据比例都按照上层比下层 1:10 进行分布。

  • 磁盘空间不够,如何提高 TiKV 的压缩效果?

    TiKV 提供 snappy,zlib,bzip2,lz4,lz4hc,zstd 等六种压缩算法。默认为 ["no", "no", "lz4", "lz4", "lz4", "zstd", "zstd"] 注意我们采取了 dynamic level,所以只有当数据量超过 500G 时 RocksDB 的层数才会超过 4, 超过 500G 部分的数据才会启动 ZSTD 压缩算法。 如果希望能够进一步提高压缩效果,可以将 defaultcf 以及 writecf 的配置 compression-per-level 设置为 ["no", "no", "lz4", "lz4", "zstd", "zstd", "zstd"], 这样的话,50G ~ 500G 之间的数据的也能按照 zstd 压缩。

[转帖]7.5 TiKV 磁盘空间占用与回收常见问题的更多相关文章

  1. Linux:查看磁盘空间占用情况

    Linux:查看磁盘空间占用情况 工作中有时被分配的测试机空间不大,经常遇到磁盘空间占满的情况.排查过程如下: 一.首先使用df -h 命令查看磁盘剩余空间,通过以下图看出/目录下的磁盘空间已经被占满 ...

  2. linux磁盘空间占用分析

    df -h # 查看目前磁盘空间占用 cd / # 切换到根目录 du -sh # 查询每个目录占用的大小 lsof | grep delete # 查看当前系统打开文件 # 删除不使用的文件, 如果 ...

  3. 查看mac中磁盘空间占用情况

    今天发现磁盘空间不够了,首先要找到那些文件夹占用了磁盘空间. du命令很好使 du -c -d 1 -m | sort -n -c 显示当前文件夹总计占用空间 -d 1 层级为1,即只显示当前目录下一 ...

  4. 查看ubuntu磁盘空间占用及占用空间大的文件

    最近老是收到 ecs上有台服务器的磁盘利用率高 终于有一天 ssh登不上去了 http://blog.csdn.net/aaashen/article/details/50685988 清除相关大文件 ...

  5. linux 查看磁盘空间占用情况

    工作中有时被分配的测试机空间不大,经常遇到磁盘空间占满的情况.排查过程如下: 一.首先使用df -h 命令查看磁盘剩余空间,通过以下图看出/目录下的磁盘空间已经被占满. 二.进入根目录,因为最近常用的 ...

  6. linux 故障:df -h统计磁盘空间占用太多,但又du -h找不到大的文件

    用lsof / | grep -i delete 从根目录定位打开的被删除的文件 如果定位到某文件占用空间很大 主要是因为我们在删除这个日志文件的时候是用rm -rf *.log这样的命令删除的,删除 ...

  7. elasticsearch 索引搜索和索引性能优化配置——思路:去掉不必要的数据,减小数据的磁盘空间占用,同时提升性能

    压缩配置: index.codec: best_compression 合并索引: curl –XPOST localhost:9200/hec_test3/_forcemerge’ 配置mappin ...

  8. 检查linux的磁盘空间占用

    先初步看看哪个目录占用最大$ df -h 然后细看遍历某目录的占用情况:$ sudo du -a /data  | sort -nr | less(单位是KB)

  9. 查找Linux系统中的占用磁盘空间

    目录的来查看空间占用情况 du -sh /* 先看看根目录下面 让文件夹下的文件让文件按大小排序 方法一:# ls -lhSl 长格式显示,h human readable模式,大小单位为M,G等易读 ...

  10. linux查找系统中占用磁盘空间最大的文件

    Q:下午有一客户磁盘空间占用很大,使用df查看磁盘剩余空间很小了,客户想知道是哪些文件占满了文件. Q1:在Linux下如何查看系统占用磁盘空间最大的文件? Q2:在Linux下如何让文件夹下的文件让 ...

随机推荐

  1. DVWA Insecure CAPTCHA(不安全的验证码)全等级

    Insecure CAPTCHA(不安全的验证码) 目录: Insecure CAPTCHA(不安全的验证码) 1. Low 2.Medium 3. High 4.Impossible 加载验证码需要 ...

  2. 【独立闯天下】Prim新传奇!💥原团队的Blazor版本迟迟无音,合并请求石沉大海。于是,我们决定单干!加入Prime Blazor版项目,一起开创崭新的旅程吧!🌟📚

    共建Prime的Blazor版:为开源社区注入新活力 Prime组件库作为一款广受欢迎的开源组件库,一直以来都备受开发者们的青睐.然而,随着技术的不断发展和更新,原团队的Blazor版本似乎已经逐渐失 ...

  3. Spring系列:基于Spring-Jdbc实现事务

    目录 一.事务基本概念 二.编程式事务 三.声明式事务 前期准备 四.基于注解的声明式事务 @Transactional注解标识的位置 事务属性:只读 事务属性:超时 事务属性:回滚策略 事务属性:隔 ...

  4. 云图说|云数据库MySQL内核小版本升级全攻略

    摘要:华为云数据库MySQL支持自动或手动升级内核小版本,内核小版本的升级涉及性能提升.新功能或问题修复等. 华为云有新的内核小版本发布时,您可以在"实例管理"页面看到内核小版本升 ...

  5. 华为云IoT设备接入服务全体验

    摘要:华为云IoT设备接入服务,海量设备,一键接入,你值得拥有! 本文分享自华为云社区<[云驻共创]Huawei Mate 40产线直击之 华为云IoT设备接入服务全体验>,原文作者:启明 ...

  6. 跟我学AI建模:分子动力学仿真模拟之DeepMD-kit框架

    摘要:分子动力学仿真模拟的重点就在于如何建立模型描述分子间的相互作用. 本文分享自华为云社区<AI建模-分子动力学仿真>,作者: 木子_007 . 一.背景 分子动力学的仿真模拟广泛应用于 ...

  7. Jenkins Pipeline 流水线 - 拉代码(SVN) + Maven 编译打包

    Jenkins Pipeline 流水线 步骤 拉取SVN代码 -> Maven 构建 -> Docker 编译 -> 发布至阿里云仓库 -> K8S 更新 Jenkins插件 ...

  8. SQL SERVER 查询所有表 统计每张表的大小

    (MySQL查看数据库表容量大小)[https://www.cnblogs.com/vipsoft/p/12145059.html] 查询某数据库中的所有数据表 SELECT name as tabl ...

  9. 消息驱动 —— SpringCloud Stream

    Stream 简介 Spring Cloud Stream 是用于构建消息驱动的微服务应用程序的框架,提供了多种中间件的合理配置 Spring Cloud Stream 包含以下核心概念: Desti ...

  10. python虚拟环境venv

    Python3虚拟环境是为了在开发过程中隔离项目所需的 Python 环境.虚拟环境允许我们在同一台计算机上的不同项目中使用不同的 Python 版本和软件包,而不会相互干扰 首先创建一个虚拟环境的工 ...