Skip to main content

【译】复制集操作日志

00:00/00:00

今天是国庆节,祝祖国母亲节日快乐!爸爸妈妈明天过来,第一次坐飞机,第一次出这么远的们,希望能够一切顺利~family.

操作日志是一个特殊的限制集合,存储着修改存储在数据库中数据的所有操作的滚动记录。MongoDB在主节点上执行数据库操作,然后在主节点上的操作日志中记录这些操作。从节点成员在一个异步的进程中复制然后应用这些操作。所有的复制集成员都在local.oplog.rs集合中包含操作日志的副本,允许复制集成员维护当前的数据库状态。

为了方便复制,所有复制集成员向所有其它成员发送心跳(ping)。所有成员可以从其它成员中倒入日志条目。

操作日志中的每个操作都是幂等的。也就是说,不管向目标数据库操作一次还是多次,操作日志中的操作都会产生相同的结果。

操作日志大小

在我们第一次启动复制集成员时,MongoDB创建一个默认大小的日志。

对于Unix和Windows系统
默认的操作日志大小根据存储引擎而定:

存储引擎 默认的日志大小 下限 上限
内存存储引擎 物理内存的5% 50MB 50GB
WiredTiger存储引擎 剩余磁盘空间的5% 990MB 50GB
MMAPv1存储引擎 剩余磁盘空间的5% 990MB 50GB

对于64位OS X系统
操作日志的默认大小是物理内存还是剩余磁盘空间的192MB根据存储引擎的不同来决定:

存储引擎 默认的日志大小
内存存储引擎 物理内存的5%
WiredTiger存储引擎 剩余磁盘空间的192MB
MMAPv1存储引擎 剩余磁盘空间的192MB

在大多数情况下,默认的日志大小已经足够。例如,如果一个日志为空余磁盘空间的5%,填满了24小时的操作,然后从节点可以防止从高于24个小时的操作日志中复制条目而不会变得太陈旧而不能继续复制。然而,大部分数据集的操作量非常小,因此它们的操作日志可以保存更多数量的操作。

在mongod创建一个操作日志之前,我们可以使用oplogSizeMB选项指定它的大小。但是,一旦我们第一次启动了复制集成员之后,我们只能根据修改操作日志大小的步骤来修改操作日志的大小。

具体如下:
– 在单机模式中重启节点(在停止服务器之前,一般会使用rs.stepDown()来强制使得主节点变为从节点,这有利于更高效的选举流程。
– 重新创建新大小的操作日志并将一个旧的日志条目作为种子
– 重启mongod实例作为复制集的成员

可能需要更大操作日志大小的工作负载

如果我们可以预测我们的复制集的工作负载类似于下列模式中的一个,那么我们可以创建一个大于默认值大小的操作日志。相反地,如果我们的应用主要执行读操作和一小部分的读操作,一个更小的操作日志可能就已经足够了。

下列工作负载可能需要更大操作日志大小。

一次更新多个文档

为了维护幂等性,操作日志必须将多更新的操作翻译为单独的操作。这有可能导致使用大量的日志空降而没有对应的数据大小或磁盘使用的相应增长。

删除和插入相同数量的数据

如果我们删除和插入数量相同的数据,数据库的磁盘使用将不会增加,但是操作日志的大小可能会非常大。

大数据量的就地更新

如果工作负载的一大部分是不会增加文档大小的操作,那么数据库记录大量不会修改磁盘上数据量的操作。

日志状态

可以使用rs.printReplicationInfo()方法来查看日志状态,包括操作的大小以及时间范围。可以查阅文档了解更多日志状态的信息。

具体如下:输出结果展示了操作日志的大小以及操作日志中包含的日期范围,下面的示例中,日志大约10MB,可以保存大约26个小时(94400秒)的操作:

configured oplog size:   10.10546875MB
log length start to end: 94400 (26.22hrs)
oplog first event time:  Mon Mar 19 2012 13:50:38 GMT-0400 (EDT)
oplog last event time:   Wed Oct 03 2012 14:59:10 GMT-0400 (EDT)
now:                     Wed Oct 03 2012 15:00:21 GMT-0400 (EDT)

操作日志应该足够长,以保证能容纳我们预计的从节点上的最长宕机时间所有事物。一个操作日志应该最少能够容纳24小时操作;然而,许多用户更倾向于有72个小时或甚至1周的操作记录。

在许多异常的情况下,对从节点日志的更新可能会延迟于预期性能时间。在从节点上使用db.getReplicationInfo() 以及日志状态的输出来获取复制集的当前状态,来决定是否有意外的复制集延迟。

参考文献

  • https://docs.mongodb.com/manual/tutorial/troubleshoot-replica-sets/#replica-set-troubleshooting-check-oplog-size
  • https://docs.mongodb.com/manual/tutorial/change-oplog-size/
  • https://docs.mongodb.com/manual/core/replica-set-oplog/
打赏
微信扫一扫支付
微信logo微信扫一扫, 打赏作者吧~

mickey

记录生活,写给几十年后的自己。