宏块利用率低的原因及复现方法

【 使用环境 】生产环境
【 OB or 其他组件 】oceanbase
【 使用版本 】oceanbase-ce-3.1.4 BP3
【问题描述】生产上的一个集群宏块利用率非常低


数据170G,但申请了2.4T空间

现在想用全量合并的方法收缩,但需要先在测试环境复现,请告知宏块利用率低的原理,以及可能的复现方法。

附注:

社区的知识库写的太抽象了,完全无法理解在说什么

https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000001409656?back=kb

“若表的写入模式一直为递增写入,或者增量数据和老版本数据无交集,那么旧宏块会一直被重用,在新宏块利用率也不高的场景下,分区或者表的宏块利用率会越来越低。”递增写入写了7亿,没有复现。

 **请告知宏块利用率低的原理,以及可能的复现方法。**

ob4.1.3这个版本社区不在维护 建议升级到4.2.5版本

写错了 3.1.4 很老的集群了,升级不好升

  1. 宏块和微块的概念:OceanBase 数据库中,数据文件以宏块(Macro Block)为单位组织数据,每个宏块大小为 2 MB。宏块内部又划分出很多个 16 KB(压缩前的大小)大小的微块(Micro Block),而每个微块里面包含多个行(Row)。OceanBase 数据库内部 IO 的最小单位是微块。(来源:文档片段 5)

  2. 宏块的写入和合并:宏块是 OceanBase 数据库基本的 IO 写入单位。在很多情况下,并不是所有的宏块都会被修改,当一个宏块没有增量修改时,合并可以直接重用这个数据宏块。这种合并方式称为增量合并,它极大地减少了合并的工作量,是 OceanBase 数据库目前默认的合并算法。更进一步地,OceanBase 数据库会在宏块内部将数据拆分为更小的微块,很多情况下,也并不是所有的微块都会被修改,可以重用微块而不是重写微块。微块级增量合并进一步减少了合并的时间。(来源:文档片段 4)

  3. 数据压缩与编码:在 OceanBase 数据库中,当 MemTable 占用内存空间大小达到一定阈值或每日合并时会触发转储/合并,MemTable 中的数据落盘并合并成静态的 SSTable 数据。相对于 MemTable,SSTable 中的数据量会更大,冷数据也相对更多。在合并不断产生新的 SSTable 的过程中,OceanBase 数据库会对 SSTable 中的数据进行压缩和编码,来节省数据在硬盘上的存储空间,同时减小对 SSTable 进行查询时产生的 IO。在 SSTable 中,数据是以块为单位来组织的,2 Mb 定长的宏块方便对存储空间进行管理,宏块内部变长的微块则方便我们对数据进行压缩。微块有两种存储格式,flat 微块(未编码)和 encoding 微块(编码),OceanBase 数据库的数据压缩与编码都是在微块的粒度上进行的。

综上所述,OceanBase 宏块利用率低的原因可能包括:

  • 部分宏块未被修改:在增量合并过程中,未被修改的宏块可以直接重用,这可能导致某些宏块的利用率较低。

  • 微块级增量合并:即使在宏块内部,未被修改的微块也可以重用,这进一步降低了宏块的整体利用率。

  • 数据压缩与编码:在 SSTable 中,数据以宏块为单位组织,但宏块内部的微块可以进行压缩和编码,这可能导致宏块的实际利用率低于预期。