mongodb - 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)
}
}
}
问题
- 副本集 ID 的意义是什么?
- 如果我在我试图强制的配置中使复制集 ID 相同——那么如果有的话,它的副作用是什么。
- replset 配置如何跨节点同步(我不是在寻找任何命令,而是在详细信息下方)
让我知道是否需要更多细节来增加问题的清晰度。
注意:集合 A 和集合 B 中的主机不同,并且都遵循带有仲裁节点的复制模型。
解决方案
MongoDB 在处理副本集时会进行一些完整性检查:
- 副本集名称在配置文件或启动命令行中指定
- 该名称在创建副本集时用作副本集 ID
- 副本集配置文档在添加时复制到每个其他节点
- 每个节点在其本地数据库中存储副本集配置文档的副本
启动时,当收到新的副本集配置文档时,mongod 将检查副本集 ID 是否与已有的 ID 匹配,并且其主机名是否出现在新配置的成员列表中。如果有任何不匹配,它将转换到不接受写入的状态。
这有助于确保副本集成员之间数据的一致性。
从备份中恢复副本集的基本步骤。取自文档,有关更多详细信息,请参阅 https://docs.mongodb.com/manual/tutorial/restore-replica-set-from-backup/index.html
- 获取备份 MongoDB 数据库文件。
- 如果备份中存在本地数据库,则删除它。
- 启动一个新的单节点副本集。
- 将 mongo shell 连接到 mongod 实例。
- 启动新的副本集。
推荐阅读
- angular - Angular 7,虚拟滚动。无法在 max 中设置 scrollTop
- c - 按降序排列数组中的奇数
- .net - dotnet 命令由 Visual Studio 2017 执行
- jsf-2 - 带有 panelGrid 的 bean 实例
- c - 如果用于查找最小数字的基本代码是什么?
- javascript - Vee-validate 仅验证某些字段
- java - MediaPlayer Android Studio 让我的应用运行缓慢
- talend - TALEND : 如何记录组件级运行时信息
- javascript - 通过 ID angular 6 获取对象:
- full-text-search - 带有特殊字符和“单词开头”的 MariaDB 全文搜索