OceanBase学习(四)--基于LSM-Tree的存储引擎

一 LSM-Tree存储引擎

1. LSM-Tree

1.1 什么是LSM-Tree

LSM-Tree,全称 Log Structured Mergr Tree,结构化合并树。OceanBase 采用的就是LSM-Tree架构。像HBase、Cassandra、RocksDB 也是选择LSM-Tree作为其架构。

1.2 B+树与LSM-Tree的区别

B+树的特点
  • B+树是平衡搜索树的一种,是为了磁盘搜索而诞生的
  • 一个叶子节点设定为一个磁盘块
  • 原地更新
  • B+树查询/插入/删除的时间复杂度都是O(logN)

 LSM-Tree的特点

LSM-Tree的核心思想就是将离散的随机写请求都转换成批量的顺序写请求。

Append-Only,无原地更新

有查找顺序,查到为止(Memtable--Frozen Memtable --L0--L1......LN)

二 Compaction

2.1 什么是Compactiom

  • 数据的重新整合,实质是多路归并排序。
  • 减少SSTable数量,提高查询性能。
  • 资源消耗高
    • I/O: SSTable的读取与写入;
    • CPU:涉及数据的压缩和解压、checksum计算、rowkey比较;
    • 性能抖动(比如内存中的Memtable转换成磁盘上的SSTable,会使得查询耗时变长)。

2.2 放大问题

不同的Compaction策略是对写放大、空间放大、读放大的一个权衡。

写放大    (Write Amplification)= 磁盘写入的数据量 / 实际的写入量

空间放大(Space Amplification)= 存储的数据量 / 实际的数据量

读放大   (Read Amplication) = 本次扫描的数据量 / 实际返回的数据量

2.3 三种典型的Compaction

Classic Leveled Compaction 模式、Size-Tiered Compaction模式和 Tiered & Leveled Compaction模式 

Classic Leveled Compaction

特点

LSM-Tree 划分为N个Level

每个Level 仅包含一个SSTable

  • Compaction触发的条件:某个Level的存储数据量到达阈值。
  • L(n) + L(n=1) = new L(n+1)
  • rowkey range有交集的部分进行Compaction。
Size-Tiered Compaction 

特点

  • LSM-Tree 划分为N个Level
  • 每个Level 包含多个SSTable
  • Several L(n+1) = new L(n+1)

Tiered & Leveled Compaction模式(混合模式)

特点

  • 对于层级较小的Level,使用Size-Tiered 模式减少写放大问题
  • 对应层级较大的Level,使用Leveled模式减少空间放大问题

 三种模式的比较

 2.4 Compaction 在 OB LSM-Tree 中的使用

LSM-Tree结构图

Mimi Compaction 

  • 内存中的Frozen Memtable 通过 Mini Compaction 变成磁盘上的Mini SSTable ,是数据日志的一个checkpoint
  • Mini Compaction 结束后,其对应的Frozen Memtable 和 数据log可以被释放
  • Tiered 类型的Compaction

Minor Compaction

针对L0 和 L1 层的SSTable

Minor Compaction 就是将多个Mini SSTable 合成一个

主要目的就是减少SSTable 的数量、减少读放大问题

当Mini SSTable 的数量超过阈值时自动触发Minor Compaction 

 Major Compaction

整个集群选择统一的Major位点,每个分区都使用该Major位点做快照查询,并将查询结果进行持久化生成Major SSTable

合并触发有三种触发模式:自动触发、定时触发与手动触发

自动触发:Mini Compaction 执行次数到达阈值,缩减SSTable 的数量,降低读放大

定时触发:尽量避开在业务高峰期,通过设置触发时间,在业务低峰期定时触发合并

手动触发:使用命令触发

全量合并

  • 和HBase 与 Rocksdb 的 Major Compaction过程是类似
  • 在全量合并过程中,会把当前的Major SSTable 数据都读取出来,和所有的Mini / Minor SSTable 合并后,再写到磁盘上去作为新的Major SSTable。

增量合并

  • 增量合并是相对于全量合并而言
  • 增量合并只重写发生了修改的宏块 / 微块,未修改的直接放入新的 Major SSTable 中
  • 宏块和微块的重用省去了解析行、编码以及计算列Checksum等操作
  • 改善写放大问题

渐进合并

  • 在执行某些DDL操作时,例如执行表的加列、减列、修改压缩算法等操作后,可能需要将数据重写一遍
  • OceanBase 数据库并不会立即对数据执行重写操作,而是将重写动作延迟到合并时进行
  • 数据重写将增量合并回退到全量合并,耗时变长
  • 渐进合并的核心是把数据的重写分散到多次合并中去做,在一次合并中只进行部分数据的重写

例如

alter table t1 set progressive_merge_num = 60;

轮转合并

  • 轮转合并的诞生是为了规避合并对业务的影响。
  • 多副本轮流执行合并操作(例如:Zone1-->Zone2-->Zone3 逐个合并)
  • 将用户操作的流量导向没执行合并的副本

并行合并

当合并参与的SSTable数据量特别大时,整个合并的过程会非常耗时。将整个需要完成的Rowkey值域按照当前table_size划分为若干个子任务,子任务之间可以并发执行。当所有子任务执行结束之后,本次合并才算结束。并行合并默认开启,对于数据量大的Compaction后台自动划分并行任务。

三 OceanBase 的存储格式

3.1 存储分层结构

 

 3.2 内存数据格式

 OceanBase 数据库的内存存储引擎MemTable 由Btree 和 Hashtable组成,在HashTable和Btree中存储的均为指向对应数据的指针。HashTable 比较适合按主键查找,适用于dml时主键校验或者其它按主键查找;Btree中数据都是按主键有序的,比较适合按主键范围查找。

3.3 磁盘文件格式

 SSTable 内部按照数据大小分为宏块和微块。宏块是数据写IO的基本单位,大小为2M的定长数据块;微块是数据读IO的基本单位,为变长的数据块。

四 查询

4.1 主表查询

Get 查询(主键查询)

 如果 MemTable 中有了全部数据(想要的所有行和所有的列--列数据不是NOP),那么就不需要Major SSTable中去查询了,也不需要整合了

 

 

 基本流程概况如下

 Scan查询

相对于get查询Scan查询是不知道主键的情况下或者只知道主键部分列的情况下,对表的查询。

 往前推进一步(即开始处理下一行)

 继续下一行

 基本流程概况如下

4.2 索引回表查询

 五 关于“合并管理”相关的SQL语句

5.1 系统租户查看所有租户的合并信息

系统租户可以通过视图来观察所有租户的租户级合并信息和分区级合并信息。

*** 通过视图 CDB_OB_ZONE_MAJOR_COMPACTION 或 CDB_OB_MAJOR_COMPACTION 查看租户级合并信息。

视图 CDB_OB_ZONE_MAJOR_COMPACTION 展示了所有租户各个 Zone 的合并过程。

SELECT * FROM oceanbase.CDB_OB_ZONE_MAJOR_COMPACTION;

视图CDB_OB_MAJOR_COMPACTION 展示了所有租户的合并全局信息。

SELECT * FROM oceanbase.CDB_OB_MAJOR_COMPACTION;

*** 通过视图 GV$OB_MERGE_INFO 或 GV$OB_TABLET_COMPACTION_HISTORY 查看分区级合并信息。

视图 GV$OB_MERGE_INFO 展示了 Tablet 级别的合并基础统计信息。

SELECT * FROM oceanbase.GV$OB_MERGE_INFO WHERE TENANT_ID=1002 AND TABLET_ID=200001 ORDER BY START_TIME DESC LIMIT 10;

视图 GV$OB_TABLET_COMPACTION_HISTORY 展示了 Tablet 级的合并的详细历史信息。

SELECT * FROM oceanbase.GV$OB_TABLET_COMPACTION_HISTORY WHERE TENANT_ID=1002 AND TABLET_ID=200001 ORDER BY START_TIME DESC LIMIT 2\G

5.2 用户租户查看本租户的合并信息

用户租户也可以通过视图来查看本租户的合并信息。

通过视图 DBA_OB_ZONE_MAJOR_COMPACTION 或 DBA_OB_MAJOR_COMPACTION 查看本租户的租户级合并信息。

视图 DBA_OB_ZONE_MAJOR_COMPACTION 展示了本租户各个 Zone 的合并信息。视图 DBA_OB_MAJOR_COMPACTION 展示了本租户的合并全局信息。

通过视图 GV$OB_TABLET_COMPACTION_HISTORY 查看本租户分区级合并信息。

 

说明

1.摘抄于OB官网

2.https://open.oceanbase.com/course/151    学习笔记

posted @ 2025-06-07 10:07  东山絮柳仔  阅读(202)  评论(0)    收藏  举报