2017-07-06 36 views
0

這不是關於詢問mongo集羣的一個基本問題。這不是在我看來 重複我有一個MongoDB的3節點集羣和我的網址是大意如下的PlayFramework的conf文件的東西Mongodb集羣和初級關閉時從輔助節點讀取

mongodb.uri = "mongodb://mongodb1:27017,mongodb2:27017,mongodb3:27017/myproj" 

默認情況下,當副本配置,所有的讀取和寫入只發生在小學,這就是我想要的。但是,我希望在沒有主節點離開時讀取次要節點,也就是說,當兩個節點關閉時,不會有主節點剩餘,只有一個次節點。

我不想修改我的代碼來爲每個讀取查詢實現此目的。我在輔助節點上嘗試了以下操作,但它並沒有幫助

db.getMongo().setReadPref('primaryPreferred') 

我需要做什麼才能使其工作?

+0

如果出的「二」,「三」結點往下走,然後在副本集將簡單在進一步干預之前不可用於操作。有關整個主題的大量手動部分。索引在[複製](https://docs.mongodb.com/manual/replication/) –

+1

不完全正確。副本集將不會有一個主要的協議,我知道這一點。輔助將仍然存在。如果我盲目地標記rs.slaveOK(),我仍然可以閱讀它,但我不想這樣做。我希望剩下的第二個只允許讀取沒有主要的讀取 – curiousengineer

+0

從您的「應用程序代碼」的角度來看,它是真實的。有關此主題的其他內容都需要DBA干預。因此成爲更適合[dba.stackexchange.com](http://dba.stackexchange.com)的問題,因爲這與應用程序代碼無關。以類似的方式,您也可以手動「提升」其餘節點。但是,再次,DBA問題。 「代碼」答案是「它不應該在乎」。 –

回答

2

我不想修改我的代碼來爲每個讀取查詢實現此目的。我試過輔助節點以下,但它並不能幫助:

db.getMongo().setReadPref('primaryPreferred') 

你在正確的軌道與讀的喜好,但需要設置您的連接字符串或驅動程序英寸在mongo shell中設置讀取首選項只會影響當前的shell會話,並且不會影響遠程連接。

mongodb.uri = 「的MongoDB:// mongodb1:27017,mongodb2:27017,mongodb3:27017 /的Myproj」

您需要添加一些額外的參數,按MongoDB的Connecting String URI Format

  • (必填)replicaSet=...選項表示驅動程序應該使用「副本集」連接模式,而不是默認的直接連接模式。此參數啓用副本集監視,讀取首選項以及發現拓撲更改。提供的副本集名稱必須與爲您的部署配置的replica set name匹配。有關正式支持的MongoDB驅動程序預期的連接行爲的完整詳細信息,請參閱Server Discovery and Monitoring (SDAM)規範。規範中的rationale部分包含關於所選方法的常見問題的答案。
  • (必填)readPreference=primaryPreferred選項指示首選從主服務器讀取,但如果沒有主服務器可用,則使用輔助服務器。
  • (可選)在MongoDB 3.4+中,您可以指定一個maxStalenessSeconds=...選項,該選項限制使用輔助讀取首選項時的最大複製滯後(或失效)。默認情況下,不存在最大過時性,因此,根據讀取首選項選擇輔助時,驅動程序不會考慮複製延遲。如果您的意圖是使用primaryPreferred作爲讀取的故障轉移選項,我會謹慎設置最大過期:您需要確保您至少有一個具有可接受過期的次級。

因此,假設的mongocluster一個副本集名稱和myproj數據庫建議的連接字符串是:

mongodb://mongodb1:27017,mongodb2:27017,mongodb3:27017/mypr‌oj?replicaSet=‌mongocluster&readPreference=primaryPreferred 
+0

Hi @Stennie,我在播放日誌中看到了這個,這是否意味着我運氣不好? reactivemongo.api.MongoDriver - 有些選項被忽略,因爲它們不被支持(還):replicaSet 此外,我試着閱讀鏈接,瞭解爲什麼replicaSet真的需要但不是很清楚爲什麼。無論哪種方式,我會假設你的建議,這是強制性的,但是被玩家框架忽略了嗎? – curiousengineer

+0

@curiousengineer您使用的MongoDB驅動程序和版本以及Play Framework的哪個版本?關於副本集連接,區別在於驅動程序如何發現和監視拓撲。 SDAM規格是重讀的,但在較高級別有三類連接拓撲(獨立,副本集或分片)。如果沒有'replicaSet'參數,您通常會以'Standalone'模式連接到指定的第一個主機(即沒有發現或監控副本集配置,並且不支持讀取首選項)。 – Stennie

+0

我正在使用Mongodb 3.4(碼頭集裝箱圖像)。我的播放版本是addSbtPlugin(「com.typesafe.play」%「sbt-plugin」%「2.5.10」)所以我猜測它是2.5.10 當你說Mongodb驅動程序版本時,我不知道我怎麼做我知道。但是因爲我們使用了反應式mongo,所以這裏是依賴於那個「org.reactivemongo」%%「play2-reactivemongo」%「0.12.0」 – curiousengineer

相關問題