MongoDB的使用作为一个内存数据库Redis型

MongoDB的使用作为一个内存数据库Redis型
基本思想

mondb作为内存数据库,也就是说,MonDB不是用来保存数据到磁盘。它已经引起了越来越多人的兴趣,这种用法对下面的应用非常实用。

在慢速RDBMS系统之前编写操作密集的缓存
嵌入式系统
不需要持久化数据的pci兼容系统
单元测试需要轻量级数据库,库中的数据可以很容易地删除
如果这一切都可以做,它是如此优雅,我们可以巧妙地利用mondb查询/检索功能不涉及磁盘操作。你可能知道,在99%的情况下,磁盘IO(特别是随机IO)是系统的瓶颈,如果你想写数据,磁盘操作是不可避免的。

mondb有一个非常酷的设计决策,,她可以使用内存映射文件处理请求和磁盘文件读写数据。也就是说,MonDB没有区分RAM和磁盘之间。它把文件作为一个巨大的阵列,然后访问数据的字节,而其余的是由操作系统处理(OS),这是设计的决定,允许mondb到RAM中运行没有任何修饰。

实现方法

所有的这一切都是通过使用一种特殊类型的文件系统称为tmpfs实现。在Linux,它看起来像普通的文件系统一样(FS),但它是完全位于RAM(除非其尺寸大于内存大小也进行互换,这是非常有用的。我的服务器有一个内存,32GB,让我们创建一个tmpfs 16GB:

复制代码如下:# mkdir / ramdata

安装-t tmpfs -o大小= 16000m tmpfs # / / ramdata

# DF

用可使用安装在文件系统的1K的块

/ dev / xvde1 87179286% / 59057124973924

153449360153449360%

163840000163840000% / ramdata tmpfs

接下来,MonDB开始与适当的设置,以减少浪费的内存量,并noprealloc小文件应设置为true。现在,它是基于RAM,这并不降低性能完全,此时使用日志是没有意义的,所以nojournal应设置为true。

复制代码代码如下:独立= / ramdata

nojournal =真

小文件=真

noprealloc =真

When MonDB starts, you'll find that she's running very well, and the files in the file system appear as expected.

复制代码如下:# Mon

mondb壳版本:2.3.2

连接到:测试

> > db.test.insert({ 1 }:)

> > db.test.find()

{_id :ObjectId(51802115eafa5d80b5d2c145 ,):1 }

# LS L / / ramdata

总65684

- RW -------。1根16777216 4月30日15:52 0局部。

- RW -------。1根16777216 4月30日local.ns 15:52

- rwxr-xr-x. 1根4月30日5 mond.lock 15:52

- RW -------。1根16777216 4月30日15:52 0测试。

- RW -------。1根16777216 4月30日test.ns 15:52

drwxr-xr-x. 2根4月30日40 _tmp 15:52

现在让我们添加一些数据验证操作是完全正常的。我们创建一个1KB的文件,然后添加到mondb 400万倍:

复制代码代码如下:>

> > AAA =aaaaaaaaaa

aaaaaaaaaa

>(var i = 0;i < 100;+ i)

> >为(var i = 0;i < 4000000;+ +我){ db.foo.insert({一:Math.random(),S:STR })};}

> > db.foo.stats()

{

ns:测试

计数:4000000,

大小:4544000160,

avbjsize :1136.00004,

storagesize :5030768544,

numextents :26,

nindexes :1,

lastextentsize :536600560,

paddingfactor :1,

systemflags :1,

userflags :0,

totalindexsize :129794000,

indexsizes :{

_id_ :129794000

},

OK:1

}
你可以看到,这个文件的平均大小为1136字节,和数据占用的总空间5GB。上_id索引大小是130mb。现在我们需要验证一个很重要的事情:是在RAM中重复数据,是保存在mondb和文件系统记住,mondb不在她自己的过程缓存任何数据,和她的数据只会被缓存在文件系统缓存,让我们明确了文件系统的缓存,看看有在RAM。

复制代码如下:#回声3 > / proc / / / drop_caches VM系统

#自由

全部使用的空闲共享缓冲区缓存

Mem:306898766292780 2439709601044 5817368

缓冲区/缓存: + 47436830215508

互换:000

你可以看到,在6.3gb用RAM的5.8gb用于缓存文件系统(缓冲区,缓冲区)。为什么,即使所有的缓存被清空,系统中还存在5.8gb的文件系统缓存原因是Linux很聪明,她不会将重复的数据在TMPFS和缓存,这是伟大的!这意味着RAM中只有一个数据副本。现在让我们访问所有文档,并验证RAM的使用不会改变:

复制代码代码如下:> db.foo.find()Itcount()。

四百万

#自由

全部使用的空闲共享缓冲区缓存

Mem:306898766327988 2436188801324 5818012

缓冲区/缓存: + 50865230181224

互换:000

# LS L / / ramdata

总5808780

- RW -------。1根16777216 4月30日15:52 0局部。

- RW -------。1根16777216 4月30日local.ns 15:52

- rwxr-xr-x. 1根4月30日5 mond.lock 15:52

- RW -------。1根16777216 4月30日16:00测试0。

- RW -------。1根33554432 4月30日16:00测试1。

- RW -------。1根536608768 4月30日16:02检验

- RW -------。1根536608768 test.11 4月30日16:03

- RW -------。1根536608768 test.12 4月30日16:03

- RW -------。1根536608768 4月30日test.13 16:04

- RW -------。1根536608768 4月30日14 16:04

- RW -------。1根67108864 4月30日16:00测试2。

- RW -------。1根134217728 4月30日测试。16:00 3。

- RW -------。1根268435456 4月30日16:00测试4。

- RW -------。1根536608768 4月30日16:01 5测试。

- RW -------。1根536608768 4月30日16:01 6测试。

- RW -------。1根536608768 4月30日16:04 7测试。

- RW -------。1根536608768 4月30日16:03 8测试。

- RW -------。1根536608768 4月30日16:02 9测试。

- RW -------。1根16777216 4月30日test.ns 15:52

drwxr-xr-x. 2根4月30日40 _tmp 16:04

# DF

用可使用安装在文件系统的1K的块

/ dev / xvde1 87175686% / 59057124973960

153449360153449360%

tmpfs 163840005808780 1057522036% / ramdata

事实上 uff01:)

复制呢

由于服务器重新启动时,在RAM中的数据将丢失,所以你可能想使用复制。自动故障转移(failover)可以通过使用标准的副本集(副本),也可以提高数据的阅读能力(阅读能力)。如果服务器重新启动时,它可以读取数据从另一个服务器在同一个副本集,以重建自己的数据(再同步,同步)。即使是在大量的数据和指标的情况下,这个过程会足够快,因为指数运行在内存:)

那写操作将被写入到一个特殊的集合称为oplog是很重要的,这是位于本地数据库。默认情况下,它是5%的总数据量。以我为例,oplog占用5%的16GB,800MB的空间。在不确定的情况下,它是用的oplogsize选项选择一个固定大小的oplog安全。如果选择服务器停机时间超过oplog能力,它必须重新同步,设置其大小为1GB,你可以这样做:

复制代码如下:oplogsize = 1000

关于分片

Now that you have all the query capabilities of MonDB, how do you want to use it to implement a large service您可以随时使用片来实现大型的可扩展内存数据库。配置服务器(保存数据块分配)也已用于基于磁盘的程序中,因为这些服务器的活动数量不多。从头开始重建旧的集群是不好玩的。

注意事项

RAM是一种稀缺资源,在这种情况下,你必须要将放置在RAM中的数据。虽然tmpfs已利用磁盘交换能力(交换),其性能的下降将是非常重要的。为了充分利用内存,你应该考虑:

使用usepowerof2sizes选项规范存储桶
运行压缩命令定期或重新同步节点(同步)
模式的设计应该相当标准化(避免大量的较大文档)。
结论

宝贝,你现在可以使用mondb作为内存数据库,你也可以用她所有的功能!性能应该是相当惊人的:在单线程/核心的情况下测试我,可以达到20k写入速度每秒,和芯数多少次将再次提高。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部