首页 > 解决方案 > Mongodb:错误 - 新旧配置的副本集 ID 不同

问题描述

设想

我正在恢复从不同的副本集获取的备份,即一个唯一的副本集到另一个副本集。让我们称它们为副本集 A 和副本集 B .. 备份在 aws EBS 快照中。

可用的备份适用于集合 A,必须为集合 B 恢复。

我最初复制cfg=rs.config()了 B 组节点的初始配置。

现在将集合 A 的 ebs 卷安装到从快照创建的集合 B 的节点后,我可以连接到数据库。配置将是集合 A,因为卷是从集合 A 备份创建的,这意味着所有主机名都是集合A 在现有配置中恢复后。

问题

在尝试强制现有配置时,现在我遇到了以下问题。

rs.reconfig(cfg,{force:true})
{
    "ok" : 0,
    "errmsg" : "New and old configurations differ in replica set ID; old was 5c4a6ab3b5306ee3ec95dae4, and new is 59dc23bfa547d208144dd564",
    "code" : 103,
    "codeName" : "NewReplicaSetConfigurationIncompatible",
    "operationTime" : Timestamp(1616525693, 4976),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1616573470, 22),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

问题

  1. 副本集 ID 的意义是什么?
  2. 如果我在我试图强制的配置中使复制集 ID 相同——那么如果有的话,它的副作用是什么。
  3. replset 配置如何跨节点同步(我不是在寻找任何命令,而是在详细信息下方)

让我知道是否需要更多细节来增加问题的清晰度。

注意:集合 A 和集合 B 中的主机不同,并且都遵循带有仲裁节点的复制模型。

标签: mongodbdatabase-backupsdatabase-restorereplicaset

解决方案


MongoDB 在处理副本集时会进行一些完整性检查:

  • 副本集名称在配置文件或启动命令行中指定
  • 该名称在创建副本集时用作副本集 ID
  • 副本集配置文档在添加时复制到每个其他节点
  • 每个节点在其本地数据库中存储副本集配置文档的副本

启动时,当收到新的副本集配置文档时,mongod 将检查副本集 ID 是否与已有的 ID 匹配,并且其主机名是否出现在新配置的成员列表中。如果有任何不匹配,它将转换到不接受写入的状态。

这有助于确保副本集成员之间数据的一致性。

从备份中恢复副本集的基本步骤。取自文档,有关更多详细信息,请参阅 https://docs.mongodb.com/manual/tutorial/restore-replica-set-from-backup/index.html

  1. 获取备份 MongoDB 数据库文件。
  2. 如果备份中存在本地数据库,则删除它。
  3. 启动一个新的单节点副本集。
  4. 将 mongo shell 连接到 mongod 实例。
  5. 启动新的副本集。

推荐阅读