【问题标题】:MongoError: no primary found in replicasetMongoError:在副本集中找不到主节点
【发布时间】:2018-05-17 02:06:57
【问题描述】:

我有 2 个应用服务器,它们连接到一个副本集(Primary、Secondary 和 Arbitrer)。

我面临的问题是

 [ 'MongoError: no primary found in replicaset',
  '    at ../server/node_modules/mongodb-core/lib/topologies/replset.js:524:28',
  '    at null.<anonymous> (../server/node_modules/mongodb-core/lib/topologies/replset.js:303:24)',
  '    at g (events.js:260:16)',
  '    at emitOne (events.js:77:13)',
  '    at emit (events.js:169:7)',
  '    at null.<anonymous> (../server/node_modules/mongodb-core/lib/topologies/server.js:326:21)',
  '    at emitOne (events.js:77:13)',
  '    at emit (events.js:169:7)',
  '    at null.<anonymous> (../server/node_modules/mongodb-core/lib/connection/pool.js:270:12)',
  '    at g (events.js:260:16)',
  '    at emitTwo (events.js:87:13)',
  '    at emit (events.js:172:7)',
  '    at Socket.<anonymous> (../server/node_modules/mongodb-core/lib/connection/connection.js:175:49)',
  '    at Socket.g (events.js:260:16)',
  '    at emitOne (events.js:77:13)',
  '    at Socket.emit (events.js:169:7)',
  '    at connectErrorNT (net.js:996:8)',
  '    at nextTickCallbackWith2Args (node.js:442:9)',
  '    at process._tickCallback (node.js:356:17)' ]

应用上的 ReplicaSet 配置:

 "mongodb" : { 
      "replicaset": {
       "db"       : "test",
       "user"     : "admin",
       "password" : "*********",
       "name":"rs1",  
       "replicas": [{"host":"App1Box.dmz.mytest.com.au","port":27017}, {"host":"App2Box.dmz.mytest.com.au","port":27018}]  
      } 

rs.status() 输出

rs1:PRIMARY> rs.status()
{
        "set" : "rs1",
        "date" : ISODate("2018-05-17T03:50:01Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 2,
                        "name" : "App3Box:27018",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",
                        "uptime" : 7180,
                        "lastHeartbeat" : ISODate("2018-05-17T03:50:00Z"),
                        "lastHeartbeatRecv" : ISODate("2018-05-17T03:50:00Z"),
                        "pingMs" : 0
                },
                {
                        "_id" : 3,
                        "name" : "App2Box:27018",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 7528,
                        "optime" : Timestamp(1526521846, 1),
                        "optimeDate" : ISODate("2018-05-17T01:50:46Z"),
                        "electionTime" : Timestamp(1526521798, 1),
                        "electionDate" : ISODate("2018-05-17T01:49:58Z"),
                        "self" : true
                },
                {
                        "_id" : 4,
                        "name" : "App1Box:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 7139,
                        "optime" : Timestamp(1526521846, 1),
                        "optimeDate" : ISODate("2018-05-17T01:50:46Z"),
                        "lastHeartbeat" : ISODate("2018-05-17T03:50:01Z"),
                        "lastHeartbeatRecv" : ISODate("2018-05-17T03:50:01Z"),
                        "pingMs" : 0,
                        "syncingTo" : "App2Box:27018"
                }
        ],
        "ok" : 1
}

但是,我只能从连接到 MongoDB 的应用服务器之一(例如 App1Box)中看到这一点。我在 App2Box 上没有看到这个问题。

我已经尝试从replicaSets中删除成员并重新添加,问题仍然存在。

Mongo 版本:2.6.8 节点版本:4.4.3 npm 版本:3.8.9

我可以从 mongo 控制台看到 replicaSet 中的所有成员,同时在主要和辅助上执行 rs.status()。

感谢您的帮助。

【问题讨论】:

  • 显示正在从您的节点应用程序使用的连接字符串。还显示rs.status() 并检查您是否可以实际访问客户端的rs.status() 输出中定义的主机名。您要么没有在应用程序连接中使用 replicaSet 选项,要么您的副本集被错误配置为仅使用“内部”主机名,这些主机名在您的客户端应用程序中不可见。
  • 将信息添加到帖子中。
  • 该配置不是有效的连接字符串。显示对MongoClient.connect() 的实际调用以及您如何通过该对象的任何部分进行发送。我还看到"App1Box.dmz.mytest.com.au" 而你的rs.status() 只显示App1Box。我想如果您只是 ping App1Box 而没有 FQDN,那么您将一无所获。副本集上的配置是驱动程序使用的,而不是“种子列表”,这是另一回事。
  • 请参阅驱动程序参考文档中的Ensuring Your Connection String is Valid for Replica Sets
  • 感谢您的帮助。现在将种子列表更改为完全限定的 DNS 后,我看不到此问题发生。

标签: mongodb mongodb-replica-set


【解决方案1】:

发现问题是在向副本集添加成员时未使用完全限定的 DNS 名称。感谢@Neil Lunn。

【讨论】:

    【解决方案2】:

    1)请检查您的连接字符串是否包含以下链接中的所有数据库服务器名称 https://docs.mongodb.com/manual/reference/connection-string/#standard-connection-string-format

    2) 进行故障转移 为此,请登录主节点并执行以下命令

    rs.stepDown()
    

    【讨论】:

    • 以上点不是问题。不过谢谢你的回复。问题在于未使用完全限定的 DNS 名称。
    猜你喜欢
    • 2017-02-01
    • 2022-01-19
    • 2023-04-01
    • 2020-12-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2020-10-13
    相关资源
    最近更新 更多