这是我参与「第四届青训营 」笔记创作活动的的第9天
本节主要介绍LSMT存储引擎,包括其优势与实现、理论分析。
一、LSMT 与存储引擎
1.LSMT
Log-Structured Merge-Tree(LSMT)1996年在论文中提出。
高性能的交易系统通常会为一次交易就插入若干条记录到历史表,使其可追溯。这就使得高效的实时索引十分重要。LSM树是一个基于磁盘的数据结构,主要用于为那些高概率插入和删除的记录提供低成本的索引。
LSM使用了一个算法来延迟批处理索引变更,然后类似归并排序的方式串联起一个基于内存的组件和若干基于磁盘的组件上面的所有变更信息。该算法相比于传统的B树访问方式大大减少磁盘臂的移动开销。
由于索引搜索需要立刻响应,这会在某些场景降低IO效率,所以LSM树在索引写入占比大大超过索引查找的场景中最适用,如历史表和日志文件。
2.存储引擎
存储引擎可以保障ACID,并且屏蔽IO细节,给出统一的抽象。
数据库绝大部分持久化状态和数据都存放在存储引擎里,因此存储引擎相比于上层有着对数据更准确的信息。存储引擎是数据读取的源头,因此还可以将一些过滤条件下推引擎,避免无意义的 IO。
二、LSMT 存储引擎的优势与实现
1.LSMT优势
- 顺序写模型对于 SSD 设备更友好
- SST 不可修改的特性使得其能使用更加紧凑的数据排列和加上压缩
- 后台延迟 Compact 能更好利用 CPU 多核处理能力,降低前台请求延迟
2.实现
LSMT架构:
在它的子结构SSTable(全称是Stored String Table,本质上是一个KV结构的顺序排列的文件)增加了一个MemTable,就是存放在内存中的数据结构,可以快速实现增删改查。其次,还需要一个log文件,和数据库的binlog相当,记录数据发生的变化,用于服务器宕机时找回数据。
三、LSMT 模型理论分析
一棵拥有两个组件的LSM树拥有两部分:
一个较小的位于内存的组件,C0 tree
一个较大的位于磁盘的组件,C1 tree
尽管C1树常驻磁盘,但他的常被访问的磁盘页会被保留在内存中(未在图中展示)。
历史记录表的数据每生成一行新记录流程如下:
- 首先向顺序日志文件中写一条用于恢复这次插入行为的日志记录
- 该行数据的索引被插入到常驻内存的 C0 树中
- 会适时地将这些C0树上的数据迁移到磁盘上的C1树中
- 每个索引的搜索过程都是先C0后C1