【OceanBase】18.内存管理

1.内存管理

1).内存数据落盘策略-合并和转储
OceanBase 数据库的存储引擎基于 LSM Tree 架构
静态基线数据(放在 SSTable 中)
动态增量数据(放在 MemTable 中)
本质上是一个基线加增量的存储引擎,跟关系数据库差别很大,同时也借鉴了部分传统关系数据库存储引擎的优点。
由于 OceanBase 数据库采用基线加增量的设计,一部分数据在基线,一部分在增量,原理上每次查
询都是既要读基线 , 也要读增量 。 为 此 ,OceanBase 数据库做了很多的优化,尤其是针对单行的优化

2).内存分配(一)
OceanBase是支持多租户架构的准内存分布式数据库,对大容量内存的管理和使用提出了很高要求
OceanBase会占据物理服务器的大部分内存并进行统一管理

通过参数设定observer占用的内存上限
◼ memory_limit_percentage
◼ memory_limit
memory_limit 的默认单位为 MB
例如,memory_limit='40G' 表示设置 OceanBase 数据库进程的使用内存上限是 40 GB。
由于默认单位为 MB,则memory_limit=40960 与 memory_limit='40G' 设置的值相同.

如果希望限制运行中的 OceanBase 数据库的内存大小,可以直接修改 memory_limit 的值,使其达到预期。
设置后,后台参数 Reload 线程会使其动态生效,无需重启。但是在设置时,
需要保证 memory_limit 的值小于系统总的值

3).参数说明
OceanBase提供两种方式设置observer内存上限:
◼ 按照物理机器总内存的百分比计算observer内存上限:由memory_limit_percentage参数配置
◼ 直接设置observer内存上限:由memory_limit参数配置
memory_limit=0时,memory_limit_percentage决定observer内存大小;
否则由memory_limit决定observer内存大小

以100GB物理内存的机器为例,下述表格展示了不同配置下机器上的observer内存上限:
      memory_limit_percentage 	memory_limit 	observer内存上限
场景1 80 						0 				80GB
场景2 80 						90GB 			90GB

场景1:memory_limit=0,因此由memory_limit_percentage确定observer内存大小,即100GB*80% = 80GB
场景2:memory_limit='90GB',因此observer内存上限就是90GB,memory_limit_percentage参数失效

4).内存分配(二)
OB系统内部内存
◼ 每一个observer都包含多个租户(sys租户 & 非sys租户)的数据,但observer的内存并不是全部分配给租户
◼ observer中有些内存不属于任何租户,属于所有租户共享的资源,称为“系统内部内存”

通过参数设定“系统内部内存”上限
◼ system_memory(3.x版本默认值30G)
租户可用的总内存
◼ “observer内存上限” – “系统内部内存”

5).内存分配(三)
每个租户内部的内存总体上分为两个部分
◼ 不可动态伸缩的内存:MemStore, MemStore用来保存DML产生的增量数据,空间不可被占用
◼ 可动态伸缩的内存:KVCache, KVCache空间会被其它众多内存模块复用

MemStore
◼ 大小由参数 memstore_limit_percentage 决定,表示租户的
MemStore 部分占租户总内存的百分比。
◼ 默认值为50,即占用租户内存的50%
◼ 当MemStore内存使用超过 freeze_trigger_percentage 定
义的百分比时(默认70%),触发冻结及后续的转储/合并等行为.

KVCache
◼ 保存来自SSTable的热数据,提高查询速度
◼ 大小可动态伸缩,会被其它各种Cache挤占.

6).内存结构总体结构回顾
OS总内存(物理服务器、VM 、docker)
	|
observer总内存:(memory-limit)(memory-limt-percentage)
为 OS 预留内存(1-observer内存)
	|
observer租户内存:( observer 总内存 -system_memory)
observer system 内存(system_memory)
	|
sys 租户内存:(memstore_limit_percentage)
sys租户 cache memory:eg. KV, row , block cache (1-memstore_limit_percentage)
租户1 内存:(memstore_limit_percentage)
租户1 cache memory :eg. KV, row , block cache (1-memstore_limit_percentage)
	|
触发 minor 或 major freeze:(freeze_trigger_percentage)
1-freeze-trigger_percentage (转储、合并时,这部分内存依然可以使用)

OS总内存
	observer总内存
		observer租户内存
			系统租户内存。
				触发冻结/转储/合并内存。
			普通租户内存。
				触发冻结/转储/合并内存。
		observer system内存。
	为OS预留的内存

2.总结 

memory_limit 参数的优先级高于 memory_limit_percentage。

你可能感兴趣的:(国产数据库-OceanBase,oceanbase)