2013-05-13 117 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,負載或其他指標 - 並且實際上應該由隨機或一些不公平的歧視性策略處理所有默認副本集。 即使沒有技術,默認副本集上的主節點在某個時刻也會發生死鎖,從而導致它不可用。我認爲一個重大失敗。