持久媒体I/O
写入数据有两个方面需要考虑:性能以及系统故障情况下的恢复。为了在系统故障时能够恢复数据库,SmartEDB 运行时除了使用数据库文件外,还会使用日志文件来处理持久数据库。以下图表说明了写入过程:

非缓冲 I/O 速度较慢,因此文件 I/O 通常会进行缓冲处理。这样,数据库写操作不会直接将数据写入持久性介质,而是先写入文件系统缓冲区。随后,文件系统会在文件系统提交或执行 _sync() 操作时,将缓冲的数据刷新到持久性介质。
为了优化这一写入过程的性能,SmartEDB 提供了三种选项:除了在“持久数据库 I/O”页面中讨论的日志文件类型和事务提交策略外,SmartEDB 还提供了异步文件 I/O(AIO,详见下文)。AIO 决定了文件系统处理写入请求的方式。此外,SmartEDB 对多文件和 RAID 设备的支持也在下面的“多文件”部分中进行了详细介绍。
有关实现细节,请参阅“本地语言 API”部分。
异步文件 I/O
异步文件 I/O 通过向内核发送 I/O 请求,使调用线程在等待 I/O 操作完成的同时继续处理其他任务。对于大型数据库事务,AIO 是一种有效提升处理效率的方法。然而,对于相对较快的 I/O 操作,处理内核 I/O 请求和信号的开销可能会使其优势不明显,尤其是在需要频繁进行大量快速 I/O 操作的情况下。
SmartEDB 的异步 I/O 实现通过将更新分组和重新排序进行了优化,确保多个更新可以同时与介质同步。请注意,AIO 会将磁盘操作存储在内存队列中,并不会在每次提交时立即将其刷新到磁盘。因此,如果发生硬件故障,这些数据可能无法写入磁盘,在恢复后,数据库可能会丢失一些从应用程序角度来看最近提交的事务。不过,即便出现这种情况,数据库仍然会保持一致的状态。
AIO 主要作为服务器端功能提供。通常情况下,服务器不允许应用程序直接访问数据库,而是通过远程协议进行访问。默认情况下,AIO 是禁用的,但提供了 API 来启用、启动和停止 AIO。
请注意,异步 I/O 目前不适用于共享内存数据库。
多文件数据库
SmartEDB 支持三种类型的多文件设备,用于持久化数据库:
多文件:可以将其视为由多个段组成的虚拟文件。当第一个段已满时,系统会自动开始填充下一个段,依此类推。除了最后一个段外,所有段的大小都需要预先指定。最后一个段则可以根据需要无限增长。
RAID-0(条带化):数据块会在多个 RAID 段之间分散存储。例如,在具有两个段的 RAID-0 中,第一个块写入第一个段,第二个块写入第二个段,第三个块再回到第一个段,依此类推。RAID-0 可以显著提高性能,因为每个 RAID 设备可以是单独的磁盘,并且由独立的控制器管理。不过,RAID-0 不提供额外的数据冗余保护。
RAID-1(镜像):数据会被复制到所有 RAID 段中。如果 RAID 由三个段组成,那么相同的数据将存储在所有三个段中(冗余级别为 3)。RAID-1 提供了更高的可靠性,因为在某个磁盘发生故障时,可以从其他磁盘读取数据。此外,它还通过在不同磁盘之间平衡读取请求来提升读取性能。
文件段是在传递给数据库打开调用的内存设备数组中定义的。对于多文件实现,可以通过 extend 函数在运行时动态添加新的段。需要注意的是,多文件段一旦创建便无法删除。
本地语言API
请使用以下链接查看您的开发环境的详细信息:
开发语言 | 说明 |
---|---|
C / C++ | C / C++语言中的持久媒体 I/O |
Java | Java 语言中的持久媒体 I/O |
Python | Python 语言中的持久媒体 I/O |
C# | C# 语言中的持久媒体 I/O |