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