2013-04-30 36 views
21

我正在運行的MongoDB副本中的3個節點設置,讓自己的IP的是192.168.1.100,192.168.1.101,192.168.1.102MongoDB如何知道副本集中的主數據庫服務器ip?

現在

在當前副本設置爲192.168.1.100小學和192.168.1.101和192.168.1.102是次要的,我的應用程序連接192.168.1.100進行寫入操作,2天后現在192.168.1.100關閉,mongodb選擇192.168.1.101作爲主要的。我的應用程序如何知道192.168.1.101是主要的。

它們是mongodb中的任何浮動ip概念,因此主服務器切換到副本集時不需要手動工作。

回答

7

當您的客戶端連接到副本集(「種子」)中的任何給定成員時,它將查詢集合中其他成員的副本集。所以如果你連接到.100,它會查詢該集合,並發現.101和.102也是該集合的有效成員。

如果驅動程序失去與.100的連接,它將運行它發現的其他種子並嘗試查找連接。一旦完成,它將查詢副本集,找出當前主人是誰,然後連接到它。這一切都透明。

您可以通過登錄到主機和運行以下測試:

rs.stepDown(60) 

這將導致機器下臺作爲主(和導致要選出新的主站)。它不會有資格在60秒內連任。您可以在主節點更改的情況下使用它來測試應用程序的行爲。

當您設置副本集連接時,您通常會指定多個要連接的主機。這些都是驅動程序用於映射副本集的種子,因此,如果在配置的單個主機關閉的情況下重新啓動應用程序,則沒有單點故障。具體情況取決於您使用的驅動程序 - 請檢查您的驅動程序文檔。

+0

大家好,如何測試使用蒙戈命令行這事。正如我想通過使用mongo命令行來測試這一點,是否有任何方法可以通過它使用mongo命令行連接副本集。 – Rajnish 2013-05-02 11:32:46

+0

如果您使用的是命令行,請確保使用副本集連接進行連接,例如。 mongo「replSetName/member1:27017,member2:27017,member3:27017」。 – slee 2013-05-06 19:51:54

17

顯然,您應該可以使用您的「驅動程序」(mongo cli工具或您首選的語言綁定,ex node-mongo)連接到副本集的任何成員。一旦連接成功,就問當前的mongod服務爲一組的其他成員:

> db.runCommand("ismaster") 
{ 
    "ismaster" : false, 
    "secondary" : true, 
    "hosts" : [ 
      "ny1.acme.com", 
      "ny2.acme.com", 
      "sf1.acme.com" 
    ], 
    "passives" : [ 
      "ny3.acme.com", 
      "sf3.acme.com" 
    ], 
    "arbiters" : [ 
     "sf2.acme.com", 
    ] 
    "primary" : "ny2.acme.com", 
    "ok" : true 
} 

爲我用,重要的是不要連接到主是非常重要的。就像OP一樣,我想盡量減少查找次要成員所需的連接數量。這種方法應該適合你,但這裏的文檔可能有點過時。

http://docs.mongodb.org/meta-driver/latest/legacy/connect-driver-to-replica-set/

3

要弄清楚哪些是當前的主服務器的IP運行命令行:

rs.status().members.find(r=>r.state===1).name 

根據您的應用程序的堆棧和驅動程序,您可能需要在副本中,以指定的所有主機它自動選擇主要的寫入。

1

rs.isMaster().primary

如果你到一個襯墊,得到任何蒙戈實例和運行

相關問題