2014-01-16 24 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服务器上分配负载。