The WiredTiger journal persists all data modifications between checkpoints. If MongoDB exits between checkpoints, it uses the journal to replay all data modified since the last checkpoint.
3,内存使用
3.1 WiredTiger 利用系统内存资源缓存两部分数据:
内部缓存(Internal Cache)
文件系统缓存(Filesystem Cache)
从MongoDB 3.2 版本开始,WiredTiger内部缓存的使用量,默认值是:1GB 或 60% of RAM - 1GB,取两值中的较大值;文件系统缓存的使用量不固定,MongoDB自动使用系统空闲的内存,这些内存不被WiredTiger缓存和其他进程使用,数据在文件系统缓存中是压缩存储的。
3.2 调整WiredTiger内部缓存的大小
使用 mongod的参数 来修改MongoDB实例中WiredTiger内部缓存的大小,计算内部缓存大小的公式是:
Starting in MongoDB 3.2, the WiredTiger internal cache, by default, will use the larger of either: 60% of RAM minus 1 GB, or 1 GB.
For systems with up to 10 GB of RAM, the new default setting is less than or equal to the 3.0 default setting
For systems with more than 10 GB of RAM, the new default setting is greater than the 3.0 setting.
4,数据压缩(Data Compression)
WiredTiger压缩存储集合(Collection)和索引(Index),压缩减少Disk空间消耗,但是消耗额外的CPU执行数据压缩和解压缩的操作。
默认情况下,WiredTiger使用块压缩(Block Compression)算法来压缩Collections,使用前缀压缩(Prefix Compression)算法来压缩Indexes,Journal日志文件也是压缩存储的。对于大多数工作负载(Workload),默认的压缩设置能够均衡(Balance)数据存储的效率和处理数据的需求,即压缩和解压的处理速度是非常高的。
5,Disk空间回收
当从MongoDB中删除文档(Documents)或集合(Collections)后,MongoDB不会将Disk空间释放给OS,MongoDB在数据文件(Data Files)中维护Empty Records的列表。当重新插入数据后,MongoDB从Empty Records列表中分配存储空间给新的Document,因此,不需要重新开辟空间。为了更新有效的重用Disk空间,必须重新整理数据碎片。
WiredTiger使用compact 命令,移除集合(Collection)中数据和索引的碎片,并将unused的空间释放,调用语法:
db.runCommand ( { compact: '<collection>' } )
在执行compact命令时,MongoDB会对当前的database加锁,阻塞其他操作。在compact命令执行完成之后,mongod会重建集合的所有索引。
On WiredTiger, compact will rewrite the collection and indexes to minimize disk space by releasing unused disk space to the operating system. This is useful if you have removed a large amount of data from the collection, and do not plan to replace it.
二,In-Memory 存储引擎将数据存储到内存(Memory)
In-Memory存储引擎将数据存储在内存中,除了少量的元数据和诊断(Diagnostic)日志,In-Memory存储引擎不会维护任何存储在硬盘上的数据(On-Disk Data),避免Disk的IO操作,减少数据查询的延迟。
1,指定In-Memory存储引擎
mongod --storageEngine inMemory --dbpath <path>
在选择In-Memory存储引擎时,需要指定两个参数:
设置mongod参数: ,设置参数的值是 inMemory;
设置mongod参数: --dbpath ,设置参数的值是数据存储的目录;
使用Disk存储元数据,诊断数据和临时数据:虽然 In-Memory 存储引擎不会向文件系统写入数据,但是它需要使用 --dbpath 维护少量的元数据和诊断(Diagnostic )日志,在创建Large Index时,使用Disk存储临时数据;Although the in-memory storage engine does not write data to the filesystem, it maintains in the --dbpath small metadata files and diagnostic data as well temporary files for building large indexes.
2,文档级别的并发(document-level concurrency)
In-Memory存储引擎在执行写操作时,使用文件级别的并发控制,就是说,在同一时间,多个写操作能够同时修改同一个集合中的不同文档;当多个写操作修改同一个文档时,必须以序列化方式执行;这意味着,如果该文档正在被修改,其他写操作必须等待。
3,内存使用
In-Mmeory 存储引擎需要将Data,Index,Oplog等存储到内存中,通过mongod参数: 设置占用的内存数量,默认值是:50% of RAM-1GB。指定In-Memory 存储引擎使用的内存数据量,单位是GB:
mongod --storageEngine inMemory --dbpath <path> --inMemorySizeGB <newSize>
4,持久化(Durable)