2013-12-19 85 views
0

我有一個配置有3個副本的mongodb replicaset。我的配置是Mongoid 3和Mongodb查詢輔助查詢的具體查詢

 

staging: 
    sessions: 
    default: 
     hosts: 
     - xx.x.x.xxx:27017 
     - xx.x.x.xxx:27017 
     - xx.x.x.xxx:27017 
     database: mongoid_staging 
     options: 
     consistency: strong 
    options: 
    allow_dynamic_fields: false 
    identity_map_enabled: true 
    include_root_in_json: false 
    include_type_for_serialization: true 
 

此配置將確保我所有的寫入和讀取總是指向主因爲strong一致性。我怎樣才能將特定的閱讀查詢路由到輔助節點?

或者換句話說,如何確保某些讀取只能從主要進行?

我使用的是Mongoid 3.0.0和Mongodb 2.2.6。這甚至有可能嗎?這篇文章說,它可以用Mongoid 3做,但我找不到,告訴我任何事情如何 - https://groups.google.com/forum/#!topic/mongoid/pTa4eAWv7gM

第二個問題:

可以在單獨的應用程序連接到次級的一個在replicaset並使用它作爲其獨立的主要?

+0

對於第二個使用輔助節點作爲主節點的問題:這是不可能的。一個'mongod'服務器只能有一個主動角色,並且不能成爲多個副本集的一部分。 – Stennie

回答

0

首先,我想你明白讀寫不同副本的後果。你不能保證一致性。這意味着你在輔助閱讀的內容可能不是最新的。在同一過程中執行不同副本的讀取和寫入操作使其更具挑戰性。

還請注意,您不應該使用輔助作爲一種方式來卸載主要。危險之處在於,如果小學生倒下,二等學校可能無法承受全部負擔。

我不是ORM的粉絲,特別是對於MongoDB,如果你使用像支持Map/Hashes/Dicts的Ruby語言,甚至更少。使用ORM可以讓您對使用MongoDB的功能失去控制權,並顯示出較弱的性能。

MongoDB的本地Ruby驅動程序可以選擇讀寫的首選源。這就是所謂的「閱讀優先」,你可以閱讀更多關於這個問題:

https://github.com/mongodb/mongo-ruby-driver/wiki/Read-Preference 
http://docs.mongodb.org/manual/core/read-preference/ 

我不熟悉Mongoid,但你可能想嘗試傳遞一個額外的參數爲「找到()」中,類似於Ruby驅動程序的方式。例如,對'find()'的調用如下所示:

find({:doc => 'foo'}, :read => :secondary)