Mongodb日志有三种Journaling日志、oplog日志、log日志,有着不同的区别。
Journaling日志
为了在发生故障时提供持久性,MongoDB对磁盘上的日志文件使用提前写日志。WiredTiger使用检查点提供磁盘上数据的一致视图,并允许MongoDB从上次检查点恢复。但是,如果MongoDB在检查点之间意外退出,则需要记录日志以恢复上次检查点之后发生的信息。
注意:从MongoDB 4.0开始,你不能为使用WiredTiger存储引擎的副本集成员指定——nojournal选项或storage.journal.enabled: false。
有了日志,恢复过程在数据文件中查找最后一个检查点的标识符。在日志文件中搜索与最后一个检查点的标识符匹配的记录。应用上次检查点以来的日志文件中的操作。在3.2版更改。使用日志记录,WiredTiger为每个客户端发起的写操作创建一个日志记录。日志记录包括由初始写引起的所有内部写操作。例如,对集合中的文档的更新可能会导致索引的修改;WiredTiger创建一个日志记录,其中包括更新操作和相关的索引修改。 MongoDB配置WiredTiger使用内存缓冲来存储日志记录。线程协调分配和复制到它们的缓冲区部分。128 kB以内的所有日志记录都被缓冲。
mongod进程在日志操作之间允许的最大间隔时间(以毫秒为单位)。取值范围是1 ~ 500毫秒。较低的值会增加日志的持久性,但会牺牲磁盘性能。影响同步频率的详细信息或其他条件,请参见日志记录进程。storage.journal.commitIntervalMs此设置仅适用于mongod,对于使用 in-memory存储引擎的mongod实例不可用。 在写操作之间,虽然日志记录保留在WiredTiger缓冲区中,但在mongod硬关闭后可能会丢失更新。
在WiredTiger上,默认的日志提交间隔是100毫秒,WiredTiger将缓存的日志记录同步到磁盘 当设置j:true时,写操作将导致立即同步到日志文件中 Journal文件大小限制:MongoDB的WiredTiger日志文件的最大大小限制约为100 MB。
当WiredTiger创建一个新的日志文件时。由于MongoDB使用的日志文件大小限制为100 MB,因此WiredTiger大约每100 MB的数据创建一个新的日志文件。一旦文件超过这个限制,WiredTiger就会创建一个新的日志文件。WiredTiger自动删除旧的日志文件,只维护从上次检查点恢复所需的文件。WiredTiger采用预分配日志文件的方式。
Journaling 在In-Memory存储引擎的使用
从MongoDB企业版3.2.6开始,内存存储引擎是通用可用性(GA)的一部分。因为它的数据保存在内存中,所以没有单独的日志。写关注点为j: true的写操作会立即被确认。如果副本集的任何投票成员使用内存存储引擎,则必须将writeConcernMajorityJournalDefault设置为false。 从4.2(以及4.0.13和3.6.14)开始,如果副本集成员使用内存存储引擎(投票或非投票),但副本集的writeConcernMajorityJournalDefault设置为true,则副本集成员记录一个启动警告。
当writeConcernMajorityJournalDefault设置为false时,MongoDB在确认写操作之前不会等待w: "majority"写入磁盘日志。因此,在给定副本集中的大多数节点发生短暂丢失(例如崩溃和重新启动)的情况下,“多数”写操作可能会回滚。
oplog日志
Mongodb的oplog类似mysql的binlog记录数据库的增删改查操作,从节点将日志重放的操作。 工作原理:在副本集中Secondary节点首先异步复制Primary节点中的Oplog操作日志,然后Secondary节点提取oplog日志中的具体操作,再将这些操作在Secondary节点执行一遍,主要用于副本集成员的数据同步。
mongodb的oplog日志记录在local数据库的oplog.rs集合中
rs02:PRIMARY> use local
switched to db local
rs02:PRIMARY> show tables;
oplog.rs
replset.election
replset.minvalid
replset.oplogTruncateAfterPoint
startup_log
system.replset
system.rollback.id
rs02:PRIMARY> db.oplog.rs.find({"ns": "test_jia.tab4"})
{ "ts" : Timestamp(1684223059, 2), "t" : NumberLong(5), "h" : NumberLong(0), "v" : 2, "op" : "i", "ns" : "test_jia.tab4", "ui" : UUID("8c18da8e-6d01-4117-af53-bb7b1d809f20"), "wall" : ISODate("2023-05-16T07:44:19.805Z"), "o" : { "_id" : ObjectId("64633453e69427651e2f5784"), "username" : "user1", "crated_at" : ISODate("2023-05-16T07:44:19.791Z") } }
{ "ts" : Timestamp(1684223059, 3), "t" : NumberLong(5), "h" : NumberLong(0), "v" : 2, "op" : "i", "ns" : "test_jia.tab4", "ui" : UUID("8c18da8e-6d01-4117-af53-bb7b1d809f20"), "wall" : ISODate("2023-05-16T07:44:19.811Z"), "o" : { "_id" : ObjectId("64633453e69427651e2f5785"), "username" : "user2", "crated_at" : ISODate("2023-05-16T07:44:19.807Z") } }
{ "ts" : Timestamp(1684223059, 4), "t" : NumberLong(5), "h" : NumberLong(0), "v" : 2, "op" : "i", "ns" : "test_jia.tab4", "ui" : UUID("8c18da8e-6d01-4117-af53-bb7b1d809f20"), "wall" : ISODate("2023-05-16T07:44:19.814Z"), "o" : { "_id" : ObjectId("64633453e69427651e2f5786"), "username" : "user3", "crated_at" : ISODate("2023-05-16T07:44:19.813Z") } }
{ "ts" : Timestamp(1684223059, 5), "t" : NumberLong(5), "h" : NumberLong(0), "v" : 2, "op" : "i", "ns" : "test_jia.tab4", "ui" : UUID("8c18da8e-6d01-4117-af53-bb7b1d809f20"), "wall" : ISODate("2023-05-16T07:44:19.817Z"), "o" : { "_id" : ObjectId("64633453e69427651e2f5787"), "username" : "user4", "crated_at" : ISODate("2023-05-
Log日志
Mongodb的Log日志是记录mongodb数据库启动运行等过程的日志文件,数据库服务器上的启动信息、客户端操作信息、慢查询信息、数据库异常信息等都保存在该log文件中。