您好,欢迎访问一九零五行业门户网

把 MongoDB 当成是纯内存数据库来使用(Redis 风格)

mongodb有一个非常酷的设计决策,就是她可以使用内存影射文件(memory-mapped file)来处理对磁盘文件中数据的读写请求。这也就是
基本思想
将mongodb用作内存数据库(in-memory database),也即,根本就不让mongodb把数据保存到磁盘中的这种用法,引起了越来越多的人的兴趣。这种用法对于以下应用场合来讲,,超实用:
如果这一切可以实现就真是太优雅了:我们就能够巧妙地在不涉及磁盘操作的情况下利用mongodb的查询/检索功能。可能你也知道,在99%的情况下,磁盘io(特别是随机io)是系统的瓶颈,而且,如果你要写入数据的话,磁盘操作是无法避免的。
mongodb有一个非常酷的设计决策,就是她可以使用内存影射文件(memory-mapped file)来处理对磁盘文件中数据的读写请求。这也就是说,mongodb并不对ram和磁盘这两者进行区别对待,只是将文件看作一个巨大的数组,然后按照字节为单位访问其中的数据,剩下的都交由操作系统(os)去处理!就是这个设计决策,才使得mongodb可以无需任何修改就能够运行于ram之中。
实现方法 
这一切都是通过使用一种叫做tmpfs的特殊类型文件系统实现的。在linux中它看上去同常规的文件系统(fs)一样,只是它完全位于ram中(除非其大小超过了ram的大小,此时它还可以进行swap,这个非常有用!)。我的服务器中有32gb的ram,下面让我们创建一个16gb的 tmpfs:
# mkdir /ramdata# mount -t tmpfs -o size=16000m tmpfs /ramdata/# dffilesystem1k-blocksused available use% mounted on/dev/xvde15905712 4973924 871792 86% /none153449360 15344936 0% /dev/shmtmpfs163840000 16384000 0% /ramdata 
接下来要用适当的设置启动mongodb。为了减小浪费的ram数量,应该把smallfiles和noprealloc设置为true。既然现在是基于ram的,这么做完全不会降低性能。此时再使用journal就毫无意义了,所以应该把nojournal设置为true。
dbpath=/ramdatanojournal = truesmallfiles = truenoprealloc = true 
mongodb启动之后,你会发现她运行得非常好,文件系统中的文件也正如期待的那样出现了:
# mongomongodb shell version: 2.3.2connecting to: test> db.test.insert({a:1})> db.test.find(){ _id : objectid(51802115eafa5d80b5d2c145), a : 1 }# ls -l /ramdata/total 65684-rw-------. 1 root root 16777216 apr 30 15:52 local.0-rw-------. 1 root root 16777216 apr 30 15:52 local.ns-rwxr-xr-x. 1 root root5 apr 30 15:52 mongod.lock-rw-------. 1 root root 16777216 apr 30 15:52 test.0-rw-------. 1 root root 16777216 apr 30 15:52 test.nsdrwxr-xr-x. 2 root root40 apr 30 15:52 _tmp 
现在让我们添加一些数据,证实一下其运行完全正常。 now let’s add some data and make sure it behaves properly. 我们先创建一个1kb的document,然后将它添加到mongodb中4百万次:
> str = > aaa = aaaaaaaaaaaaaaaaaaaa> for (var i = 0; i for (var i = 0; i db.foo.stats(){ns : test.foo,count : 4000000,size : 4544000160,avgobjsize : 1136.00004,storagesize : 5030768544,numextents : 26,nindexes : 1,lastextentsize : 536600560,paddingfactor : 1,systemflags : 1,userflags : 0,totalindexsize : 129794000,indexsizes : {_id_ : 129794000},ok : 1}
其它类似信息

推荐信息