前阵子有朋友和我讨论把PG数据库改造成内存数据库的可行性。在讨论中发现,实际上内存数据库并不是简单的把一个传统的RDBMS放入内存中,并通过WAL日志和CHECKPOINT来持久化数据那么简单。实际上最初的内存数据库的目的是提供超低延时的应用支持,因此与传统的RDBMS相比,内存数据库需要在各个环节都尽可能简化,从而达到其最初的设计目标。在这种情况下,尽可能地减少各个环节的延时,甚至节约几条指令都是十分必要的。我们可以考虑一下,现在最为流行的内存数据库-Redis(一种KV的内存数据库),一般一条指令的执行时间是几十个微妙,而如果访问REDIS服务器的延时是1毫秒左右,那么其访问的总体性能不在于命令的执行,而是网络,因此高并发高性能的Redis应用的优化往往重点在网络上。
从PG数据库来看,这是一种典型的通用交易型RDBMS,从其特征上看,直接改造成纯粹的内存数据库,从数据库架构上来看,是十分困难的。不过随着非易失性内存内存技术的发展,另外一条将传统数据库改造成内存数据库的路子又显现出来了。在几年前和INTEL技术团队的交流中,非易失性内存内存、傲腾、AEP技术给我们带来了新的启示。如果利用AEP技术搭建一台能够提供数个TB或者数十个TB非易失性内存内存的服务器,就基本上能够满足大多数传统数据库应用的需求了。这样的话,把整个数据库放入非易失性内存内存,就可以让PG数据库成为访问性能与物理内存同一数量级的IO延时的准内存数据库了。
实际上把PG数据库改造成一个准内存数据库并不是那么简单,还涉及到如何将内存映射为一个文件