跳转到内容

主内存数据库系统设计/MMDB概述

来自维基教科书,开放世界中的开放书籍

第3章:主内存数据库系统简介

目录上一页: 数据库管理系统简介下一页: 存储引擎


3.1 概述

[编辑 | 编辑源代码]

许多应用程序,如电信、过程控制、航空预订、股票市场等,都需要实时访问数据。除了维护数据一致性外,这些应用程序还需要对访问数据库的事务进行及时响应。主内存数据库,随着大容量廉价内存的普及而变得可行,可以提供比基于磁盘的数据库系统更好的性能和一致的吞吐量。由于数据永久驻留在主内存中,它不会涉及任何影响吞吐量的磁盘 I/O。实际上,对于基于磁盘的系统,吞吐量的标准偏差将非常大,实时应用程序将无法针对这种不可预测的吞吐量进行基准测试。这导致了一种新型的数据库管理系统的发展,称为主内存数据库 (MMDB) 系统。它也被称为“内存数据库 (IMDB) 管理系统”和“实时数据库 (RTDB) 管理系统”。

由于这种类型的数据库管理系统的基本底层假设发生了变化,因此导致了对传统基于磁盘的管理系统的存储、关系和 SQL 引擎的每个组件的研究和设计。

一次磁盘块传输大约需要 5 毫秒,而主内存访问需要 100 纳秒。通过将整个数据库保留在内存中,这些磁盘 I/O 被转换为内存访问,从而使吞吐量提高了数倍。这引发了一个有趣的问题:“如果在 DRDB 中所有数据都被缓存在缓冲池中,那么它们的性能会与 MMDB 一样好吗?”不幸的是,答案是否定的。这是因为数据结构和访问算法是为基于磁盘的系统设计的,当整个数据库完全在内存中时无法正常工作。关于主内存数据库,有一些常见的误解。

它们支持持久事务吗?

是的。尽管整个数据库都在主内存中,但备份副本存储在磁盘中,以在发生崩溃的情况下启用恢复。

多个用户可以同时访问数据库吗?

是的。多个用户和多个线程可以访问数据库,并通过闩锁和锁进行同步。

数据在主内存中的驻留对以下方面具有重要影响:

  • 数据表示
  • 数据访问算法 - 查询处理
  • 恢复
  • 并发控制

本书将更详细地讨论 DRDB 和 MMDB 实现之间的差异,以及 MMDB 如何比 DRDB 快得多。

图 4 描述了主内存数据库管理系统。它几乎包含所有存在于磁盘驻留数据库管理系统中的组件。SQL 引擎、关系引擎和存储引擎下的组件实现与 DRDB 组件有很大不同。

图 4:MMDB 系统架构

在 MMDB 的情况下,对应于数据库的物理实体是共享内存段或内存映射文件。这些进程间通信 (IPC) 机制允许在进程之间共享内存。有一些 JAVA 嵌入式主内存数据库只需要多线程访问。这些 DBMS 使用堆内存作为数据库。对于多进程访问,我们应该使用共享内存 IPC 或内存映射 IPC 机制。通常,控制信息与数据记录分开存储,以避免控制信息的损坏。

3.2 内存段

[编辑 | 编辑源代码]

内存分为三个主要段。

控制段包含锁表、进程表、事务表、撤销日志和重做日志。这些结构是短暂的,是数据库管理系统操作所必需的。

目录段包含有关表、索引、字段等的元数据。

用户段包含所有表的记录和这些表的索引记录(如果有)。

3.3 SQL 引擎

[编辑 | 编辑源代码]

在 MMDB 的情况下,SQL 语句的优化和执行发生了巨大变化。基于成本的优化主要基于磁盘 I/O 的数量,而不是 CPU 周期。这些基于成本的优化是整个 DBMS 中最复杂的系统。DRDB 使用基于成本和基于规则的优化器。但在 MMDB 的情况下,基于规则的优化器就足够了。

3.4 关系引擎

[编辑 | 编辑源代码]

当我们不需要使用两遍算法来实现操作时,所有关系操作算法都会发生变化。此外,在 DRDB 的情况下,当我们执行第一遍时,我们会将所有字段的数据从磁盘复制到内存。在 MMDB 的情况下,我们将使用指针间接寻址,并避免数据复制和磁盘 I/O。

对于 MMDB,T-Tree 索引结构在空间和 CPU 周期方面优于 DRDB 的 B-Tree。

3.5 事务引擎

[编辑 | 编辑源代码]

由于 MMDB 事务不再等待磁盘 I/O,这会导致大量争用问题和死锁,从而影响吞吐量。在 MMDB 中,需要避免这一点并比 DRDB 更加重视。

3.6 存储引擎

[编辑 | 编辑源代码]

在 DRDB 中,分配是基于磁盘块进行的。但在 MMDB 中,它应该在内存中进行。这会导致分配算法的大量优化,从而节省空间和 CPU 周期。数据库模块在 DRDB 的情况下与文件管理器模块一起工作,而在 MMDB 的情况下,它与 OS IPC 抽象层一起工作。


目录上一页: 数据库管理系统简介下一页: 存储引擎

华夏公益教科书