重新同步副本集的成员
在本页面
当replica set成员的复制过程远远落后于primary覆盖该成员尚未复制的操作日志条目时,它们将变为“陈旧”。该成员无法赶上并变得“陈旧”。发生这种情况时,您必须通过删除其数据并执行initial sync来完全重新同步该成员。
本教程解决了重新同步陈旧成员和使用来自另一个成员的种子数据创建新成员的问题。同步成员时,请选择系统具有带宽的时间来移动大量数据。在使用率较低或维护时段内安排同步。
MongoDB 提供了两个选项来执行初始同步:
- 用空的数据目录重新启动mongod,然后让 MongoDB 的常规初始同步功能恢复数据。这是更简单的选项,但替换数据可能需要更长的时间。
See 自动同步成员.
- 使用副本集中另一个成员的最新数据目录副本重新启动计算机。此过程可以更快地替换数据,但需要更多的手动步骤。
See 通过复制其他成员的数据文件进行同步.
Procedures
自动同步成员
此过程依赖于 MongoDB 的副本集同步常规过程。这会将当前数据存储在成员上。有关 MongoDB 初始同步过程的概述,请参见副本集同步部分。
初始同步操作可能会影响集合中的其他成员,并会创建到主数据库的其他流量。同步成员需要集合中的另一个成员,该成员可以访问并且是最新的。
如果该实例没有数据,则可以按照将成员添加到副本集中或替换副本集成员过程将新成员添加到副本集。
您还可以通过重新启动实例而不使用dbPath目录的内容来强制已经是集合成员的mongod执行初始同步:
-
停止成员的mongod实例。为了确保干净关闭,请使用mongo shell 或在 Linux 系统上使用mongod --shutdown选项的db.shutdownServer()方法。
-
从成员的dbPath目录中删除所有数据和子目录。考虑先进行备份。
此时,mongod将执行初始同步。初始同步过程的长度取决于数据库的大小以及副本集成员之间的网络延迟。
通过复制其他成员的数据文件进行同步
这种方法使用副本集中现有成员的数据文件“播种”新成员或陈旧成员。数据文件 必须 足够新,以使新成员赶上oplog。否则,成员将需要执行初始同步。
复制数据文件
您可以将数据文件捕获为快照或直接副本。但是,在大多数情况下,您无法将数据文件从正在运行的mongod实例复制到另一个实例,因为这些数据文件将在文件复制操作期间更改。
Important
如果要复制数据文件,请确保您的副本包含local
数据库的内容。
您不能对数据文件使用mongodump备份: 仅快照备份 。有关捕获正在运行的mongod实例的一致快照的方法,请参见MongoDB 备份方法文档。
同步成员
从“种子”源复制数据文件之后,启动mongod实例,并允许它从操作日志应用所有操作,直到它反映副本集的当前状态。