重新同步自管理副本集的成员
本页内容
当副本集成员的复制过程落后太多,以至于主节点覆盖了成员尚未复制的oplog条目时,该成员变为“过时”。成员无法赶上并变为“过时”。当这种情况发生时,您必须通过删除其数据并执行一个 初始同步 来完全重新同步成员。
本教程解决了对过时成员进行重新同步和使用来自另一个成员的种子数据创建新成员的问题,这两者都可以用于恢复副本集成员。在同步成员时,选择系统具有带宽移动大量数据的时间。在低使用时间或维护窗口期间安排同步。
MongoDB提供了两种进行初始同步的选项
使用空数据目录重新启动
mongod
,并让MongoDB的正常初始同步功能恢复数据。这是一个更简单的选项,但可能需要更长的时间来替换数据。参见自动同步成员.
使用来自副本集中另一个成员的最近数据目录的副本重新启动机器。此过程可以更快地替换数据,但需要更多手动步骤。
步骤
注意
为了防止改变写法定数,一次不要旋转超过一个副本集成员。
自动同步成员
此过程依赖于MongoDB的常规副本集同步过程,该过程将当前数据存储在成员上。有关MongoDB初始同步过程的概述,请参阅副本集同步部分。
初始同步操作可能影响集合中的其他成员,并向主节点创建额外的流量。同步成员需要集合中另一个可访问且更新的成员。
如果实例没有数据,您可以根据向自管理副本集添加成员或替换自管理副本集成员的过程向副本集添加新成员。
您还可以强制已加入集合的mongod
实例执行初始同步,方法是在不包含dbPath
目录内容的情况下重启实例。
停止成员的
mongod
实例。为确保干净关闭,请使用来自mongosh
的db.shutdownServer()
方法或在Linux系统上使用mongod --shutdown
选项。(可选) 从成员的
dbPath
目录备份数据和子目录。如果不需要完整备份,请考虑仅备份diagnostic.data
目录以在出现问题时保留可能有用的故障排除数据。有关更多信息,请参阅全天诊断数据捕获。删除成员的
dbPath
目录下的所有数据和子目录。
此时,mongod
执行初始同步。初始同步过程的长度取决于数据库的大小和副本集成员之间的网络延迟。
通过复制其他成员的数据文件进行同步
这种方法使用副本集现有成员的数据文件“播种”新的或过时的成员。数据文件必须足够新,以便新成员能够赶上 oplog。否则,成员需要执行初始同步。
复制数据文件
您可以捕获数据文件作为快照或直接复制。然而,在大多数情况下,您无法从运行中的 mongod
实例复制数据文件到另一个实例,因为在文件复制操作期间数据文件会发生变化。
重要
如果您正在复制数据文件,请确保您的复制包括 local
数据库的内容。
您 不能 使用 mongodump
备份数据文件:只有 快照备份。有关捕获运行中的 mongod
实例的连续快照的方法,请参阅 自管理部署的备份方法 文档。
同步成员
在从“种子”源复制数据文件后,使用新的mongod
实例启动members[n]._id
并允许其应用oplog中的所有操作,直到反映副本集的当前状态。要查看副本集的当前状态,请使用rs.printSecondaryReplicationInfo()
或rs.status()
。