重新同步自管理副本集成员

当副本集成员的复制进度落后太多,主节点已经覆盖了它尚未复制的 oplog 条目时,该成员就会变成“过期”(stale)状态,无法继续追赶。此时必须移除其数据并执行初始同步,才能彻底重新同步该成员。

本教程同时介绍如何重新同步过期成员,以及如何使用其他成员提供的种子数据创建新成员。这两种方法都可以用于恢复副本集成员。同步需要传输大量数据,应选择系统带宽足够的时段,安排在低使用率时间或维护窗口内。

重要

应从副本集中数据最新的成员进行重新同步。

如果使用过期数据重新同步节点,该节点重新加入副本集时的进度可能比重新同步前还落后。此前已经获得多数确认提交的写入可能不再处于多数提交状态,从而造成数据丢失。

MongoDB 提供两种初始同步方式:

  • 使用空数据目录重新启动 mongod,让 MongoDB 的常规初始同步功能恢复数据。这种方式较简单,但替换数据可能需要更长时间。

    见“自动同步成员”。

  • 从副本集另一成员复制较新的数据目录,再重新启动机器。此方式替换数据更快,但需要更多手动步骤。

    见“通过复制其他成员的数据文件进行同步”。

说明

为避免改变写入法定人数,一次不要轮换多个副本集成员。

警告

初始同步期间,mongod 会删除 dbPath 目录中的内容。

此流程使用 MongoDB 常规的副本集同步机制,将当前数据保存到该成员。初始同步过程概述见“副本集同步”。

初始同步可能影响副本集其他成员,并增加源成员的流量。待同步成员需要能够访问副本集中一个数据最新的成员。

如果实例尚无数据,可以按照“向自管理副本集添加成员”或“替换自管理副本集成员”的流程添加新成员。

也可以在清空 dbPath 内容后重启实例,强制已经属于副本集的 mongod 执行初始同步:

  1. 停止该成员的 mongod 实例。为了正常关闭,请在 mongosh 中使用 db.shutdownServer(),或在 Linux 上使用 mongod –shutdown 选项。

  2. 可选:备份该成员 dbPath 目录中的全部数据和子目录。如果不需要完整备份,至少可以考虑备份 diagnostic.data 目录,保留发生问题时可能有用的诊断数据。更多信息见“全时诊断数据采集”。

  3. 删除该成员 dbPath 目录中的全部数据和子目录。

  4. 重新启动 mongod 进程。

此时 mongod 会执行初始同步。所需时间取决于数据库大小以及副本集成员之间的网络延迟。

这种方式使用副本集中现有成员的数据文件,为新成员或过期成员提供种子数据。数据文件必须足够新,使待同步成员能够通过 oplog 追赶到当前状态;否则仍需要执行初始同步。

可以通过快照或直接复制获取数据文件。不过,大多数情况下不能直接把运行中 mongod 实例的数据文件复制到另一个实例,因为复制期间这些文件仍会变化。

重要

复制数据文件时,必须包含 local 数据库的内容。

不能将 mongodump 备份作为这里的数据文件,只能使用快照备份。如何为运行中的 mongod 获取一致快照,见“自管理部署的备份方法”。

从种子源复制数据文件后,以新的 members[n]._id 启动 mongod 实例,让它应用 oplog 中的全部后续操作,直到达到副本集当前状态。可以使用 rs.printSecondaryReplicationInfo() 或 rs.status() 查看副本集当前状态。


原文:Resync a Member of a Self-Managed Replica Set。作者/来源:MongoDB 文档团队。本文依据所列原文整理为中文,代码、命令与配置示例保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容