OceanBase数据库内存结构
数据库版本:OceanBase V4
每个OBserver节点的物理内存(physical_memory)可以按如下层级分解:
- 系统预留内存:物理机/虚拟机/容器预留给OBserver以外的服务使用的内存。其大小等于
physical_memory - memory_limit。 - OB可使用总内存(
memory_limit):节点物理内存中分配给OBserver使用的部分。- 节点预留内存(
system_memory):OB数据库预留给500租户使用的内存。 - 可分配给租户使用的内存:包括分配给SYS租户和业务租户的内存。其大小等于
memory_limit - system_memory。- SYS租户的总内存:系统租户下不存在对应的Meta租户。
- MemStore缓存:用于装载写入和更新的增量数据。MemStore是不可伸缩的。
- KV Cache缓存:用于装载只读的KV格式数据。KV Cache是可动态伸缩的。
- 业务租户的总内存:
- Meta租户的MemStore缓存
- Meta租户的KV Cache缓存
- 业务租户的MemStore缓存
- 业务租户的KV Cache缓存
- SYS租户的总内存:系统租户下不存在对应的Meta租户。
- 节点预留内存(
注:除MemStore和KV Cache以外,租户内存还包括Plan Cache、SQL Area、Worker Area等内存区域。
系统内存
系统内存是OceanBase数据库预留给500租户使用的内存。500租户是个特殊的虚拟租户,共享性的、非实体租户消耗的内存都被OB数据库划归500租户。
系统内存可通过system_memory参数来配置,该参数是对系统内部使用内存的预估,实际上限制的是租户可使用的内存上限(而不是对系统内存的上限),即memory_limit - system_memory。
租户内存:按租户类型分类
OceanBase数据库是多租户设计的数据库,同一个进程会运行着多个租户的请求,从租户资源划分上可以分为系统租户内存、业务租户内存。其中业务租户下还包含Meta租户。
系统租户
系统租户是OceanBase数据库自动创建的第一个实体租户,管理着集群相关的内部表,这些内部表上的请求触发的内存就划归到了sys租户。
- OB V4.2.1版本前,系统租户实际可使用的内存上限为
sys_unit_config.memory_siz。 - 从V4.2.1版本开始,系统租户实际可使用的内存上限为:
hidden_sys_memory+sys_unit_config.memory_size。
其中:
sys_unit_config.memory_size的值由资源规格sys_unit_config中的memory_size决定。sys_unit_config是系统租户默认的资源规格,其默认的内存资源为最小资源。由于系统租户也是一个正常的租户,故可以通过ALTER RESOURCE语句修改sys_unit_config中memory_size的值。
select unit_config_id,name,max_cpu,min_cpu,
round(memory_size/1024/1024/1024) memory_size_gb,
round(log_disk_size/1024/1024/1024) log_disk_size_gb
from oceanbase.dba_ob_unit_configs where name='sys_unit_config';
hidden_sys_memory的值由隐藏配置项_hidden_sys_tenant_memory控制。隐藏配置项_hidden_sys_tenant_memory的默认值为0G,表示系统会按照一定的规则进行自适应分配hidden_sys_memory的值。不建议修改隐藏配置项_hidden_sys_tenant_memory的值。
select name,data_type,value,scope,section,edit_level,default_value,info
from gv$ob_parameters where name like '%hidden_sys_tenant_memory%';
业务租户
业务租户就是集群安装后由DBA创建的跑业务流量的实体租户,这些租户的请求触发的内存就划归租户自己。
业务租户内存由租户创建Unit时其memory_size的大小定义的,memory_size为业务租户的整体内存大小,其内存包含业务租户本身的内存和其对应Meta租户的内存。在创建业务租户时,其允许创建的最小内存由隐藏配置项__min_full_resource_pool_memory控制,其默认值为5G。
select a.tenant_name, b.unit_config_id from oceanbase.dba_ob_tenants a,oceanbase.dba_ob_resource_pools b where b.tenant_id=a.tenant_id;
select unit_config_id,name,max_cpu,min_cpu,
round(memory_size/1024/1024/1024) memory_size_gb,
round(log_disk_size/1024/1024/1024) log_disk_size_gb
from oceanbase.dba_ob_unit_configs;
select name,data_type,value,scope,section,edit_level,default_value,info
from gv$ob_parameters where name like '%min_full_resource_pool_memory%';
Meta租户的内存资源不支持共享,Meta租户和业务租户的内存资源需要隔离。默认Meta租户占整体租户规格的10%。为了保证Meta租户正常运行,Meta租户内存资源规格最小为512M,不设最大值。
整体租户内存规格减去Meta租户内存规格即为业务租户(实际可用)的内存规格。整体租户规格最小值调整为1G。
- 租户规格大于等于10G时,Meta租户和业务租户内存规格比例为
1:9。 - 租户规格大于等于2G时,Meta租户的内存规格固定为1G,剩余资源给业务租户。
- 租户规格大于等于1G并且小于2G时,Meta租户固定分配512M,剩余资源给业务租户。
租户内存:按内存管理方式分类
业务租户本身的内存和其对应的Meta租户的内存可以分为装载增量数据的MemStore以及KVCache缓存。
- MemStore缓存:用于装载写入和更新的增量数据。MemStore是不可伸缩的。
- KVCache缓存:用于装载只读的KV格式数据。KV Cache是可动态伸缩的。
除此之外,还有很多内存组件,包括Plan Cache(执行计划缓存)、SQL Area(SQL 执行期内存)等,都要占用一定量的内存。
可以通过查询oceanbase.GV$OB_MEMORY视图来获取所有内存组件的使用情况。
select * from oceanbase.GV$OB_MEMORY order by tenant_id,svr_ip,ctx_name,mod_name;
select * from oceanbase.GV$OB_MEMORY where tenant_id=1002 order by hold,used;
不可动态伸缩的内存
目前OceanBase数据库不可动态伸缩的内存仅包括MemStore和SQL工作区。
- MemStore用于装载增量数据,其大小由配置参数
memstore_limit_percentage控制。 - SQL工作区是可能耗费大量内存的SQL阻塞性算子所使用的内存。其大小由系统变量
ob_sql_work_area_percentage控制。
show parameters like 'memstore_limit_percentage';
show variables like 'ob_sql_work_area_percentage';
租户的写入或者更新会增加MemStore的内存使用,当租户的MemStore部分内存到达上限以后,后续的写入或者更新操作将会被拒绝。
OceanBase数据库会根据MemStore的内存使用比例决定何时进行转储或者合并释放MemStore的内存,该比例由配置项freeze_trigger_percentage控制,表示当MemStore内存占用到达其上限的百分比后就进行冻结(转储的前置动作),默认值为租户MemStore内存上限的20%。
可动态伸缩的内存
OceanBase数据库将绝大多数的KV格式的缓存统一在了KVCache中进行管理,KVCache支持动态伸缩、不同类型Cache的优先级控制以及智能的淘汰机制。
可动态伸缩的KVCache会尽量使用除去不可动态伸缩后租户的全部内存,当租户内存满时,会优先从KVCache中淘汰未被引用的内存来使用。
KVCache一般不需要配置,特殊场景下可以通过参数控制各种Cache的优先级,优先级高的Cache比优先级低的Cache更容易被保留在Cache中。
KVCache中不同类型的Cache的信息可以通过查询oceanbase.GV$OB_KVCACHE视图获得。
select * from oceanbase.gv$ob_kvcache order by tenant_id,svr_ip,cache_name;
select * from oceanbase.gv$ob_kvcache where tenant_id=1002 order by priority,cache_size,hit_ratio;
⭐️ 业务租户中常见的Cache种类如下:
-
Block Cache:微块缓存。这部分内存是用来存放从磁盘上读取到的微块中的信息的,类似于数据库中常提到的buffer pool,主要用于满足比较大的SQL语句。由于微块可能通过压缩算法进行压缩,为了提升查询性能,缓存的是解压后的微块数据。对应
GV$OB_KVCACHE视图中的user_block_cache。 -
Block Index Cache:微块索引缓存(类似于一个block cache的索引),由于微块数量很多,需要一个index来把block cache中的信息串起来。用于加速微块数据的访问。对应
GV$OB_KVCACHE视图中的index_block_cache。 -
Row Cache:基线数据和转储数据的行数据缓存(hash table)。对于高频的短查询,使用行cache可以快速的响应请求,同时也是在这里实现mvcc,也就是说,OceanBase的mvcc是在行级别实现的。 对应
GV$OB_KVCACHE视图中的user_row_cache和fuse_row_cache。 -
Bloom Filter Cache:宏块布隆过滤器缓存,用于快速判断行在基线数据或转储数据是否存在(这个就是个宏块的hash table)。缓存为点查结果为空且超过一定次数的宏块建立的Bloomfilter,用于提高空查询的过滤效率。对应
GV$OB_KVCACHE视图中的bf_cache。
obclient(root@sys)[oceanbase]> select distinct cache_name from oceanbase.gv$ob_kvcache;
+---------------------------+
| cache_name |
+---------------------------+
| schema_cache |
| tablet_table_cache |
| index_block_cache |
| user_block_cache |
| user_row_cache |
| bf_cache |
| fuse_row_cache |
| storage_meta_cache |
| tx_data_kv_cache |
| log_kv_cache |
| external_table_file_cache |
| opt_table_stat_cache |
| opt_column_stat_cache |
| opt_ds_stat_cache |
| opt_system_stat_cache |
| tmp_block_cache |
| tmp_page_cache |
+---------------------------+
17 rows in set (0.021 sec)
执行计划缓存
执行计划缓存(Plan Cache)用于减少执行计划的生成次数。OceanBase数据库会缓存之前生成的执行计划,以便在下次执行该SQL时直接使用。每个租户在每一台服务器上都有一个独立的计划缓存,用以缓存在此服务器上处理过的SQL计划。
计划缓存是一个典型的Key-Value结构,Key就是参数化后的SQL字符串,Value就是该条SQL所对应的执行计划。
Plan Cache缓存的大小和淘汰机制由以下四个参数和变量控制:
- 配置参数
plan_cache_evict_interval:该配置项用于设置检查执行计划是否需要淘汰的间隔时间,默认值为5s。 - 系统变量
ob_plan_cache_percentage:该系统变量用于设置计划缓存可使用内存占租户内存的百分比。默认值为5。 - 系统变量
ob_plan_cache_evict_high_percentage:该系统变量用于设置触发计划缓存淘汰的内存大小占内存上限绝对值的百分比。默认值为90。 - 系统变量
ob_plan_cache_evict_low_percentage:该系统变量用于设置停止淘汰计划缓存的内存大小占内存上限绝对值的百分比。默认值为50。
show parameters like 'plan_cache_evict_interval';
show variables like 'ob_plan_cache_percentage';
show variables like 'ob_plan_cache_evict_high_percentage';
show variables like 'ob_plan_cache_evict_low_percentage';
假设租户内存大小为100G,默认情况下,计划缓存大小为5G,触发计划缓存淘汰的高水位线为4.5G,停止计划缓存淘汰的低水位线为2.5G。
194

被折叠的 条评论
为什么被折叠?



