【问题标题】:Mongodb, all replSet stuck at Startup2Mongodb,所有replSet都卡在Startup2
【发布时间】:2014-02-08 05:34:32
【问题描述】:

我有 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

如何解决这个问题?

【问题讨论】:

  • 首先,我不确定您是否可以手动进行首次同步。我已经阅读了 MongoDB 手册的所有副本部分,这在任何地方都没有讨论。无论如何这并不重要,您首先应该确保 node0 仍然作为“主要”运行。假设从日志消息来看,我认为不是。

标签: mongodb replication


【解决方案1】:

编辑 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. 停止节点0
  2. 转到 node0 的数据文件夹(在我的机器上是 /var/lib/mongodb。在位于 /etc/mongodb.conf 的配置文件中找到你的)
  3. 从文件夹中删除 local.*。注意
    1. 即使您备份了这些文件,这也是可撤消的。
    2. 您将丢失本地数据库中的所有用户。
  4. 启动 node0,您会看到它作为独立节点运行。

然后关注mongodb manual重新创建副本集

  1. 运行 rs.initiate() 初始化副本集
  2. 将node1添加到副本集:rs.add("node1域名");

恐怕您将不得不花费很长时间等待同步完成。然后你就可以走了。

我强烈建议再添加一个仲裁器来避免这种情况。

所以,以上是解决您的问题的官方方法,这就是我使用 MongoDB 2.4.8 的方式。我没有找到任何文件来证明这一点,所以绝对有 NO 保证。你自己承担风险。无论如何,如果它不适合您,请退回到官方方式。值得一试;)

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

    { “_id”:“rs0”, “版本”:5, “成员”:[{ “_id”:0, “主机”:“节点0” }, { “_id”:1, “主机”:“节点 1” }] }

你应该把它改成

{
    "_id": "rs0",
    "version": 5,
    "members": [{
        "_id": 0,
        "host": "node0"
    }]
}
  1. 使用 replSet=[set name] 重新启动,您应该会看到 node0 再次成为主节点。
  2. 使用 rs.add 命令将 node1 添加到副本集。

就是这样。如果您有任何问题,请告诉我。

【讨论】:

  • 谢谢你的回答,但是我没有机会尝试上面的解决方案,我的老板用数据重建了复制集,现在它可以工作了。
  • 至少你下次有更多选择:)别忘了尽快添加仲裁器,否则你可能会再次遇到同样的情况。
【解决方案2】:

我在使用彩信时遇到了同样的问题。我创建了一个由 3 台机器组成的新 ReplicaSet(2 个数据 + 1 个仲裁器,在 MMS 上设置起来很棘手),它们都在 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,一切都很好。

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 2023-03-11
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多