代码之家  ›  专栏  ›  技术社区  ›  Sreeragh A R

使用删除的成员形成新的副本集

  •  0
  • Sreeragh A R  · 技术社区  · 5 年前

    我有一个带有4个mongod实例的副本集

    {
        "_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(“5cf2232f5b9d21b01b9b6b2”)

    • _身份证 旧副本集配置中的成员数

    这个解决方案好吗?

    有没有更好的解决办法?

    :我需要将旧副本集的数据(删除时存在的数据)保留在新副本集中。

    0 回复  |  直到 5 年前
        1
  •  5
  •   kevinadi    5 年前

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

    Restore a Replica Set from MongoDB Backups . 区别在于,您不是从备份中恢复。更确切地说,您使用的是一个已删除的二级副本来为新的副本集播种。

    1. 将已删除的辅助服务器作为独立服务器重新启动(不带 --replSet mongo 贝壳。
    2. local

      use local
      db.dropDatabase()
      
    3. 重新启动ex secondary,这次使用 --重设

    4. 使用 蒙哥 贝壳。
    5. rs.initiate() 新的一套。

    在此之后,新的设置应该有一个不同的 replicaSetId 与旧的一套相比。在我对上述程序的快速测试中,我看到的结果是:

    旧设置:

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

    新建集合

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