重新同步副本集的节点
当副本集节点的复制过程落后太多以至于主节点覆盖该节点尚未复制的 oplog 条目时,副本集节点就会变得“陈旧”。该节点无法跟上并变得“陈旧”。发生这种情况时,您必须通过删除其数据并执行 初始同步来完全重新同步该节点。
本教程解决了重新同步陈旧成员和使用来自另一个节点的种子数据创建新节点的问题,这两者都可用于恢复副本集成员。同步成员时,请选择系统具有移动大量数据的带宽的时间。在低使用率或维护窗口期间安排同步。
MongoDB 提供了两个用于执行初始同步的选项:
mongod
使用空数据目录重新启动,让 MongoDB 的正常初始同步功能恢复数据。这是更简单的选项,但可能需要更长的时间来替换数据。使用副本集中另一个成员的最新数据目录的副本重新启动机器。此过程可以更快地替换数据,但需要更多手动步骤。
程序
NOTE
为防止更改写入仲裁,一次不要轮换一个以上的副本集节点。
自动同步节点
WARNING
此过程依赖于 MongoDB 的 副本集同步的常规过程。这将存储节点的当前数据。有关 MongoDB 初始同步过程的概述,请参阅 副本集同步部分。
初始同步操作会影响集合中的其他节点,并为主节点创建额外的流量。同步节点需要集合中的另一个可访问且最新的节点。
如果实例没有数据,您可以按照 Add Members to a Replica Set或 Replace a Replica Set Member过程将新节点添加到副本集。
您还可以mongod
通过在没有目录内容的情况下重新启动实例来强制已经是集合节点的 a 执行初始同步 dbPath
:
- 停止节点的
mongod
实例。为确保干净关闭,请使用db.shutdownServer()
来自mongosh
或者在 Linux 系统上,mongod --shutdown
选项。 - (可选)备份节点
dbPath
目录中的所有数据和子目录。如果不需要完整备份,请考虑仅备份diagnostic.data
目录以在出现问题时保留可能有用的故障排除数据。有关详细信息,请参阅全时诊断数据捕获。 - 从节点目录中删除所有数据和子目录
dbPath
。 - 重新启动 mongod 进程。
此时,mongod
执行初始同步。初始同步过程的长度取决于数据库的大小和副本集节点之间的网络延迟。
通过从另一个节点复制数据文件来同步
这种方法使用来自副本集现有成员的数据文件“播种”新成员或陈旧节点。数据文件必须足够新以允许新节点赶上操作 日志。否则,节点将需要执行初始同步。
复制数据文件
您可以将数据文件捕获为快照或直接副本。但是,在大多数情况下,您无法将数据文件从一个正在运行的 mongod
实例复制到另一个实例,因为数据文件会在文件复制操作期间更改。
IMPORTANT
如果复制数据文件,请确保您的副本包含
local
数据库的内容。
你不能使用mongodump
数据文件的备份: 只有快照备份。有关捕获正在运行的mongod
实例的一致快照的方法,请参阅 MongoDB 备份方法文档。
同步节点
从“种子”源复制数据文件后, mongod
使用新实例启动实例members[n\]._id
并允许它应用操作日志中的所有操作,直到它反映副本集的当前状态。要查看副本集的当前状态,请使用rs.printSecondaryReplicationInfo()
或 rs.status()
。
原文链接 - https://docs.mongodb.com/manual/tutorial/resync-replica-set-member/
译者:陆文龙