将MongoDB作为Redis式的内存数据库的使用方法
基本思想
将MongoDB用作内存数据库(in-memorydatabase),也即,根本就不让MongoDB把数据保存到磁盘中的这种用法,引起了越来越多的人的兴趣。这种用法对于以下应用场合来讲,超实用:
- 置于慢速RDBMS系统之前的写操作密集型高速缓存
- 嵌入式系统
- 无需持久化数据的PCI兼容系统
- 需要轻量级数据库而且库中数据可以很容易清除掉的单元测试(unittesting)
如果这一切可以实现就真是太优雅了:我们就能够巧妙地在不涉及磁盘操作的情况下利用MongoDB的查询/检索功能。可能你也知道,在99%的情况下,磁盘IO(特别是随机IO)是系统的瓶颈,而且,如果你要写入数据的话,磁盘操作是无法避免的。
MongoDB有一个非常酷的设计决策,就是她可以使用内存影射文件(memory-mappedfile)来处理对磁盘文件中数据的读写请求。这也就是说,MongoDB并不对RAM和磁盘这两者进行区别对待,只是将文件看作一个巨大的数组,然后按照字节为单位访问其中的数据,剩下的都交由操作系统(OS)去处理!就是这个设计决策,才使得MongoDB可以无需任何修改就能够运行于RAM之中。
实现方法
这一切都是通过使用一种叫做tmpfs的特殊类型文件系统实现的。在Linux中它看上去同常规的文件系统(FS)一样,只是它完全位于RAM中(除非其大小超过了RAM的大小,此时它还可以进行swap,这个非常有用!)。我的服务器中有32GB的RAM,下面让我们创建一个16GB的tmpfs:
#mkdir/ramdata #mount-ttmpfs-osize=16000Mtmpfs/ramdata/ #df Filesystem 1K-blocks UsedAvailableUse%Mountedon /dev/xvde1 5905712 4973924 871792 86%/ none 15344936 0 15344936 0%/dev/shm tmpfs 16384000 0 16384000 0%/ramdata
接下来要用适当的设置启动MongoDB。为了减小浪费的RAM数量,应该把smallfiles和noprealloc设置为true。既然现在是基于RAM的,这么做完全不会降低性能。此时再使用journal就毫无意义了,所以应该把nojournal设置为true。
dbpath=/ramdata nojournal=true smallFiles=true noprealloc=true
MongoDB启动之后,你会发现她运行得非常好,文件系统中的文件也正如期待的那样出现了:
#mongo MongoDBshellversion:2.3.2 connectingto:test >db.test.insert({a:1}) >db.test.find() {"_id":ObjectId("51802115eafa5d80b5d2c145"),"a":1}
#ls-l/ramdata/ total65684 -rw-------.1rootroot16777216Apr3015:52local.0 -rw-------.1rootroot16777216Apr3015:52local.ns -rwxr-xr-x.1rootroot 5Apr3015:52mongod.lock -rw-------.1rootroot16777216Apr3015:52test.0 -rw-------.1rootroot16777216Apr3015:52test.ns drwxr-xr-x.2rootroot 40Apr3015:52_tmp