与删除的成员形成一个新的副本集
Form a new replica set with removed members
如何配置删除的副本集成员组成新的副本集?
我有一个包含 4 个 mongod 实例的副本集
rs.config()
的输出
{
"_id" : "rs0",
"members" : [
{
"_id" : 0,
"host" : "localhost:27031"
},
{
"_id" : 1,
"host" : "localhost:27032"
},
{
"_id" : 2,
"host" : "localhost:27033"
},
{
"_id" : 3,
"host" : "localhost:27034"
}
],
"settings" : {
"replicaSetId" : ObjectId("5cf22332f5b9d21b01b9b6b2")
}
}
我从副本集中删除了 2 个实例
rs.remove("localhost:27033")
rs.remove("localhost:27034")
现在我的要求是用这两个删除的成员组成一个新的副本集。最好的方法是什么?
我目前的解决方案
连接到已删除的成员
mongo --port 27033
并执行
conf = {
"_id" : "rs0",
"members" : [
{
"_id" : 2,
"host" : "localhost:27033"
},
{
"_id" : 3,
"host" : "localhost:27034"
}
],
"settings" : {
"replicaSetId" : ObjectId("5cf22332f5b9d21b01b9b6b2")
}
}
然后
rs.reconfig(conf, {force:true})
结果
这个解决方案在实践中效果很好。
删除的成员形成一个复制集,其中一个成为主要成员,其他成员成为次要成员。数据在它们之间被复制。
而且这个副本集似乎与它们被删除的初始副本集是隔离的。
担忧
1) 我不得不使用强制重新配置。不确定后果。
"errmsg" : "replSetReconfig should only be run on PRIMARY, but my state is REMOVED; use the \"force\" argument to override",
2) 新的副本集真的是新的吗?在 rs.config()
replicaSetId 和旧的一样
"replicaSetId" : ObjectId("5cf22332f5b9d21b01b9b6b2")
我必须为成员的 _id 使用与旧副本集
配置相同的值
"errmsg" : "New and old configurations both have members with host of localhost:27034 but in the new configuration the _id field is 1 and in the old configuration it is 3 for replica set rs0",
这个方案好吗?
有没有更好的解决办法?
注意:我需要在新副本集中保留旧副本集中的数据(删除时存在的数据)。
如您所料,该过程没有创建新的副本集。相反,它是旧副本集的延续,尽管从表面上看它们看起来不同。
MongoDB 文档中实际上有一个过程可以执行您想要的操作:Restore a Replica Set from MongoDB Backups。不同之处在于,您不是从备份中恢复。相反,您正在使用一个已删除的辅助节点来播种新的副本集。
因此您需要修改上面link中提到的程序中的第一步。其余过程仍然相同:
- 重新启动已删除的辅助作为独立的(没有
--replSet
参数)并使用 mongo
shell. 连接到它
在独立节点中删除local
数据库:
use local
db.dropDatabase()
重新启动 ex-secondary,这次使用 --replSet
参数(使用新的副本集名称)
- 使用
mongo
shell. 连接到它
rs.initiate()
新套装。
在此之后,新集与旧集相比应该会有不同的 replicaSetId
。在我对上述过程的快速测试中,这是我看到的结果:
旧集:
> rs.conf()
...
"replicaSetId": ObjectId("5cf45d72a1c6c4de948ff5d8")
...
新集
> rs.conf()
...
"replicaSetId": ObjectId("5cf45d000dda9e1025d6c65e")
...
对于像这样的任何重大部署更改,请确保您有备份,并在生产系统上执行之前彻底测试这些过程。
如何配置删除的副本集成员组成新的副本集?
我有一个包含 4 个 mongod 实例的副本集
rs.config()
的输出{
"_id" : "rs0",
"members" : [
{
"_id" : 0,
"host" : "localhost:27031"
},
{
"_id" : 1,
"host" : "localhost:27032"
},
{
"_id" : 2,
"host" : "localhost:27033"
},
{
"_id" : 3,
"host" : "localhost:27034"
}
],
"settings" : {
"replicaSetId" : ObjectId("5cf22332f5b9d21b01b9b6b2")
}
}
我从副本集中删除了 2 个实例
rs.remove("localhost:27033")
rs.remove("localhost:27034")
现在我的要求是用这两个删除的成员组成一个新的副本集。最好的方法是什么?
我目前的解决方案
连接到已删除的成员
mongo --port 27033
并执行
conf = {
"_id" : "rs0",
"members" : [
{
"_id" : 2,
"host" : "localhost:27033"
},
{
"_id" : 3,
"host" : "localhost:27034"
}
],
"settings" : {
"replicaSetId" : ObjectId("5cf22332f5b9d21b01b9b6b2")
}
}
然后
rs.reconfig(conf, {force:true})
结果
这个解决方案在实践中效果很好。 删除的成员形成一个复制集,其中一个成为主要成员,其他成员成为次要成员。数据在它们之间被复制。 而且这个副本集似乎与它们被删除的初始副本集是隔离的。
担忧
1) 我不得不使用强制重新配置。不确定后果。
"errmsg" : "replSetReconfig should only be run on PRIMARY, but my state is REMOVED; use the \"force\" argument to override",
2) 新的副本集真的是新的吗?在 rs.config()
replicaSetId 和旧的一样
"replicaSetId" : ObjectId("5cf22332f5b9d21b01b9b6b2")
我必须为成员的 _id 使用与旧副本集
配置相同的值"errmsg" : "New and old configurations both have members with host of localhost:27034 but in the new configuration the _id field is 1 and in the old configuration it is 3 for replica set rs0",
这个方案好吗?
有没有更好的解决办法?
注意:我需要在新副本集中保留旧副本集中的数据(删除时存在的数据)。
如您所料,该过程没有创建新的副本集。相反,它是旧副本集的延续,尽管从表面上看它们看起来不同。
MongoDB 文档中实际上有一个过程可以执行您想要的操作:Restore a Replica Set from MongoDB Backups。不同之处在于,您不是从备份中恢复。相反,您正在使用一个已删除的辅助节点来播种新的副本集。
因此您需要修改上面link中提到的程序中的第一步。其余过程仍然相同:
- 重新启动已删除的辅助作为独立的(没有
--replSet
参数)并使用mongo
shell. 连接到它
在独立节点中删除
local
数据库:use local db.dropDatabase()
重新启动 ex-secondary,这次使用
--replSet
参数(使用新的副本集名称)- 使用
mongo
shell. 连接到它
rs.initiate()
新套装。
在此之后,新集与旧集相比应该会有不同的 replicaSetId
。在我对上述过程的快速测试中,这是我看到的结果:
旧集:
> rs.conf()
...
"replicaSetId": ObjectId("5cf45d72a1c6c4de948ff5d8")
...
新集
> rs.conf()
...
"replicaSetId": ObjectId("5cf45d000dda9e1025d6c65e")
...
对于像这样的任何重大部署更改,请确保您有备份,并在生产系统上执行之前彻底测试这些过程。