问题描述
场景
我正在恢复从不同副本集获取的备份,即将一个唯一副本集复制到另一个副本集。让我们称它们为副本集 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)
}
}
}
问题
- 副本集 ID 的意义是什么?
- 如果我在我试图强制的配置中使副本集 ID 相同 - 那么它的副作用是什么。
- replset 配置如何跨节点同步(我不是在寻找任何命令,而是在细节之下)
让我知道是否需要更多细节来增加问题的清晰度。
注意:集合A和集合B中的主机不同,并且都遵循带有仲裁节点的复制模型。
解决方法
MongoDB 在处理副本集时会进行一些完整性检查:
- 副本集名称在配置文件或启动命令行中指定
- 该名称在创建副本集时用作副本集 ID
- 副本集配置文件在添加时复制到其他节点
- 每个节点在其本地数据库中存储副本集配置文档的副本
启动时,当收到新的副本集配置文档时,mongod 会检查副本集 ID 是否与已有的匹配,并且其主机名是否出现在新配置的成员列表中。如果有任何不匹配,它会转换为不接受写入的状态。
这有助于确保副本集成员之间数据的一致性。
从备份恢复副本集的基本步骤。取自文档,有关更多详细信息,请参阅 https://docs.mongodb.com/manual/tutorial/restore-replica-set-from-backup/index.html
- 获取备份 MongoDB 数据库文件。
- 删除本地数据库(如果它存在于备份中)。
- 启动一个新的单节点副本集。
- 将 mongo shell 连接到 mongod 实例。
- 启动新的副本集。