租户内存默认占到 OceanBase 数据库内存上限的 80%,OceanBase 数据库把租户内部的内存总体上分为两个部分:

  • 不可动态伸缩的内存 MemStore

  • 可动态伸缩的内存 KVCache

其中,不可动态伸缩的内存主要给保存数据库增量更新的 MemStore 使用,可动态伸缩的内存主要由 KVCache 进行管理。可动态伸缩的 KVCache 会尽量使用除去不可动态伸缩后租户的全部内存。

除此之外,还有很多内存组件,包括 Plan Cache(执行计划缓存)、SQL Arena(SQL 执行期内存)、选举动作等,都要占用一定量的内存。您可以通过查询 __all_virtual_memory_info 来获取所有内存组件的使用情况。

不可动态伸缩的内存管理

目前与不可动态伸缩内存相关的配置只有 memstore_limit_percentage ,它表示租户的 MemStore 部分最多占租户总内存上限的百分比,默认值为租户 MinMemory 的 50%。租户的写入或者更新会增加 MemStore 的内存使用,当租户的 MemStore 部分内存到达上限以后,后续的写入或者更新操作将会被拒绝。OceanBase 数据库会根据 MemStore 的内存使用比例决定何时进行转储或者合并释放 MemStore 的内存,该比例由配置项 freeze_trigger_percentage 控制,表示当 MemStore 内存占用到达其上限的百分比后就进行冻结(转储和合并的前置动作),默认值为租户 MemStore 内存上限的 70%,即租户 MinMemory 的 35%。

可动态伸缩的内存管理

可动态伸缩的内存主要部分是 KVCache。OceanBase 数据库将绝大多数的 KV 格式的缓存统一在了 KVCache 中进行管理,KVCache 支持动态伸缩、不同 KV 的优先级控制以及智能的淘汰机制。

KVCache 一般不需要配置,特殊场景下可以通过参数控制各种 KV 的优先级,优先级高的 KV 类比优先级低的 KV 类更容易被保留在 Cache 中。

用于控制 KV 优先级的参数如下表所示。参数值越大表示优先级越高。

参数

含义

fuse_row_cache_priority

融合行缓存在缓存系统中的优先级。

location_cache_priority

位置缓存在系统缓存服务中的优先级。

clog_cache_priority

事务日志占用缓存的优先级。

index_clog_cache_priority

事务日志索引在缓存系统中的优先级。

user_tab_col_stat_cache_priority

统计数据缓存在缓存系统中的优先级。

index_cache_priority

索引在缓存系统中的优先级。

index_info_block_cache_priority

块索引在缓存系统中的优先级。

user_block_cache_priority

数据块缓存在缓存系统中的优先级。

user_row_cache_priority

基线数据行缓存在缓存系统中的优先级。

bf_cache_priority

Bloom Filter 的缓存优先级。

KVCache 中子 Cache 的信息可以通过查询 __all_virtual_kvcache_info 参数获得。其中 sys 和普通租户的重要组成部分略有不同:

  • sys 租户上的 Cache 种类如下:

    类别

    说明

    schema_cache

    存放用户的 Schema 信息,用于提供 SQL 及系统正常运行所依赖的数据库对象的元信息。

    location_cache

    存放分区的 location 信息,通过查询它可以知道一个 Partition 分布在哪些 OBServer 上。

    block_index_cache

    缓存微块的 Index,加速微块数据的访问。

    user_block_cache

    缓存微块数据,由于微块可能通过压缩算法进行压缩,为了提升查询性能,缓存的是解压后的微块数据。

    fuse_row_cache

    缓存行的快照点数据,用于提高点查询性能,并且可以避免因转储、合并导致的缓存失效问题。

    index_clog_cache

    缓存 ilog 文件的内容,用于减小读取 ilog 文件的开销。

    user_tab_col_stat_cache

    用户表列统计信息缓存,用于 SQL 计算代价。

    user_table_stat_cache

    用户表统计信息缓存,用于 SQL 计算代价。

  • 普通租户上的 Cache 种类如下:

    类别

    说明

    user_block_cache

    缓存微块数据,由于微块可能通过压缩算法进行压缩,为了提升查询性能,缓存的是解压后的微块数据。

    block_index_cache

    缓存微块的 Index,加速微块数据的访问。

    fuse_row_cache

    缓存行的快照点数据,用于提高点查询性能,并且可以避免因转储、合并导致的缓存失效问题。