Mongodb,所有replSet都停留在Startup2上

时间:2014-02-08 05:34:33

标签: mongodb replication

我有2个节点(node0,node1)的mongodb复制集,其中一天(node1)崩溃。

考虑删除node1的所有数据并重新启动它需要很长时间,我将node0和rsync数据关闭到node1

之后,我启动node0和node1。 replSet都停留在STARTUP2,下面是一些日志:

Sat Feb  8 13:14:22.031 [rsMgr] replSet I don't see a primary and I can't elect myself
Sat Feb  8 13:14:24.888 [rsStart] replSet initial sync pending
Sat Feb  8 13:14:24.889 [rsStart] replSet initial sync need a member to be primary or secondary to do our initial sync

如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

编辑10/29/15:我发现使用带有rs.reconfig选项的{force: true}实际上可以更轻松地找回主要版本。您可以找到详细信息文档here。尽管文档中提到它可能会导致回滚,但请谨慎使用。

你永远不应该构建一个2个成员的副本集,因为一旦其中一个被关闭,另一个不知道是不是因为另一个已经关闭,或者它自己已经从网络中断了。作为解决方案,添加仲裁节点进行投票。

所以你的问题是,当你重新启动node0时,node1已经死了,没有其他节点投票给它。它不知道它是否适合再运行一个主节点。因此它回退到次要,这就是你看到消息的原因

Sat Feb  8 13:14:24.889 [rsStart] replSet initial sync need a member to be primary or secondary to do our initial sync

我担心,因为我知道除了重建副本集之外没有其他官方方法可以解决这个问题(但你可以稍后找到一些技巧)。请按照以下步骤操作:

  1. 停止node0
  2. 转到node0的数据文件夹(在我的机器上是/ var / lib / mongodb。在位于/etc/mongodb.conf的配置文件中找到你的文件夹)
  3. 从文件夹中删除本地。*注意
    1. 这个可撤销,即使您备份了这些文件。
    2. 您将丢失本地数据库中的所有用户。
  4. 启动node0,您将看到它作为独立节点运行。
  5. 然后按照mongodb manual重新创建副本集

    1. 运行rs.initiate()以初始化副本集
    2. 将node1添加到副本集:rs.add(“node1 domain name”);
    3. 我担心你不得不花很长时间等待同步完成。然后你很高兴。

      我强烈建议添加仲裁器以避免再次发生这种情况。

      所以,以上是解决问题的官方方法,这就是我使用MongoDB 2.4.8的方法。我没有找到任何证明它的文件,所以绝对是 NO 保证。你自己承担风险。无论如何,如果它对你不起作用,只需回归正式方式。值得尝试;)

      1. 确保在整个过程中没有应用程序尝试修改您的数据库。否则这些修改将不会同步到辅助服务器。
      2. 在没有replSet = [set name]参数的情况下重新启动服务器,以便它作为独立运行,并且您可以对其进行修改。
      3. 转到本地数据库,并从db.system.replset中删除node1。例如在我的机器中最初它就像:

        {     “_id”:“rs0”,     “版本”:5,     “成员”:[{         “_id”:0,         “host”:“node0”     },{         “_id”:1,         “host”:“node1”     }] }

      4. 您应该将其更改为

        {
            "_id": "rs0",
            "version": 5,
            "members": [{
                "_id": 0,
                "host": "node0"
            }]
        }
        
        1. 使用replSet = [set name]重新启动,您应该看到node0再次成为主节点。
        2. 使用rs.add命令将node1添加到副本集。
        3. 这就是全部。如果您有任何问题,请告诉我。

答案 1 :(得分:0)

使用彩信时遇到了同样的问题。我创建了一个由3台机器组成的新ReplicaSet(2个数据+ 1个仲裁器,这在MMS btw上设置很棘手)并且它们都处于STARTUP2 "初始同步需要一个成员作为主要或次要来做我们的初始同步"

myReplicaSet:STARTUP2> rs.status()
{
        "set" : "myReplicaSet",
        "date" : ISODate("2015-01-17T21:20:12Z"),
        "myState" : 5,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "server1.mydomain.com:27000",
                        "health" : 1,
                        "state" : 5,
                        "stateStr" : "STARTUP2",
                        "uptime" : 142,
                        "optime" : Timestamp(0, 0),
                        "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                        "lastHeartbeat" : ISODate("2015-01-17T21:20:12Z"),
                        "lastHeartbeatRecv" : ISODate("2015-01-17T21:20:11Z"),
                        "pingMs" : 0,
                        "lastHeartbeatMessage" : "initial sync need a member to be primary or secondary to do our initial sync"
                },
                {
                        "_id" : 1,
                        "name" : "server2.mydomain.com:27000",
                        "health" : 1,
                        "state" : 5,
                        "stateStr" : "STARTUP2",
                        "uptime" : 142,
                        "optime" : Timestamp(0, 0),
                        "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                        "infoMessage" : "initial sync need a member to be primary or secondary to do our initial sync",
                        "self" : true
                },
                {
                        "_id" : 3,
                        "name" : "server3.mydomain.com:27000",
                        "health" : 1,
                        "state" : 5,
                        "stateStr" : "STARTUP2",
                        "uptime" : 140,
                        "lastHeartbeat" : ISODate("2015-01-17T21:20:12Z"),
                        "lastHeartbeatRecv" : ISODate("2015-01-17T21:20:10Z"),
                        "pingMs" : 0
                }
        ],
        "ok" : 1
}

为了解决这个问题,我使用了yaoxing的答案。我不得不在MMS上关闭ReplicaSet,并等待所有成员关闭。花了一段时间...... 然后,在所有这些上,我删除了数据目录的内容:

sudo rm -Rf /var/data/*

在此之后,我将ReplicaSet打开,一切都很好。