数据库服务器与嵌入式数据库:架构及 I/O 特性比较

数据库服务器
数据库服务器是指作为独立的服务器进程运行、并通过网络处理应用程序请求的数据库。MySQL、PostgreSQL、Oracle DB 等我们熟悉的大多数 RDBMS 都属于这一模型。数据库服务器具有以下优点。
- 集中管理:数据集中统一管理,便于保证一致性、安全性以及备份与恢复。
- 资源独立性:分配有独立的 CPU、内存和存储,不受应用程序状态影响,能够保证稳定的性能。
- 高并发性与可扩展性:针对大量用户的同时访问进行了优化,并且通过集群或复制实现水平扩展相对容易。
得益于这些特性,数据库服务器在过去数十年间已成为软件基础设施的标准。然而,随着技术发展和环境变化,数据库服务器的缺点在部分环境中开始显现,作为其替代方案,嵌入式数据库重新受到关注。
新趋势:嵌入式数据库
嵌入式数据库是无需单独的服务器进程,而是以库的形式包含在应用程序中,并在同一进程内运行的数据库引擎。SQLite、LevelDB、RocksDB 等是典型的嵌入式数据库。嵌入式数据库在最新技术环境中成为强有力替代方案的背景如下。
SSD 的出现
在过去以 HDD 为主的系统环境中,随机访问性能相较于顺序读写性能有明显下降。因此,尽量减少磁盘 I/O 并最大化内存缓存是性能优化的核心。数据库服务器为此运行大规模缓存,并通过合并写操作进行处理,从而克服了 HDD 的物理限制。
然而,SSD 的出现彻底改变了这一前提。与 HDD 相比,SSD 的随机 I/O 性能快数千倍以上,延迟也显著缩短。因此,"磁盘 I/O 是最大瓶颈"这一既有认识已不复存在,反而通过网络访问远程数据库服务器所产生的延迟开始凸显为新的瓶颈。
MSA 与数据独立性
过去,由一个庞大的单体应用程序依赖于一个集中式数据库的结构较为普遍。这种方式虽然简单,但随着服务规模扩大,数据模式变更变得困难,所有服务共享同一数据库导致耦合度过度增强,存在诸多问题。
在现代微服务架构中,为解决这些问题,"Database per Service"原则受到重视。每个服务拥有并封装自己的专用数据存储,从而保证服务之间的独立性,并使故障隔离和扩展变得更加容易。在此过程中,嵌入式数据库成为服务单位数据存储的理想选择。它轻量、快速,并可与服务代码一同部署,因此与 MSA 环境非常契合。
具体而言,在 Kubernetes 环境中,通过边车(Sidecar)模式将嵌入式数据库部署在应用容器旁边,以优化本地数据处理的方式被广泛采用。这能够减少网络瓶颈,并将数据访问延迟降至最低。
简化运维环境
数据库服务器需要安装、补丁、备份、故障恢复、复制、性能监控等复杂的运维流程,为此必须配备专职 DBA 和专业运维人员。特别是在大规模环境中,这种管理负担非常沉重。
嵌入式数据库在很大程度上缓解了这些问题。当数据库集成到应用程序内部时,单元测试、构建、版本管理和部署可以一并进行,因此无需单独的服务器运维。此外,当应用程序进行横向扩展(Scale-out)时,嵌入式数据库也随之扩展,并且可以通过 DevOps 文化和 CI/CD 流水线实现自动化管理。尤其是在初创企业、小型服务和原型开发环境中,嵌入式数据库能够显著降低运维复杂度,并大幅提高开发与部署速度。
高性能系统语言与生态系统的发展
过去,数据库与应用程序通常使用不同的语言编写。例如,要求高性能的数据库引擎主要使用 C、C++ 编写,而应用程序则使用 Java、Python、PHP 等语言开发。这种方式在性能优化方面十分有效,但存在内存安全问题、复杂的并发处理、延迟以及库集成和部署困难等局限。
然而,近来 Go 和 Rust 等现代系统编程语言的兴起,使这些局限得到了极大缓解。特别是 Go 既适用于高性能应用程序,也适用于数据库引擎等底层程序的编写,使数据库与应用程序能够在同一语言生态系统中共同开发。
事实上,在 Golang 中,BadgerDB、PebbleDB 等高性能嵌入式数据库正被广泛使用。这意味着嵌入式数据库已不仅仅是数据库服务器的轻量替代品,而是在自身具备竞争力的重要选择之一。
结论
在需要大规模数据集中管理、复杂事务和高并发的条件下,数据库服务器仍然是最强大的解决方案。但在 MSA 环境中的独立服务、IoT 边缘设备、快速原型开发以及重视运维效率的项目中,嵌入式数据库可能成为更加高效和合理的选择。归根结底,重要的是选择最符合具体情况和需求的最优工具,而嵌入式数据库的发展为我们提供了更加广阔和多样的选择。