Mongodb:错误 - 新旧配置的副本集 ID 不同

问题描述

场景

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

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

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

现在在将集合 A 的 ebs 卷安装到从快照创建的 setB 节点后,我能够连接到数据库。配置将是集合 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中的主机不同,并且都遵循带有仲裁节点的复制模型。

解决方法

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

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

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

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

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

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