当前位置: 首页 > news >正文

OBCP第二章 OceanBase 存储引擎高级技术学习笔记

OceanBase 存储引擎高级技术学习笔记

一、内存管理

1. 内存分配层次

OS总内存
observer总内存--由memory_limit/memory_limit_percentage设定
为 OS 预留内存
系统内部内存--通过system_memory设定
租户可用内存
SYS租户: MemStore + KVCache
租户1: MemStore + KVCache
租户N: MemStore + KVCache

不可动态伸缩的内存:MemStore
大小由参数memstore_limit_percentage决定,表示租户的MemStore 部分占租户总内存的百分比;MemStore用来保存DML产生的增量数据,空间不可被占用。

可动态伸缩的内存:KVCache
保存来自SSTable的热数据,提高查询速度;KVCache空间会被其它众多内存模块复用

2. 关键参数

参数说明默认值动态生效
memory_limit直接设置OB进程内存上限(单位MB)-
memory_limit_percentage按物理内存百分比设置OB内存上限-
system_memory系统内部内存大小(不属于任何租户)30G
memstore_limit_percentage租户MemStore内存占比(不可动态伸缩)50
freeze_trigger_percentage触发冻结的内存使用阈值70

注意: memory_limit=0时,memory_limit_percentage决定observer内存大小;否则由memory_limit决定observer内存大小

3. 配置示例

-- 设置OB进程内存上限为40GB
ALTER SYSTEM SET memory_limit='40G';-- 查看内存参数
SHOW PARAMETERS LIKE '%memory%';

二、LSM Tree 架构

在这里插入图片描述

存储架构概述
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013392

核心设计

MemTable
内存增量数据
Mini SSTable
L0层
Minor SSTable
L1层
Major SSTable
L2层

转储后的结构称之为 Mini SSTable 或者是 Minor SSTable
合并时,表分区所有的 Minor SSTable 会根据合并快照点一起参与做 Major Compaction,最后会生成 Major SSTable

数据合并流程

  1. 冻结(Freeze):MemStore 达到阈值时冻结
  2. 转储(Minor Freeze):冻结数据写入 Mini SSTable(L0)
  3. 合并(Major Freeze):增量数据与基线 SSTable 合并

三、转储(Minor Freeze)

转储基本概念

1. 触发场景

  • MemStore 使用率 ≥ freeze_trigger_percentage
  • 批量数据导入需快速释放内存
  • 避免业务高峰触发 Major Freeze

2. 关键参数

参数作用
minor_freeze_times转储次数达到后触发合并(0=关闭转储)
minor_merge_concurrency并发转储分区数(影响性能)

3. 手动触发命令

-- 对所有租户/Observer转储
ALTER SYSTEM MINOR FREEZE;-- 指定租户转储
ALTER SYSTEM MINOR FREEZE TENANT='tenant1';-- 指定分区转储
ALTER SYSTEM MINOR FREEZE PARTITION_ID='partidx%partcount@tableid';

4.查看转储记录

MemStore使用率达到freeze_trigger_percentage而触发的租户级转储,在__all_server_event_history表中查询

手动转储,在__all_rootservice_event_history表中可以查到具体的选项

5.转储对数据库的影响

转储的优势

每个租户的转储不影响observer上其它的租户,也不会触发集群级转储,避免关联影响
资源消耗小,对在线业务性能影响较低
耗时相对较短,MemStore更快释放,降低发生MemStore写满的概率

转储的副作用

数据层级增多,查询链路变长,查询性能下降
冗余数据增多,占用更多磁盘空间


四、合并(Major Freeze)

1. 触发方式

方式命令/参数
定时合并major_freeze_duty_time='02:00'
MemStore 超阈值freeze_trigger_percentage + minor_freeze_times
手动触发ALTER SYSTEM MAJOR FREEZE;

查看合并状态
https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000357884

 select * from __all_zone; select * from __all_zone where name = 'merge_status';

2. 轮转合并配置

在这里插入图片描述

-- 启用轮转合并
ALTER SYSTEM SET enable_manual_merge = false; --设置为true时,不支持任何形式的自动合并
ALTER SYSTEM SET enable_merge_by_turn = true; --- 开启轮转合并
ALTER SYSTEM SET zone_merge_order = 'z1,z2,z3'; --设置合并顺序-- 查看合并状态
SELECT * FROM __all_zone WHERE name = 'merge_status';

3. 合并控制参数

参数作用
merge_thread_count合并线程数(默认0=自适应)
zone_merge_timeout单Zone合并超时阈值(默认3h)
max_kept_major_version_number保留历史版本数(默认2)
zone_merge_concurrency在合并时,支持多少个 Zone 并发

4.合并注意事项

合并超时时间

  • 由参数zone_merge_timeout定义超时阈值;默认值为'3h'(3个小时)
  • 如果某个ZONE的合并执行超过阈值,合并状态被设置为TIMEOUT

空间警告水位

  • 参数data_disk_usage_limit_percentage定义数据文件最大可以写入的百分比(超出阈值后禁止数据迁入),默认值90。
  • 当数据盘空间使用量超过阈值后,合并任务打印ERROR警告日志,合并任务失败;需要尽快扩大数据盘物理空间,并调大data_disk_usage_limit_percentage参数的值
  • 当数据盘空间使用量超过阈值后,禁止数据迁入
  • 参数datafile_disk_percentage定义数据盘空间使用阈值(占用data_dir所在磁盘总空间百分比),默认值90
  • 参数datafile_size 用于设置数据文件的大小,该配置项与 datafile_disk_percentage 同时配置时,以该配置项设置的值为准,默认值为0

5. 合并历史版本查询

-- 查询历史版本号
SELECT zone, svr_ip, major_version 
FROM __all_virtual_partition_sstable_image_info;-- 指定版本查询(利用Hint)
SELECT /*+ frozen_version(22) */ * FROM table_name;

查看合并记录和状态


五、转储 vs 合并对比

特性转储(Minor Freeze)合并(Major Freeze)
触发层级集群、server、租户、Replica 级别集群级
数据层级产生Minor SSTable(增量)生成Major SSTable(全量)
资源消耗低(仅涉及增量数据)高(涉及全量数据合并)
内存释放
磁盘空间冗余数据多(需多层查询)空间优化(单层数据)
业务影响较小较大(可配合轮转合并降低影响)

六、最佳实践

  1. 避免写满MemStore

    • 调低 freeze_trigger_percentage(如40%)
    • 增加 minor_freeze_times 延迟合并
  2. 业务高峰管理

    • 手动转储释放内存:ALTER SYSTEM MINOR FREEZE
    • 合并安排在低谷期:major_freeze_duty_time='02:00'
  3. 轮转合并优化

    • 启用 enable_merge_by_turn
    • 设置合理的 zone_merge_order

完整配置示例:

-- 调整冻结阈值和转储次数
ALTER SYSTEM SET freeze_trigger_percentage=40;
ALTER SYSTEM SET minor_freeze_times=5;-- 设置每日合并时间
ALTER SYSTEM SET major_freeze_duty_time='02:00';

附:关键系统表

表名用途
__all_server_event_history自动转储记录
__all_rootservice_event_history手动转储/合并记录
__all_zone合并状态查询
gv$memstore租户MemStore使用情况
http://www.lqws.cn/news/453187.html

相关文章:

  • 63 网络交互的过程中目标设备的选择
  • PROFIBUS DP 转 EtherCAT 网关:冶金自动化高效协同的基石
  • 深入剖析HashMap与LinkedHashMap应用
  • 前端页面Javascript数组
  • python之使用cv2.matchTemplate识别缺口滑块验证码---实现最佳图像匹配
  • 主流测距技术深度解析:激光雷达、UWB、微波与视觉方案的全面对比
  • 今日行情明日机会——20250620
  • 响应式数据可视化大屏解决方案,重构工业交互体验
  • 【深度学习基础与概念】笔记(一)深度学习革命
  • 【Golang】go build 命令选项-ldflags用法
  • Spring @ModelAttribute注解全解析:数据绑定与模型管理
  • ceph 通过 crush rule 修改故障域
  • DataWhale-零基础络网爬虫技术(二er数据的解析与提取)
  • LeetCode热题100—— 169. 多数元素
  • leetcode 291. Word Pattern II和290. Word Pattern
  • 解锁数据宝藏:数据挖掘之数据预处理全解析
  • 在Django中把Base64字符串保存为ImageField
  • 思辨场域丨AR技术如何重塑未来学术会议体验?
  • LVS vs Nginx 负载均衡对比:全面解析
  • leetcode-2966.划分数组并满足最大差限制
  • 多相机三维人脸扫描仪:超写实数字人模型制作“加速器”
  • Android Java语言转Kotlin语言学习指导实用攻略
  • 单片机3种按键程序消抖方法
  • DB-GPT启动提示please install by running `pip install cryptography`
  • 函数指针的回调函数与函数跳转执行
  • 国产芯片能在服务器领域替代Intel(经验总结贴)
  • Git——分布式版本控制工具
  • 【MySQL篇07】:redo log日志与buffer pool详解
  • Vue2 ElementUI Tree 拖动目标节点能否被放置及获取放置位置
  • 内存的代价:如何正确与 WASM 模块传值交互