由于In-Memory 存储引擎不会持久化存储数据,只将数据存储在内存中,读写操作直接在内存中完成,不会将数据写入到Disk文件中,因此,不需要单独的日志文件,不存在记录日志和等待数据持久化的问题,当MongoDB实例关机或系统异常终止时,所有存储在内存中的数据都将会丢失。
5,记录oplog
In-Memory 存储引擎不会将数据更新写入到Disk,但是会记录oplog,该oplog是存储在内存中的集合,MongoDB通过Replication将Primary成员的oplog推送给同一副本集的其他成员。如果一个MongoDB实例是Replica Set的Primary成员,该实例使用In-Memory存储引擎,通过Replication将oplog推送到其他成员,在其他成员中重做oplog中记录的操作,这样,就能将在Primary成员中执行的数据修改持久化存储。
You can deploy instances that use in-memory storage engine as part of a replica set. For example, as part of a three-member replica set, you could have:
With this deployment model, only the instances running with the in-memory storange engine can become the primary. Clients connect only to the in-memory storage engine instances. Even if both instances running in-memory storage engine crash and restart, they can sync from the member running WiredTiger. The hidden instance running with WiredTiger persists the data to disk, including the user data, indexes, and replication configuration information.
三,记录日志
数据是MongoDB的核心,MongoDB必须保证数据的安全,不能丢失,Journal 是顺序写入的日志文件,用于记录上一个Checkpoint之后发生的数据更新,能够将数据库从系统异常终止事件中还原到一个有效的状态。MongoDB使用预写日志机制实现数据的持久化:WiredTiger 存储引擎在执行写操作时,先将数据更新写入到Journal文件。Journal Files是存储在硬盘的日志文件,每个Journal File大约是100MB,存储在--dbpath下的Journal子目录中,在执行Checkpoint操作,将数据的更新同步到数据文件。
每隔一定的时间间隔,WiredTiger 存储引擎都会执行Checkpoint操作,将缓存的数据更新日志同步到硬盘上的数据文件中(On-Disk Files),在默认情况下,MongoDB启用日志记录,也可以显式启用,只需要在启动mongod 时使用--journal 参数:
mongod --journal
1,使用Journal日志文件还原的过程
WiredTiger创建Checkpoint,能够将MongoDB数据库还原到上一个CheckPoint创建时的一致性状态,如果MongoDB在上一个Checkpoint之后异常终止,必须使用Journal日志文件,重做从上一个Checkpoint之后发生的数据更新操作,将数据还原到Journal记录的一致性状态,使用Journal日志还原的过程是:
获取上一个Checkpoint创建的标识值:从数据文件(Data Files)中查找上一个Checkpoint发生的标识值(Identifier);
根据标识值匹配日志记录:从Journal Files 中搜索日志记录(Record),查找匹配上一个Checkpoint的标识值的日志记录;
重做日志记录:重做从上一个Checkpoint之后,记录在Journal Files中的所有日志记录;
2,缓存日志MongoDB配置WiredTiger使用内存缓冲区来存储Journal Records,所有没有达到128KB的Journal Records都会被缓存在缓冲区中,直到大小超过128KB。在执行写操作时,WiredTiger将Journal Records存储在缓冲区中,如果MongoDB异常关机,存储在内存中的Journal Records将丢失,这意味着,WiredTiger将丢失最大128KB的数据更新。
WiredTiger syncs the buffered journal records to disk according to the following intervals or conditions:
New in version 3.2: Every 50 milliseconds.
MongoDB sets checkpoints to occur in WiredTiger on user data at an interval of 60 seconds or when 2 GB of journal data has been written, whichever occurs first.
If the write operation includes a write concern of , WiredTiger forces a sync of the WiredTiger journal files.
Because MongoDB uses a journal file size limit of 100 MB, WiredTiger creates a new journal file approximately every 100 MB of data. When WiredTiger creates a new journal file, WiredTiger syncs the previous journal file.
3,日志文件(Journal Files)
关于Journal文件,MongoDB在 --dbpath 目录下创建 journal子目录,WiredTiger将Journal 文件存储在该目录下,每一个Journal文件大约是100M,命名格式是:WiredTigerLog.<sequence>,sequence是一个左边填充0的10位数字,从0000000001开始,依次递增。
对于WiredTiger存储引擎,Journal 文件具有以下特性:
标识日志记录:Journal文件的每一个日志记录(Record)代表一个写操作;每一个记录都有一个ID,用于唯一标识该记录;
压缩Journal文件:WiredTiger会压缩存储在Journal文件中的数据;
Journal文件大小的上限:每一个Journal文件大小的上限大约是100MB,一旦文件超过该限制,WiredTiger创建一个新的Journal文件;
自动移除Journal文件:WiredTiger自动移除老的Journal文件,只维护从上一个Checkpoint还原时必需的Journal文件;
预先分配Journal文件:WiredTiger预先分配Journal文件;
4,在异常宕机后恢复数据
在MongoDB实例异常宕机后,重启mongod实例,MongoDB自动重做(redo)所有的Journal Files,在还原Journal Files期间,MongoDB数据库是无法访问的。
四,mongod 跟存储引擎相关的参数
1,使用WiredTiger的参数设置