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