- MongoDB官方文档中文版
 - MongoDB中文手册说明
 - MongoDB简介
 - 安装 MongoDB
 - The mongo Shell
 - MongoDB CRUD 操作
 - 聚合
 - 数据模型
 - 事务
 - 索引
 -  安全   
- 安全检查列表
 - 启用访问控制
 - 身份验证
 - 基于角色的访问控制
 - TLS / SSL(传输加密)
 - 静态加密
 - 客户端字段级加密
 - 审计
 - 网络和配置强化
 - 实现字段级别修订
 - 安全参考
 - 附录
 
 - 变更流
 - 复制
 - 分片   
- 分片键
 - 哈希分片
 - 范围分片
 - 区
 - 管理分片区
 - 按位置细分数据
 - 用于更改SLA或SLO的分层硬件
 - 按应用或客户细分数据
 - 仅插入工作负载的分布式本地写入
 - 管理分片区
 - 使用块进行数据分区
 - 在分片集群中拆分数据块
 
 - 管理
 -  存储   
-  存储引擎   
- 日志记录
 - 管理日志记录   
- GridFS
 
 
 - FAQ:MongoDB 存储
 
 -  存储引擎   
 - 参考   
- 运算符
 - 查询与映射运算符
 - 更新运算符
 - 聚合管道阶段
 -  聚合管道操作符   
- $abs (aggregation)
 - $acos (aggregation)
 - $acosh (aggregation)
 - $add (aggregation)
 - $addToSet (aggregation)
 - $allElementsTrue (aggregation)
 - $and (aggregation)
 - $anyElementTrue (aggregation)
 - $arrayElemAt (aggregation)
 - $arrayToObject (aggregation)
 - $asin (aggregation)
 - $asinh (aggregation)
 - $atan (aggregation)
 - $atan2 (aggregation)
 - $atanh (aggregation)
 - $avg (aggregation)
 - $ceil (aggregation)
 - $cmp (aggregation)
 - $concat (aggregation)
 - $concatArrays (aggregation)
 - $cond (aggregation)
 - $convert (aggregation)
 - $cos (aggregation)
 - $dateFromParts (aggregation)
 - $dateToParts (aggregation)
 - $dateFromString (aggregation)
 - $literal (aggregation)
 
 - 查询修饰符
 - 数据库命令
 - 聚合命令
 - 地理空间命令
 - 查询和写操作命令
 - 查询计划缓存命令
 - 认证命令
 - 用户管理命令
 - 角色管理命令
 - 复制命令
 - 分片命令
 - 会话命令
 - 管理命令
 - 诊断命令
 - 免费监控命令
 - 系统事件审计命令
 - mongo Shell 方法
 -  集合方法   
- db.collection.aggregate()
 - db.collection.bulkWrite()
 - db.collection.copyTo()
 - db.collection.count()
 - db.collection.countDocuments()
 - db.collection.estimatedDocumentCount()
 - db.collection.createIndex()
 - db.collection.createIndexes()
 - db.collection.dataSize()
 - db.collection.deleteOne()
 - db.collection.deleteMany()
 - db.collection.distinct()
 - db.collection.drop()
 - db.collection.dropIndex()
 - db.collection.dropIndexes()
 - db.collection.ensureIndex()
 - db.collection.explain()
 - db.collection.find()
 - db.collection.findAndModify()
 - db.collection.findOne()
 - db.collection.findOneAndDelete()
 - db.collection.findOneAndReplace()
 - db.collection.findOneAndUpdate()
 - db.collection.getIndexes()
 - db.collection.getShardDistribution()
 - db.collection.getShardVersion()
 - db.collection.insert()
 - db.collection.insertOne()
 - db.collection.insertMany()
 - db.collection.isCapped()
 - db.collection.latencyStats()
 - db.collection.mapReduce()
 - db.collection.reIndex()
 - db.collection.remove()
 - db.collection.renameCollection()
 - db.collection.replaceOne()
 - db.collection.save()
 - db.collection.stats()
 - db.collection.storageSize()
 - db.collection.totalIndexSize()
 - db.collection.totalSize()
 - db.collection.update()
 - db.collection.updateOne()
 - db.collection.updateMany()
 - db.collection.watch()
 - db.collection.validate()
 
 - 词汇表
 - 默认的MongoDB端口
 - 默认的MongoDB读/写关注
 - 服务器会话
 
 - MongoDB驱动
 - FAQ
 - 联系我们
 - 更多资料   
- [快学Mongo]
 - [Mongo问题讨论区]
 - [Mongo 驱动使用手册]
 
 - 本书使用 GitBook 发布
 
复制集日志
副本集日志
在本页
oplog(操作日志)是一个特殊的有限集合,它对数据库中所存储数据的所有修改操作进行滚动记录。
说明
从MongoDB 4.0开始,与其他有限集合不同,oplog集合可以超过其配置的大小限制,以避免大多数提交点被删除。
MongoDB在主节点上应用数据库操作,然后将这些操作记录到主节点的oplog上。然后从节点成员会以异步的方式复制并应用这些操作。所有副本集成员都包含一个oplog的副本,其位于local.oplog.rs 集合中,该集合可以让副本集成员维护数据库的当前状态。
为了便于复制,所有副本集成员将心跳(ping)发送给所有其他成员。任何从节点成员都可以从任何其他成员导入oplog条目。
oplog中的每个操作都是幂等的。也就是说,对目标数据集应用一次或多次oplog操作都会产生相同的结果。
日志大小
当您第一次启动一个副本集成员时,如果您没有指定oplog大小,MongoDB将创建一个默认大小的oplog。[1]
- 对于Unix和Windows系统
 
oplog大小依赖于存储引擎:
| 存储引擎 | 默认oplog大小 | 下限 | 上限 | | ————————— | ———————— | ——- | —— | | In-Memory存储引擎 | 物理内存的5% | 50MB | 50GB | | WiredTiger存储引擎 | 空闲磁盘空间的5% | 990MB | 50GB |
- 对于64-bit macOS系统
 
默认的oplog大小是192MB物理内存或空闲磁盘空间,具体取决于存储引擎:
| 存储引擎 | 默认oplog大小 | | ————————— | ————————- | | In-Memory存储引擎 | 192MB物理内存 | | WiredTiger存储引擎 | 192MB空闲磁盘空间 |
在大多数情况下,默认的oplog大小就足够了。例如,如果一个oplog是空闲磁盘空间的5%,并且可容纳24小时的操作记录,那么从节点从oplog停止复制条目的时间可以长达24小时,并且不会因oplog条目变得太陈旧而无法继续复制。但是,大多数副本集的操作容量要小得多,它们的oplog可以容纳更多的操作。
在 mongod 创建一个oplog前,您可以使用 oplogSizeMB 选项来定义oplog的大小。一旦您第一次启动副本集成员后,可使用 replSetResizeOplog 管理命令去改变oplog的大小。 replSetResizeOplog 命令允许您动态调整oplog大小而无需重新启动 mongod 进程。
[1] | 从MongoDB 4.0开始,oplog可以超过其配置的大小限制,来避免删除大多数提交点。
可能需要更大日志大小的工作负载
如果您可以预测您的副本集的工作负载与以下模式之一相似,那么您可能希望创建一个比默认值更大的oplog。相反,如果您的应用程序主要执行读操作,而写操作很少,那么更小的oplog可能就足够了。
以下工作负载可能需要大容量的oplog。
一次更新多个文档
为了保持幂等性,oplog必须将多次更新转换为单个操作。这会使用大量的oplog空间,而不会相应增加数据大小或磁盘使用。
删除与插入的数据量相等
如果删除的数据量与插入的数据量大致相同,则数据库在磁盘使用方面不会显著增长,但操作日志的大小可能相当大。
大量的就地更新
如果工作负载中很大一部分是不增加文档大小的更新,那么数据库会记录大量操作,但不会更改磁盘上的数据量。
Oplog状态
为了查看oplog的状态,包括oplog的大小和操作的时间范围,可使用rs.printReplicationInfo() 方法。有关oplog状态的更多内容,请参见检查Oplog大小。
复制延迟和流控制
在各种异常情况下,对从节点oplog的更新可能会滞后于预期的性能时间。在从节点上使用 db.getReplicationInfo()命令,以及根据复制状态输出结果来评估复制的当前状态,并确定是否存在任何意外的复制延迟。
从MongoDB 4.2开始,管理员可以限制主节点应用其写操作的速度,目的是将大多数提交延迟保持在可配置参数flowControlTargetLagSeconds最大值之下。
默认情况下,流控制是启用的。
说明
为了进行流控制,副本集/分片集群必须满足:参数featureCompatibilityVersion (FCV) 设置为4.2,并启用majority读关注。也就是说,如果FCV不是4.2,或者读关注majority被禁用,那么启用流控制将不起作用。
更多信息请参见流控制。
慢Oplog应用程序
从4.2版本开始(从4.0.6开始也是可行的),副本集的副本成员会记录oplog中应用时间超过慢操作阈值的慢操作条目。这些慢oplog信息被记录在从节点REPL 组件的文本applied op: took ms中。
2018-11-16T12:31:35.886-0500 I REPL   [repl writer worker 13] applied op: command { ... }, took 112ms
记录在从节点上的慢操作应用程序有:
- 不受 
slowOpSampleRate的影响;例如,所有的慢oplog条目被记录在从节点上。 - 不受 
logLevel/systemLog.verbosity级别的影响(或者systemLog.component.replication.verbosity的级别);例如,对于oplog条目,从节点仅记录慢oplog条目。增加日志的冗余级别不会导致记录所有的oplog条目。 - 不会被捕获器抓取到,并且不受捕获级别的影响。
 
更多有关慢操作阈值设置的信息,请参见:
mongod --slowmsslowOpThresholdMsprofile命令或者db.setProfilingLevel()shell帮助命令
Oplog集合的特性
如果你的MongoDB部署使用的是WiredTiger存储引擎,你无法从副本集任何成员中删除 local.oplog.rs 集合。这个限制适用于单成员和多成员的副本集。如果一个节点临时宕机并试图在重启过程中重新应用oplog,那么删除oplog可能会导致副本集中的数据不一致。
原文链接:https://docs.mongodb.com/manual/core/replica-set-oplog/
译者:李正洋
Copyright © 上海锦木信息技术有限公司 all right reserved,由 MongoDB汉化小组 提供技术支持文件修订时间: 2020-10-11 20:53:05
