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公众号.
如需“商务咨询“或”开源交流“, 速加小编微信.





