实现方法这一切都是通过使用一种叫做tmpfs的特殊类型文件系统实现的。在Linux中它看上去同常规的文件系统(FS)一样,只是它完全位于RAM中(除非其大小超过了RAM的大小,此时它还可以进行swap,这个非常有用!)。我的服务器中有32GB的RAM,下面让我们创建一个16GB的 tmpfs: # mkdir /ramdata # mount -t tmpfs -o size=16000M tmpfs /ramdata/ # df Filesystem 1K-blocks Used Available Use% Mounted on /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 MongoDB shell version: 2.3.2 connecting 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 root 5 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.ns drwxr-xr-x. 2 root root 40 Apr 30 15:52 _tmp 现在让我们添加一些数据,证实一下其运行完全正常。我们先创建一个1KB的document,然后将它添加到MongoDB中4百万次: > str = "" > aaa = "aaaaaaaaaa" aaaaaaaaaa > for (var i = 0; i < 100; ++i) { str += aaa; } > for (var i = 0; i < 4000000; ++i) { db.foo.insert({a: Math.random(), s: str});} > 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 } |
fbm
|
可以看出,其中的document平均大小为1136字节,数据总共占用了5GB的空间。_id之上的索引大小为130MB。现在我们需要验证一件 非常重要的事情:RAM中的数据有没有重复,是不是在MongoDB和文件系统中各保存了一份?还记得MongoDB并不会在她自己的进程内缓存任何数据,她的数据只会缓存到文件系统的缓存之中。那我们来清除一下文件系统的缓存,然后看看RAM中还有有什么数据:
# echo 3 > /proc/sys/vm/drop_caches # free total used free shared buffers cached Mem: 30689876 6292780 24397096 0 1044 5817368 -/+ buffers/cache: 474368 30215508 Swap: 0 0 0 可以看到,在已使用的6.3GB的RAM中,有5.8GB用于了文件系统的缓存(缓冲区,buffer)。为什么即使在清除所有缓存之后,系统中仍然还有5.8GB的文件系统缓存??其原因是,Linux非常聪明,她不会在tmpfs和缓存中保存重复的数据。太棒了!这就意味着,你在RAM只有一份数据。下面我们访问一下所有的document,并验证一下,RAM的使用情况不会发生变化: > db.foo.find().itcount() 4000000 # free total used free shared buffers cached Mem: 30689876 6327988 24361888 0 1324 5818012 -/+ buffers/cache: 508652 30181224 Swap: 0 0 0 # ls -l /ramdata/ total 5808780 -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 root 5 Apr 30 15:52 mongod.lock -rw-------. 1 root root 16777216 Apr 30 16:00 test.0 -rw-------. 1 root root 33554432 Apr 30 16:00 test.1 -rw-------. 1 root root 536608768 Apr 30 16:02 test.10 -rw-------. 1 root root 536608768 Apr 30 16:03 test.11 -rw-------. 1 root root 536608768 Apr 30 16:03 test.12 -rw-------. 1 root root 536608768 Apr 30 16:04 test.13 -rw-------. 1 root root 536608768 Apr 30 16:04 test.14 -rw-------. 1 root root 67108864 Apr 30 16:00 test.2 -rw-------. 1 root root 134217728 Apr 30 16:00 test.3 -rw-------. 1 root root 268435456 Apr 30 16:00 test.4 -rw-------. 1 root root 536608768 Apr 30 16:01 test.5 -rw-------. 1 root root 536608768 Apr 30 16:01 test.6 -rw-------. 1 root root 536608768 Apr 30 16:04 test.7 -rw-------. 1 root root 536608768 Apr 30 16:03 test.8 -rw-------. 1 root root 536608768 Apr 30 16:02 test.9 -rw-------. 1 root root 16777216 Apr 30 15:52 test.ns drwxr-xr-x. 2 root root 40 Apr 30 16:04 _tmp # df Filesystem 1K-blocks Used Available Use% Mounted on /dev/xvde1 5905712 4973960 871756 86% / none 15344936 0 15344936 0% /dev/shm tmpfs 16384000 5808780 10575220 36% /ramdata 果不其然! :) |
fbm
|
复制(replication)呢?
既然服务器在重启时RAM中的数据都会丢失,所以你可能会想使用复制。采用标准的副本集(replica set)就能够获得自动故障转移(failover),还能够提高数据读取能力(read capacity)。如果有服务器重启了,它就可以从同一个副本集中另外一个服务器中读取数据从而重建自己的数据(重新同步,resync)。即使在大量 数据和索引的情况下,这个过程也会足够快,因为索引操作都是在RAM中进行的 :)
有一点很重要,就是写操作会写入一个特殊的叫做oplog的collection,它位于local数据库之中。缺省情况下,它的大小是总数据量的5%。在我这种情况下,oplog会占有16GB的5%,也就是800MB的空间。在拿不准的情况下,比较安全的做法是,可以使用oplogSize这个选项为oplog选择一个固定的大小。如果备选服务器宕机时间超过了oplog的容量,它就必须要进行重新同步了。要把它的大小设置为1GB,可以这样:
oplogSize = 1000
分片(sharding)呢?
既然拥有了MongoDB所有的查询功能,那么用它来实现一个大型的服务要怎么弄?你可以随心所欲地使用分片来实现一个大型可扩展的内存数据库。配置服务器(保存着数据块分配情况)还还是用过采用基于磁盘的方案,因为这些服务器的活动数量不大,老从头重建集群可不好玩。
注意事项
RAM属稀缺资源,而且在这种情况下你一定想让整个数据集都能放到RAM中。尽管tmpfs具有借助于磁盘交换(swapping)的能力,但其性能下降将非常显著。为了充分利用RAM,你应该考虑:
- 使用usePowerOf2Sizes选项对存储bucket进行规范化
- 定期运行compact命令或者对节点进行重新同步(resync)
- schema的设计要相当规范化(以避免出现大量比较大的document)
相关推荐
在Linux系统中,`tmpfs`是一种基于内存的文件系统,它不依赖于传统的非易失性存储介质来存储文件数据,而是完全存在于由操作系统内核维护的虚拟内存中。`tmpfs`的设计初衷是为了提高性能,使临时文件能够快速创建、...
- 文件系统:包括多种类型的文件系统,如/tmpfs、/dev/sda1等,其中特别提到针对MongoDB集群进行了TCP连接优化。 3. **权限管理** - 为了确保安全性和性能,通过iptables规则限制了MongoDB集群的访问来源,仅允许...
tmpfs 是 Linux/Unix 系统上的一种基于内存的文件系统,即 tmpfs 使用内存或 swap 分区来存储文件。 Linux 内核中的 VM 子系统负责在后台管理虚拟内存资源 Virtual Memory,即 RAM 和 swap 资源,透明地将 RAM 页...
### 使用tmpfs文件系统提升Linux系统的性能 #### 一、tmpfs与虚拟内存(VM) 在深入了解tmpfs之前,我们先来简要回顾一下Linux中的虚拟内存(VM)概念。虚拟内存是操作系统用来管理内存资源的一种机制,它可以分为RAM...
tmpfs是Linux/Unix系统上的一种基于内存的文件系统。tmpfs可以使用您的内存或swap分区来存储文件。由此可见,tmpfs主要存储 暂存的文件。 优势 : 1、 动态文件系统的大小。 2、tmpfs 的另一个主要的好处...
尽管 MongoDB 提供了内置的认证机制,但考虑到性能问题,该文档推荐使用 iptables 来限制访问来源,仅允许指定的 web 服务器和 MySQL 服务器访问 MongoDB 集群的 27001 端口。这种方式虽然牺牲了一定的安全性,但在...
【将MongoDB作为Redis式的内存数据库的使用方法】 在IT领域,数据库的选择通常是根据应用场景来决定的。MongoDB,作为一个强大的文档型数据库,通常用于处理结构化和半结构化的数据,而Redis则以其高效的内存存储...
标题所提及的“使用Python设置tmpfs来加速项目的教程”实际上是一种利用Linux系统中的tmpfs技术来优化项目执行效率的方法。tmpfs是一种特殊的文件系统,它将文件存储在系统的RAM(随机存取内存)中,而不是传统的...
tmpfs mounts则提供了一种临时性的、基于内存的数据存储方式。它不涉及宿主机的磁盘,而是将挂载点映射到宿主机的内存中,因此,数据的读写速度非常快。然而,由于数据只存在于内存,当容器停止或重启时,所有数据都...
由于内存数据在断电后会丢失,论文提出了基于tmpfs和initrd的技术方案来解决这个问题。tmpfs提供了临时文件系统,而initrd(Initial RAM Disk)用于在系统启动时挂载根文件系统,这样可以在内存中构建一个完整的...
Linux磁盘扩容 df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 197G 2.3G 195G 2% / devtmpfs 7.8G 0 7.8G 0% /dev tmpfs 7.8G 0 7.8G 0% /dev/shm ...tmpfs 1.6G 0 1.6G 0% /run/user/0
tmpfs是一种基于内存的文件系统,它允许我们将部分网站内容存储在内存中,从而显著加快读取速度,因为内存的访问速度远高于硬盘。本文将详细介绍如何在Linux下将网站放入内存中以提升其性能,并探讨相关的注意事项。...
tmpfs-sync的动机是将硬盘写入操作的次数减少到最低,以增加 SSD 驱动器的潜在使用寿命。 tmpfs-sync在每个目录的基础上运行。 在访问目录之前(例如在引导期间),将执行以下操作: 在 tmpfs-mount(例如 /dev/...
好了,您已经安装了“ chroot”,并且想要保存系统状态以备将来使用,因此运行: # booty export linux-chroot/ > vanilla-system-state.img 然后,当您想从此linux-chroot /设置另一个系统时,运行: # booty ...
tmpfs Ansible角色,用于配置tmpfs文件系统。要求没有任何。角色变量许多。 参见defaults / main.yml依存关系没有任何。将此角色作为子模块安装在git存储库中git submodule add ...