通用数据库内核

4 阅读6分钟

数据库内核开发核心技术深度解析

数据库内核是一个极其复杂的系统工程,其技术栈可视为一个分层架构,从底层的存储管理到顶层的分布式协调,每一层都包含精妙的设计。

一、 存储引擎层:数据的基石

这是性能与可靠性的根本,其设计直接决定了数据库的“性格”(OLTP 或 OLAP)。

  1. 索引结构详解

    • B+树:不仅是索引,在InnoDB中甚至是数据本身(索引组织表)。

      • 节点结构:内部节点只存键值和子节点指针,叶子节点存储完整数据或主键指针,且叶子节点通过指针双向链接,支持高效范围扫描。
      • 并发控制:需要复杂的闩锁协议来支持高并发插入和分裂,如 B-Link-Tree​ 设计。
    • LSM-Tree:为高速写入而生。

      • 核心过程:写入先进入内存表,写满后冻结为不可变的SSTable并刷到磁盘。后台通过 Compaction​ 过程合并和排序SSTable,此过程是CPU和IO的主要消耗点。
      • Compaction策略Leveled(读优,空间放大低)和 Tiered(写优,空间放大高)是两种核心策略,RocksDB的 Leveled Compaction是工业界标杆。
    • 其他索引跳表常用于内存数据库,布隆过滤器常与LSM-Tree结合,用于快速判断数据不存在,减少不必要的磁盘IO。

  2. 缓冲池与内存管理

    • 页面替换算法:LRU的变种(如分区的LRU、LRU-K)是主流,用于应对全表扫描等“污染”问题。
    • 预读与刷脏:根据访问模式预测并异步预取数据页;根据检查点或活动水平异步将修改过的“脏页”写回磁盘。
  3. 日志系统

    • WAL协议:任何数据页的修改,必须先将其对应的 redo log​ 持久化到日志文件。这保证了已提交事务的持久性。
    • 日志格式:物理日志(记录字节变化)、逻辑日志(记录SQL操作)或物理逻辑日志(如PostgreSQL的WAL)。Undo Log用于事务回滚和MVCC的版本构建。
    • 检查点:并非简单的全量刷盘,而是找到一个一致的起点,保证该点之前的日志在恢复时不再需要。

二、 查询处理层:计算的大脑

目标是高效地将声明式的SQL转化为物理执行步骤。

  1. 查询优化器:这是内核中最复杂的部分,被称为“数据库的皇冠”。

    • 统计信息:不仅仅是行数,包括直方图、最常值、列之间的相关性等,用于估算选择性和中间结果集大小。
    • 代价估算:建立模型,计算CPU代价(处理元组的开销)、IO代价(读取页面的开销)和内存代价。
    • 搜索空间与枚举:使用动态规划(System R风格)或遗传算法来在巨大的可能执行计划空间中,寻找近似最优解。对连接顺序的优化是核心难题。
  2. 执行引擎模型

    • 火山模型:每个算子实现一个 Next()接口,通过递归调用向下拉取数据。优点是抽象干净,缺点是函数调用开销大、缓存不友好。
    • 向量化模型:每个算子的 Next()返回一批数据(一个向量),在列存格式上效率极高。它利用了CPU SIMD指令对同一列的数据进行并行计算,是现代分析型数据库的标配。
    • 编译执行:将整个查询计划编译成一个独立的、紧循环的机器码函数。彻底消除了算子间的调用开销和解释开销,代表是HyPer和ClickHouse的实验特性。
  3. 关键算子实现

    • 连接算法Nested Loop Join(适用于小数据集)、Hash Join(需要内存构建哈希表,适用于等值连接)、Sort-Merge Join(适用于数据已排序或需要排序输出)。
    • 聚合算法Hash AggregationSort Aggregation
    • 数据交换:在并行执行中,算子间通过 Exchange算子进行数据重分布。

三、 事务与并发控制层:一致性的保障

在并发访问下维护ACID语义。

  1. MVCC 深度剖析

    • 版本存储:版本可以存储在主表旁(如PostgreSQL,通过行头指针链接多个版本),或存储在Undo Log空间(如MySQL InnoDB,通过回滚段构造历史版本)。
    • 可见性判断:每个事务开始时获取一个快照。通过比较行版本的事务ID与当前快照的上下界,并结合行上的“删除标记”,来判断该版本对当前事务是否可见。这是实现RC和RR隔离级别的核心。
    • 版本清理:需要后台进程(如PostgreSQL的Vacuum)来清理不再被任何事务需要的历史版本,否则会导致空间膨胀。
  2. 锁管理器

    • 锁粒度:行锁、页锁、表锁。行锁是并发度的关键。
    • 锁模式:共享锁、排他锁、意向锁。意向锁用于高效检测表级冲突。
    • 死锁处理等待图检测(定期扫描)或超时机制

四、 高可用与分布式层:可扩展的骨架

  1. 复制与一致性

    • 物理复制 vs 逻辑复制:物理复制传输WAL字节流,主备完全一致;逻辑复制传输SQL语句或行变更,可跨版本或选择性复制。
    • Raft协议核心Leader选举日志复制安全性。所有写请求都经过Leader,并复制到多数派节点后提交,保证强一致性。
  2. 分布式查询与事务

    • 分布式查询计划:优化器需要知道数据分布位置,将计划拆分为多个片段,在数据所在节点上进行计算,并进行网络数据交换。

    • 分布式事务模型

      • 2PC:协调者角色关键,存在协调者单点故障和阻塞问题。
      • Percolator模型:基于BigTable的单行事务和全局授时服务,通过“主行”锁和提交时间戳实现跨行事务。TiDB采用此模型。
      • Spanner:通过硬件(GPS和原子钟)提供有误差界的全局时间戳,实现了全球分布的强一致性事务。

前沿与趋势

  • 存算分离:计算节点无状态,共享分布式存储池(如S3)。实现了极致的弹性伸缩和成本优化,是云数据库的主流架构。
  • 硬件加速:利用RDMA​ 降低网络延迟,使用PMem​ 作为持久化内存层,GPU/DPU​ 加速特定计算(如连接、聚合)。
  • 多模与融合:单一内核支持关系、文档、图、时序等多种数据模型和查询接口。
  • AI4DB:使用机器学习优化器、代价估计、索引推荐和系统调参。