2014-01-16 57 views
4

整個副本讀我想了解的行爲在MongoDB中的副本集讀取。特別是我有一個讀取速度快,寫入速度低,數據量相對較小(比如小於8GB)的環境。我有一個3節點副本集。分佈在MongoDB中

我閱讀本文件:

http://docs.mongodb.org/manual/core/read-preference/

特別是:

主默認模式。所有操作都從當前副本集中讀取。

primaryPreferred在大多數情況下,操作從初級讀取,但如果它是不可用的,操作從次要部件讀出。

次級所有操作從副本集的次要部件讀出。

secondaryPreferred在大多數情況下,操作從次要構件讀取但如果沒有二次部件是可用的,操作從初級讀取。

最近的操作從副本集的最近的構件讀取,而不論該成員的類型的。

所以我的理解是,默認讀取轉到主要。有閱讀偏好設置,允許從中讀取(secondarysecondaryPreferred)。在這些情況下,可能會提供陳舊的數據。

在我看來,最好是將讀數分佈在主機和輔助機器上,這樣我可以在所有3臺機器上最好地使用它。但我並不認爲這是一種選擇。尤其是下面的語句困擾我:

如果讀操作佔了你的應用程序的流量的很大比例,分配讀取二次會員可以提高讀取吞吐量。但是,在大多數情況下,分片可以爲更大規模的操作提供更好的支持,因爲集羣可以在一組機器上分配讀寫操作。

但是,在數據集相對較小的情況下,分片根本沒有意義。有人可以闡明正確的配置嗎?

+0

爲什麼你想分配讀取到輔助?這聽起來像主要可能能夠滿足您的需求就好了。 –

+0

是什麼讓你覺得呢?它能夠每秒處理1K查詢(顯然具有低延遲)?每秒10K查詢呢?無論我的流量負載如何,在某一點上,一臺機器無法處理它,然後我想要在整個機器上分配流量。 – Kevin

+1

當然,我測試過可以處理30K讀/秒的系統。您擴展或分發的方式不是通過輔助,而是通過分片。 –

回答

0

我能夠部分地解決這個問題,使用標籤引用https://docs.mongodb.com/manual/tutorial/configure-replica-set-tag-sets/

conf = rs.conf() 
conf.members[1].tags = { "tagType": "dummyValue"} 
rs.reconfig(conf) 

自定義標籤設置在每個副機的,和不同蒙戈模板(我使用Spring蒙戈)使用規定標籤集(https://docs.mongodb.com/manual/core/read-preference/#tag-sets

<bean id="tag" class="com.mongodb.Tag"> 
    <constructor-arg value="tagType" /> 
    <constructor-arg value="dummyValue" /> 

<bean id="tagSet" class="com.mongodb.TagSet"> 
    <constructor-arg ref="tag" /> 
</bean> 

<bean id="readPref" class="com.mongodb.ReadPreference" 
     factory-method="secondaryPreferred" > 
     <constructor-arg ref="tagSet" /> 
</bean> 

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> 
     <constructor-arg name="mongoDbFactory" ref="mongoFactory" /> 
     <property name="readPreference" ref="readPref" /> 
     <property name="writeConcern" value="JOURNALED" /> 
    </bean> 

這些呼叫是使用不同的mongo模板手動分配的,因此也是部分解決方案,用於在輔助mongo服務器上分配負載。