基本思想
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写入
速度每秒,和芯数多少次将再次提高。