内存数据库系统
智能互联设备的增长正在飙升。无论是在家庭、口袋中还是内置于工业通信和交通运输系统中,此类设备都已发展到包括强大的 CPU 和复杂的嵌入式系统软件。数据库管理系统 (DBMS) 是此类设备中日益常见的一种软件。虽然数据库在台式机和服务器上很常见,但对于嵌入式系统来说还是一个新事物。就像任何掉入新环境的生物一样,数据库也必须进化。一种新型的 DBMS,即内存数据库系统 (IMDS),代表了 DBMS 适应嵌入式系统的最新一步。
为什么嵌入式系统开发人员转向数据库?市场竞争要求机顶盒、网络交换机和消费电子产品等设备变得“更智能”。为了支持不断扩展的功能集,应用程序通常必须管理更大容量、更复杂的数据。因此,许多设备开发人员发现他们正在超出自行开发的数据管理解决方案的能力,而随着应用程序需求的增加,这些解决方案尤其难以维护和扩展。
此外,商用现成 (COTS) 嵌入式操作系统日益普及的趋势——以及摆脱许多专有系统的分散环境——促进了数据库的可用性。嵌入式 Linux 等广泛使用的操作系统的出现创建了一个用户社区,这反过来又刺激了数据库和其他工具的开发(商业和非商业),以增强该平台。
因此,设备开发人员正在转向商用数据库,但现有的嵌入式 DBMS 软件并没有提供理想的契合。嵌入式数据库在十多年前出现,旨在支持业务系统,其功能包括复杂的缓存逻辑和异常终止恢复。但是,在设备上,例如在机顶盒或下一代传真机中,这些能力通常是不必要的,并且会导致应用程序超出可用的内存和 CPU 资源。
此外,传统数据库是为将数据存储在磁盘上而构建的。磁盘 I/O 作为一种机械过程,在性能方面成本极高。这通常使得传统数据库对于需要实时性能的嵌入式系统来说太慢。
内存数据库的出现专门为了满足嵌入式系统中的性能需求和资源可用性。顾名思义,IMDS 完全驻留在内存中——它们永远不会访问磁盘。
那么,IMDS 仅仅是一个加载到内存中的传统数据库吗?这是一个合理的问题,因为消除磁盘 I/O 是这项新技术最广为人知的方面。在 Linux 中内置了创建 RAM 磁盘(内存中的文件系统)的功能。在这样的磁盘上部署一个众所周知的数据库系统,例如 MySQL 甚至 Oracle,难道不会提供相同的好处吗?
事实上,IMDS 与其嵌入式 DBMS 同类产品有很大不同。与传统数据库相比,IMDS 的复杂性较低。除了消除磁盘 I/O 之外,内存数据库系统的活动部件或交互过程也更少。与在内存中部署传统 DBMS 相比,这使得 RAM 和 CPU 的使用更加节俭,并且总体响应速度更快。了解 IMDS 中哪些内容被设计出来或进行了重大修改,对于决定这种技术是否适合给定的项目非常重要。以下描述了三个主要区别。
由于物理磁盘访问造成的性能损耗,几乎所有传统 DBMS 软件都集成了缓存,以将数据库中最近使用的部分保留在内存中。缓存逻辑包括缓存同步,以确保缓存中数据库页面的映像与磁盘上的物理数据库页面一致。还包括缓存查找,它确定应用程序请求的数据是否在缓存中;如果不在,则检索该页面并将其添加到缓存以供将来参考。
无论基于磁盘的 DBMS 是否部署在内存中(例如在 RAM 磁盘上),这些过程都会运行。通过消除缓存,IMDS 数据库消除了复杂性和性能开销的一个重要来源,并在此过程中减少了 IMDS 的 RAM 和 CPU 要求。
考虑一下应用程序从传统基于磁盘的数据库读取数据项、修改它并将该数据项写回数据库所需的交接。图 1 说明了该过程。
应用程序通过数据库 API 从数据库运行时请求数据项。
数据库运行时指示文件系统从物理介质检索数据。
文件系统为缓存制作数据副本,并将另一个副本传递给数据库。
数据库在其缓存中保留一个副本,并将另一个副本传递给应用程序。
应用程序修改其副本,并通过数据库 API 将其传递回数据库。
数据库运行时将修改后的数据项复制回数据库缓存。
数据库缓存中的副本最终写入文件系统,并在文件系统缓存中更新。
最后,数据写回物理介质。
即使处理完全在内存中进行,也无法在传统数据库中关闭这些步骤。并且这个简化的场景没有考虑到事务日志所需的额外副本和传输!

图 1. 传统 DBMS 中的数据流。红线表示数据传输。灰线表示消息路径。
相比之下,内存数据库系统几乎不涉及数据传输。应用程序可以制作本地程序变量中数据的副本,但这不是必需的。相反,IMDS 为应用程序提供一个指针,该指针直接引用数据库中的数据项,使应用程序可以直接处理数据。数据仍然受到保护,因为指针仅通过数据库 API 使用,这确保了它的正确使用。消除多个数据传输简化了处理。减少多个数据副本降低了内存消耗,并且这种设计的简单性提高了可靠性。
如果发生灾难性故障(例如断电),基于磁盘的数据库会通过提交完整事务或从系统重新启动时的日志文件中回滚部分事务来恢复。基于磁盘的数据库被硬连线为保留事务日志、刷新事务日志文件以及在提交事务后缓存到磁盘。
主内存数据库也提供事务完整性。为此,IMDS 维护已更新或删除的对象的前映像以及事务期间添加的数据库页面的列表。当应用程序提交事务时,前映像和页面引用的内存将返回到内存池(一个快速高效的过程)。如果内存数据库必须中止事务(例如,如果入站数据流中断),则前映像将恢复到数据库,并且新插入的页面将返回到内存。
如果发生灾难性故障,内存数据库映像将丢失。这是与基于磁盘的数据库的主要区别。如果系统关闭,则 IMDS 在重新启动时重新配置。因此,没有理由保留事务日志文件,并且从 IMDS 中消除了另一项复杂且内存密集型任务。
此功能可能不适合每个应用程序,但在嵌入式系统领域,有很多应用程序示例的数据存储可以轻松地实时补充。这些示例包括机顶盒中的节目指南应用程序(从卫星或有线电视前端下载)、上游服务器配置的无线接入点或协议发现网络拓扑时重新填充的 IP 路由表。此类系统的开发人员很乐意限制事务处理的范围,以换取卓越的性能和更小的占用空间。
这并不排除使用保存的本地数据。使用 IMDS,应用程序可以打开流(套接字、管道或文件指针),并指示数据库运行时从流中读取或写入数据库映像。此功能可用于创建和维护启动阶段数据,即数据库的初始起点。流的另一端可以是到另一个进程的管道或文件系统指针(任何文件系统,无论是磁性、光学还是闪存)。
IMDS 技术可以在哪里以及如何发挥作用?虽然内存数据库已在各种应用场景中涌现,但以下涉及最常见的互联网基础设施设备(IP 路由器)中的嵌入式软件的场景,为了解这项技术可以解决的问题提供了一个思路。
现代 IP 路由器集成了路由表管理 (RTM) 软件,该软件完成了确定互联网和其他网络上数据包下一跳的核心任务。路由协议持续监控可用路由和其他路由设备的状态,然后使用当前数据更新设备的路由表。
这些路由表通常作为 RTM 软件的专有衍生品存在。此解决方案是开发下一代路由器的主要挑战之一。随着设备功能的增加,路由表管理提出了一个重要的编程瓶颈。由于缺乏对复杂数据类型和数据库标志性的多种访问方法的支持,自行开发的路由表管理 (RTM) 结构提供的工具集有限。
此外,与任何硬连线到其支持的应用程序的数据管理解决方案一样,路由表在可扩展性和可靠性方面遇到困难。对数据管理代码所做的更改会贯穿整个 RTM 结构,导致意外的意外情况并增加 QA 周期。可伸缩性也是一个问题:对于给定任务运行良好的自行开发的数据管理在使用强度提高时经常会遇到困难。结果是,虽然互联网的增长需要路由技术的快速进步,但这种设备演进却因已经过时的软件架构而放缓。
在这种情况下,使用数据库似乎是理所当然的。但是,在 IP 路由器内部署传统 DBMS 存在问题。实时互联网地址查找无法适应访问磁盘以及执行缓存、事务日志记录和作为基于磁盘的 DBMS 的一部分的其他过程所需的延迟。
此外,在路由器中强加大型数据库占用空间需要更多 RAM 和更强大的 CPU。这增加了设备的总体成本,而路由器市场是价格竞争激烈的。即使稍微降低单位价格也会增加制造商的市场份额,而降低单位成本会直接影响到利润。节省 RAM 或需要更便宜处理器的软件可以决定产品的成功。
内存数据库的出现使得 DBMS 技术可以应用于许多嵌入式系统。对于嵌入式系统开发人员而言,经过验证的数据库技术提供了诸多好处,包括优化的访问方法和数据布局、标准且简化的导航方法、内置的并发和数据完整性机制以及改进的灵活性和容错能力。采用这种新型 DBMS 简化了嵌入式系统开发,同时解决了日益增长的软件复杂性并确保了高可用性和可靠性。

Steve Graves 是 McObject 的总裁兼联合创始人,该公司是 eXtremeDB 内存数据库系统的开发商。作为 Raima Corporation 的总裁,他帮助率先在嵌入式系统中使用了 DBMS 技术,与公司密切合作构建支持数据库的智能设备。作为数据库行业的资深人士,Graves 曾在多家上市公司和私营技术公司担任执行级别的工程、咨询和销售/营销职位。