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

OceanBase 从0到1数据库内核实战教程学习笔记 - 6.存储引擎结构(上)

数据库管理系统都包含多个组件,每个组件具有不同的功能。存储引擎主要负责数据的存储和查询。

今天我们主要介绍一下 OB 的 LSM-Tree 存储引擎优秀特性,并介绍主流的 LSM-Tree 及 compaction 策略。今天的内容主要分为以下三部分:

  • LSM-Tree
  • Compaction
  • Compaction in Oceanbase

1. LSM-Tree

LSM-Tree 全称 Log Structure Merge Tree,结构化合并树,由 Patrick 在 1996 年在对应论文中提出。使用 LSM-Tree 的典型数据库有:HBase、Cassandra 和 RocksDB。
在这里插入图片描述
当前业内实现存储引擎的结构主要有两种,LSM-Tree 和 B+树;传统的数据库更青睐使用 B+ 树,因为 B+ 树是平衡搜索树的一种,它是为了磁盘搜索而诞生的;B+ 树的一个叶子节点设定为一个磁盘块,每次查询或写入时都需要从根节点查询到叶子节点,从叶子节点对应的位置来进行操作,方便原地更新;B+ 树的查询/插入/删除时间都是 O(logN),是比较优秀的
在这里插入图片描述

LSM-Tree 的核心是将离散的随机写请求转化为批量的顺序的写请求

  • 当用户有写入时,他会先写入到内存的 Memory Table 和 log 日志;
  • 只有当内存中的 Memory Table 达到一定阈值后,会将 Memory Table 冻结成一个只读状态,同时创建一个新的 Memory Table 提供数据写入;
  • 后台会将冻结的 Memory Table 写到磁盘上,形成 SSTable;整个过程完成后,内存中的冻结 Memory Table 和 log 日志就可以被回收掉;
  • SSTable,全称 Sorted String Table,是从 Google BigTable 借鉴的概念,数据是按照 RowKey 递增的方式组织的,就可以使用二分搜索的方式来快速定位到数据;
  • SSTable 是被划分成不同层级的,层级越低说明数据越新,比如 L0 层就是最新写入的;
  • LSM-Tree 是 Append-only 的,如果一个数据有多次更新,就会存储多条数据;
  • LSM-Tree 的查询是从内存一层层向下搜索的。
    在这里插入图片描述

上面看完了 LSM-Tree 和 B+树两种数据结构的各自特点,下面我们来对比看一下二者的区别:

  • B+树有 原地更新 和 定长数据块 的假设;使得 B+ 树不太适合压缩;
  • LSM-Tree 是 Append-Only 的,把更新写作额外的行,并且 SSTable 没有定长块的假设,比较适合压缩;

2. Compaction

Compaction 就是将多个 SSTable 作为输入,进行归并排序,然后输出为一个 SSTable。Compaction 可以减少 SSTable 数量,提升查询性能;但是 Compaction 是一个资源消耗很高的操作,SSTable 读写会造成 I/O 压力、压缩解压缩RowKey对比checksum等会造成 CPU 压力、MemTable 转化为 SSTable 会减缓查询性能,造成性能抖动;这也是业界一直在关注的 Compaction 的问题。

Compaction 策略是对写放大、空间放大、读放大的一个权衡,具体解释如下图:

在这里插入图片描述

业界对于 Compaction 也有很多不同的策略,下面给大家罗列一下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于 FIFO Compaction 可能存在丢数据的问题,所以这里仅对比如下三种 Compaction 策略,OceanBase 采用的是 Tiered & Leveled Compaction 策略。
在这里插入图片描述
与 Compaction 相关的,一个不可避免的问题就是“Tombstone 墓碑问题”,也就是大量 delete 操作导致的查询性能问题。
在这里插入图片描述
在这里插入图片描述

3. Compaction in Oceanbase

OceanBase 的 LSM-Tree 架构如下图所示:

  • 在 L0 层,使用的是 Tiered 模式,允许有多个 Mini SSTable 存在;
  • L1 和 L2 层,只能有一个 Minor SSTable 和 Major SSTable;

在这里插入图片描述
OceanBase 的 Compaction 也分为三种

  • L0 层的 Mini Compaction 是将内存中的 Frozen Memtable 变成磁盘上的 Mini SSTable,是数据日志的一种 checkpoint;是一种 Tiered 类型的 Compaction;Mini Compaction 之后,内存中的 Frozen Memtable 和 log 日志就可以释放了;
    在这里插入图片描述
  • Minor Compaction 是针对 L0 层和 L1 层的 SSTable,它是将多个 Mini SSTable 合成一个;主要目的是减少 SSTable 数量,减少读放大问题;当 Mini SSTable 超过阈值时自动触发 Minor Compaction;后台自动触发;细分为两类,如下图,分为 Tiered 和 Leveled 模式:
    在这里插入图片描述
  • Major Compaction 是在整个集群中选择一个合适的 Major 位点,每个分区都使用该 Major 位点做快照查询,并将查询结果进行持久化生成 Major SSTable;这也是我们常说的合并。合并的触发一共有三种方式:
    • 自动触发:Mini Compaction 执行次数达到阈值,缩减 SSTable 数量,降低读放大;
    • 定时触发:尽量避开在业务高峰期,通过设置触发事件,在业务低峰期触发合并;
    • 手动触发:使用命令手动触发合并。
      在这里插入图片描述
      另外 OceanBase 在合并过程中也做了很多优化动作:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      今天的内容大概就这些~

最后的最后,如果大家感兴趣,可以多关注和参与 OB 的活动:https://ask.oceanbase.com/t/topic/35601006。

相关文章:

  • switch循环语句
  • 牛客练习赛#84 F 莫比乌斯反演+杜教筛+技巧+斐波那契数列和gcd的结论+矩阵快速幂
  • ZZNUOJ_用C语言编写程序实现1342:支配值数目(附完整源码)
  • java毕业设计后勤管理系统餐饮评价监督系统(附源码、数据库)
  • 前端基础学习笔记
  • 【TS】联合类型--类型断言--类型推断
  • 谈笑风声的秘密
  • QT影城网上售票系统
  • NetCDF数据在ArcMap中的使用
  • 打怪升级(考验思路)