翻译或纠错本页面

复制集成员的重新同步

On this page

A replica set member becomes “stale” when its replication process falls so far behind that the primary overwrites oplog entries the member has not yet replicated. The member cannot catch up and becomes “stale.” When this occurs, you must completely resynchronize the member by removing its data and performing an initial sync.

当复制失败,且落后于 primary 中oplog最大可承受的范围的时候,replica set 成员将变为 “陈旧” (stale)。该节点无法追上主节点就变的 “陈旧”了。当发生这种情况时,我们就不得不删除其数据文件,并通过 initial sync 来重新同步。

MongoDB提供2中初始化同步(initial sync)的方式:

  • 清空数据目录,重启 mongod 实例,让MongoDB进行正常的初始化同步。这是个简单的方式,但是耗时较长。

    参考 自动同步

  • 为该机器从其他节点上复制一份最近的数据文件,并重启。本方式操作步骤较多,但是最为快速。

    参考 通过从其他节点复制数据文件来同步

步骤

自动同步

警告

在初始化同步的过程中,mongod 将会清空 dbPath 中的内容。

该步骤依靠MongoDB 自身的定期进程 initial sync 。这将恢复节点上最新的数据。有关MongoDB初始化恢复,请参考 replica-set-syncing

如果该实例没有数据,我们可以通过 为复制集新增节点 或是 更换复制集节点 来为复制集新增一个节点。

我们也可以通过指定一个空的 dbPath 并重启来将一个复制集中的 mongod 实例强制初始化同步。

  1. 关闭 mongod 进程。通过在 mongo 窗口中使用 db.shutdownServer() 命令或者在Linux系统中使用 mongod --shutdown 参数来安全关闭。

  2. 清空复制集节点的数据目录和其子目录,清除 dbPath 中的数据,MongoDB将会进行重新复制。可以考虑在这么做之前先做备份以防万一。

这时, mongod 将会进行初始化复制。初始化复制的耗时,将取决于数据库数据量和两节点之间的网络情况。

初始化复制将会影响其他节点,也会加大主节点的网络流量压力,且只会在有一个节点数据是最新的且连接无问题的时候进行。

通过从其他节点复制数据文件来同步

本方法通过使用已有节点上的数据文件来进行。数据文件 必须 是较新的(能够追上 oplog ).不然的话该节点还是需要进行初始化复制。

复制数据文件

我们可以直接复制数据文件也可以通过镜像。然而,大多数情况下,我们不应该复制未关闭的 mongod 实例的数据文件,因为复制过程中数据文件是会变动的。

重要

If copying data files, ensure that your copy includes the content of the local database.

我们*不应该*使用 mongodump 的备份作为数据文件,仅使用文件快照 。关于如何在运行中的 mongod 实例中获得一致性的数据文件,参考 MongoDB备份方案

同步节点

在我们复制了其他节点的数据文件后,启动 mongod 实例,其会追赶最新的数据直到数据一致。