memtable,partition,tablet 他们之间是什么关系?

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】v4
【问题描述】memtable,partition,tablet 他们之间是什么关系,是一一对应吗?内存里面这个memtable是怎么分配的,这个memtable有最大限制吗,如果没有最大限制,在特殊情况下会不会出现,memtable到十几G的情况,转储的时候会出现io剧烈波动,是如何避免的 ?@论坛小助手
【复现路径】
【附件及日志】

@论坛小助手

MemTable, Partition, Tablet 之间的关系

根据文档库中的信息,可以总结如下:

  1. MemTable, Partition, Tablet 的关系

    • 在 OceanBase 中,数据存储的最小单位是 Tablet。每个分区(Partition)对应一个 Tablet,用户定义的非分区表也会对应一个 Tablet。
    • 每个 Tablet 内部维护了一个 MemTable,用于存储近期的写入操作(插入、更新、删除)。当 MemTable 达到一定大小时,会转储到磁盘上形成 SSTable。
  2. 是否一一对应

    • MemTable 和 Tablet 是一一对应的。每个 Tablet 都有一个与其相关的 MemTable,用于暂存最近的写入操作。
    • 分区(Partition)和 Tablet 也是一一对应的。每个分区对应一个 Tablet。
  3. MemTable 的分配

    • MemTable 是内存中的数据结构,用于缓存最近的写入操作。OceanBase 数据库的内存存储引擎 MemTable 由 BTree 和 Hashtable 组成,在插入/更新/删除数据时,数据被写入内存块,在 HashTable 和 BTree 中存储的均为指向对应数据的指针。
    • MemTable 的内存分配是由系统自动管理的,并且可以通过配置项进行调整。例如,memstore_limit_percentage 控制租户内存中可用于 MemStore 写入的比例,freeze_trigger_percentage 控制 MemStore 使用量达到该百分比时触发转储。
  4. MemTable 的最大限制

    • MemTable 的大小是有上限的。通过 freeze_trigger_percentage 参数来控制 MemTable 的最大使用量。当 MemTable 使用量达到该参数所限制的百分比时,就会自动触发转储,释放占用的内存。
    • 默认情况下,freeze_trigger_percentage 的值为 20%,表示当 MemStore 使用率超过 20% 时,就会触发转储。这个阈值可以根据实际需求进行调整。
  5. 避免 MemTable 转储时的 IO 剧烈波动

    • OceanBase 引入了分层转储策略(从 V2.2 版本开始),以避免单次转储操作的数据量过大导致 IO 剧烈波动。分层转储策略将 MemTable 转储到多个层级的 SSTable 中,逐步合并,从而减少单次转储的数据量。
    • 通过分层转储策略,MemTable 在转储时会先生成 L0 层 Mini SSTable,然后逐步合并成 L1 层 Minor SSTable 和 Major SSTable,从而分散了转储时的 IO 压力。
    • 另外,OceanBase 还支持在业务低峰期进行大规模的合并操作,以进一步减少对业务的影响。

相关文档片段链接

希望这些信息能帮助您理解 MemTable、Partition 和 Tablet 之间的关系以及如何管理和优化它们。如果有更多问题,请随时提问。

检索到的文档如下:

  1. OceanBase 数据库整体架构
  2. tablet_size
  3. auto_split_tablet_size
  4. V$OB_MEMSTORE
  5. 转储
  6. 在您开始前
  7. MemTable
  8. 表存储
  9. v$tenant_memstore_allocator_info

@论坛小助手
感觉memtable占用大小这一块没说清晰,在特定情况下一个memtable占用20G还没到内存的20%,这个时候还不触发转储,那当触发转储的时候,是不是就会有剧烈io波动,freeze_trigger_percentage 的值为 20%除了这个参数还有其他参数进行控制防止出现特别巨大的memtable吗?

在OceanBase中,freeze_trigger_percentage设置为20%确实意味着只有当MemStore(即memtable)的内存使用量达到租户总内存的20%时才会触发冻结转储操作。如果您的场景中存在单个memtable占用较大空间(如20G),但仍未触发现有设定下的自动转储,可以考虑调整以下几个配置来更细粒度地控制这一过程,并减轻可能由此引发的I/O波动:">",\

更多信息请查看:

  1. 在您开始前
  2. freeze_trigger_percentage
  3. 转储