2013-05-13 118 views
5

我试图连接到远程MongoDB。我用当地的mongodb开发了我的应用程序。现在我将应用程序部署到开发工具并配置了开发mongodb。我收到以下例外情况。mongodb java驱动程序 - com.mongodb.MongoException:找不到主人

Caused by: com.mongodb.MongoException: can't find a master 
    at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:509) 
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:266) 
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:289) 
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:274) 
    at com.mongodb.DBCursor._check(DBCursor.java:368) 
    at com.mongodb.DBCursor._hasNext(DBCursor.java:459) 
    at com.mongodb.DBCursor.hasNext(DBCursor.java:484) 

有趣的是,我可以连接到开发的MongoDB从我的本地应用程序副本集服务器地址,但是当我尝试让应用程序(deplyed到DEV)连接到开发的MongoDB,我看到上面的错误。

我想知道是否有谁遇到同样的问题并解决它。

+0

在mongoURI中,您是否传递了副本群集的正确主要主机? – 2013-05-13 18:17:24

+0

是的。它是。也许它与连接问题有关,而不是配置问题。错误消息看起来有些误导。 – user826323 2013-05-13 18:30:29

+0

连接问题,您可以通过运行应用程序的主机通过使用mongo shell连接到远程mongoDB来轻松检查。 – 2013-05-13 18:37:25

回答

1

mongodb的这个混杂的方面与它的voting policy中的政治学原理相冲突。

这是它是如何发生的。

  • 存在副本集;它必须有奇数个投票节点。
  • 主节点因服务器/网络故障或关闭而失败。其他节点也可能失败,但最重要的是...
  • 偶数个节点仍然没有主节点。
  • 其余偶数个节点无法在主节点上定位,陷入政治僵局(又名hung parliament,没有多数)。
    • 重选发生,但小学仍然失败;它的另一个僵局。在这里循环。

一种解决方案是通过分配权重的投票,使得考生不再等于动摇选举。在蒙戈世界,这是通过将priority分配给成员完成的。

优先级比较优先级设置影响选举。会员 将优选为具有最高优先级值的成员投票。

一个通过输入蒙戈壳(上admin)和更新rs.conf

cfg = rs.conf() 
cfg.members[0].priority = 100 
cfg.members[1].priority = 99 
cfg.members[3].priority = 98 
rs.reconfig(cfg) 

在这种配置下,当主构件0失败,则部件1将被选为主要执行此操作。

这里有一些很好的链接:

http://docs.mongodb.org/manual/core/replica-set-elections/

http://docs.mongodb.org/manual/core/replica-set-architecture-four-members/

最后,这种情况是与像可用性组技术,云架构很常见的,即扩大和向下 - 通过时间,CPU,负载或其他指标 - 并且实际上应该由随机或一些不公平的歧视性策略处理所有默认副本集。 即使没有技术,默认副本集上的主节点在某个时刻也会发生死锁,从而导致它不可用。我认为一个重大失败。