与删除的成员形成一个新的副本集

时间:2019-06-01 09:43:35

标签: mongodb replication data-migration mongodb-replica-set

如何配置副本集的已删除成员以形成新副本集?

我有一个包含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”:“新旧配置都具有主机为localhost:27034的成员,但是在新配置中,_id字段为1,而在旧配置中,副本集rs0为3”,

    < / li>

此解决方案好吗?

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您怀疑,该过程未创建新的副本集。相反,它是旧副本集的延续,尽管从表面上看它们看起来有所不同。

MongoDB文档中实际上有一个过程可以执行您想要的操作:Restore a Replica Set from MongoDB Backups。区别在于,您不是从备份中还原。相反,您正在使用已删除的辅助副本之一来播种新副本集。

因此,您需要修改上面链接中提到的过程的第一步。其余过程仍然相同:

  1. 以独立的方式(没有--replSet参数)重新启动已删除的辅助节点,并使用mongo shell连接到它。
  2. local数据库拖放到独立节点中:

    use local
    db.dropDatabase()
    
  3. 这次使用--replSet参数(具有新的副本集名称)重新启动中学课程

  4. 使用mongo shell连接到它。
  5. rs.initiate()新集合。

此后,新集合应与旧集合具有不同的replicaSetId。在我对上述过程的快速测试中,这是我看到的结果:

旧设置:

> rs.conf()
...
"replicaSetId": ObjectId("5cf45d72a1c6c4de948ff5d8")
...

新套装

> rs.conf()
...
"replicaSetId": ObjectId("5cf45d000dda9e1025d6c65e")
...

对于任何类似的重大部署更改,请确保您具有备份,并在生产系统上进行备份之前彻底测试过程。