暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB-X DN InnoDB 架构详解

PolarDB 2025-11-20
33

PolarDB-X DN InnoDB 架构详解

本文将详细讲述 PolarDB-X DN InnoDB 存储引擎的架构,重点介绍其核心组件、内存结构以及它们如何交互以实现符合 ACID 标准的事务处理。涵盖 InnoDB 的基本构建模块,从存储组织到事务管理。

InnoDB概述

InnoDB 是一种通用存储引擎,兼具高可靠性和高性能。它是 PolarDB-X DN 的默认存储引擎,并采用 ACID(原子性、一致性、隔离性、持久性)事务特性设计。InnoDB 维护自己的缓冲池,用于在内存中缓存数据和索引,实现 MVCC(多版本并发控制),并提供崩溃恢复功能。

存储引擎用 C 编写,并组织成几个主要子系统:

  • 内存管理(缓冲池)
  • 存储管理(表空间、PAGE)
  • 事务管理和 MVCC
  • 锁系统
  • 恢复系统(重做日志、撤消日志)
  • 文件 I/O 子系统

这些组件协同工作,提供一个强大且高性能的数据库存储系统,可处理并发访问,同时保持数据完整性。

高级架构

InnoDB 架构图


存储结构

表空间

InnoDB 将所有数据组织到表空间中,表空间是数据的逻辑容器。表空间有几种类型:

  • 系统表空间 - 包含 InnoDB 数据字典、undo 日志和用户数据(如果禁用每个表一个文件)的原始单片表空间。
  • 每个表一个文件的表空间 - 每个表都有自己的表空间文件(.ibd文件)。
  • 通用表空间 - 用户创建的表空间,可以包含多个表。
  • 临时表空间 - 用于临时表和排序操作。
  • undo 表空间 - 存储活动事务的undo 日志。

表空间由段、区和页组成:

fil_space_t
结构表示内存中的表空间,用于跟踪空间 ID、文件名和flag等信息。表空间由处理文件操作和缓存的Fil_shard
Fil_system
类管理。

PAGE

InnoDB 将数据组织成页(也称为块),页是 I/O 的基本单位。默认页大小为 16KB,但创建表空间时可以配置为 4KB、8KB、16KB、32KB 或 64KB。

每个页面根据其类型具有特定的结构:

  • 索引页 - 存储索引和数据记录(B+树节点)
  • undo日志页 - 存储事务的undo记录
  • 系统页 - 存储有关表空间的元数据
  • Blob Pages - 存储大字段的溢出数据

页面由缓冲池在内存中管理,缓冲池缓存经常访问的页面以减少磁盘 I/O。

记录

记录是 InnoDB 中存储的最小数据单位。它们代表表中的行,并以紧凑的格式存储以最大限度地减少空间占用。InnoDB 支持不同的记录格式:

  • REDUNDANT - 原始 InnoDB 记录格式
  • COMPACT — 与REDUNDANT相比,减少了空间占用
  • DYNAMIC - 可变长度列存储在页外
  • COMPRESSED - 压缩页面以提高空间效率

每条记录包含:

  • 字段值
  • 事务 ID(用于 MVCC)
  • 回滚指针(指向 undo 信息的位置)
  • 头信息(元数据)

内存结构

缓冲池

缓冲池是 InnoDB 用于数据和索引的主要内存缓存区域。它缓存从表空间读取的页面,以最大限度地减少磁盘 I/O。缓冲池被划分为与表空间页面大小相同的缓冲页面(默认为 16KB)。

缓冲池使用几个列表进行管理:

  • LRU 列表 - 采用改良的 LRU 算法来跟踪页面使用情况
  • 空闲列表 - 跟踪未使用的缓冲块
  • 刷新列表 - 跟踪需要写入磁盘的脏页

缓冲区页面由其表空间 ID 和PAGE ID进行标识,并使用哈希表进行快速查找。

附加内存结构

除了缓冲池之外,InnoDB 还使用了其他几种内存结构:

  • 日志缓冲区 — 在将重做日志记录写入磁盘之前保存这些记录的循环缓冲区
  • 更改缓冲区 - 缓存具有非唯一键的表的二级索引更改
  • 自适应哈希索引 - 用于频繁访问页面的自动内存哈希索引
  • 字典缓存 — 缓存表和索引元数据

事务管理

事务系统

InnoDB 使用缓冲池、重做日志和撤消日志的组合来实现完全符合 ACID 的事务。InnoDB 中的每个事务都由一个trx_t
跟踪其状态和资源的结构表示。

事务状态包括:

  • NOT_STARTED
  • ACTIVE
  • PREPARED(用于 XA 事务)
  • COMMITTED_IN_MEMORY
  • 各种回滚状态

多版本并发控制(MVCC)

InnoDB 实现了 MVCC,允许并发事务查看一致的数据快照,而不会相互阻塞。这是通过存储多个版本的记录并使用事务 ID 跟踪事务可见性来实现的。

当事务需要读取一条记录时,它会根据读取视图检查该记录的事务 ID 是否可见,该视图跟踪创建读取视图时的活动事务集。

锁系统

InnoDB 实现了一套复杂的锁系统来确保数据一致性。它支持多种锁定类型:

  • 共享(S)锁 - 允许多个事务读取资源
  • 排他(X)锁 - 允许单个事务修改资源
  • 意向锁 — 以更细的粒度发出锁定意向信号
  • 记录锁 - 锁定单个索引记录
  • 间隙锁 - 防止在一定范围内插入记录
  • Next-Key Locks - 记录锁和间隙锁的组合

锁系统在lock0lock.cc
文件中实现,旨在确保隔离,同时最大限度地减少争用。

I/O 和持久化

重做日志

重做日志是一个循环日志文件,用于记录对数据页的所有更改。它用于实现持久性并从崩溃中恢复。当事务修改页面时,它会生成描述更改的重做日志记录。

重做日志系统确保崩溃后可以恢复已提交的事务,即使修改后的数据页未写入磁盘。

撤消日志

撤消日志存储已修改数据的先前状态,允许 InnoDB:

  • 回滚事务
  • 实现 MVCC 以实现一致性读取
  • 崩溃后撤销未完成的事务对数据库产生的修改

撤消记录包含逆转事务影响所需的信息,允许 InnoDB 在需要时回滚更改。

文件 I/O 子系统

InnoDB 实现了自己的文件 I/O 子系统来有效地管理数据文件:

I/O子系统支持:

  • 同步和异步 I/O
  • direct I/O(绕过操作系统缓存)
  • 用于崩溃保护的双写缓冲区
  • 文件空间管理

恢复机制

当 InnoDB 在崩溃后启动时,它会经历一个恢复过程以确保数据一致性:

恢复过程包括:

  • 查找重做日志中的最后一个检查点
  • 从检查点开始扫描重做日志
  • 应用更改来重新创建缓冲池状态
  • 使用撤消日志回滚任何未提交的事务

数据字典

数据字典存储有关数据库对象(表、索引等)的元数据:

数据字典提供对表和索引定义的快速访问,通过在内存中缓存这些信息来提高性能。

B+树结构

InnoDB 对所有索引(包括聚集索引)使用 B+Tree:

InnoDB B+Trees 的主要特点:

  • 所有数据都存储在叶节点(聚集索引)中
  • 非叶节点仅包含键和指针
  • 叶节点相互链接,以实现高效的范围扫描
  • 二级索引指向主键值

小结

InnoDB 凭借其符合 ACID 标准的事务处理、高效的 B+Tree 索引和先进的并发控制,为 PolarDB-X DN 提供了坚实的基础。其架构通过智能缓冲区管理、严谨的写入顺序和全面的恢复机制,在性能和可靠性之间取得平衡。

关键架构组件 —— 缓冲池、事务系统、存储结构和恢复机制 —— 共同协作,提供满足现代应用程序需求同时确保数据完整性的数据库引擎。

欢迎关注PolarDB公众号.

如需“商务咨询“或”开源交流“, 速加小编微信.


文章转载自PolarDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论