在mongodb中跨副本分发读取

Kev*_*vin 6 mongodb

我试图理解mongodb副本集中的读取行为.特别是我的环境具有高读取率,低写入率和相对较小的数据集(比如小于8GB).我有一个3节点副本集.

我看了这个文件:

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

特别是:

主要默认模式.所有操作都从当前副本集主要读取.

primaryPreferred在大多数情况下,操作从主数据库读取,但如果不可用,则从辅助成员读取操作.

secondary所有操作都从副本集的辅助成员中读取.

secondaryPreferred在大多数情况下,操作从辅助成员读取,但如果没有辅助成员可用,则从主要成员读取操作.

最近的操作从副本集的最近成员读取,无论成员的类型如何.

所以我的理解是默认情况下读取主要内容.有读取首选项允许从辅助(secondary,和secondaryPreferred)读取.在这些情况下,可以提供陈旧的数据.

在我看来,最好是在主机和辅助机器上分配读取,以便我可以最好地利用所有3台机器.但我并不认为这是一个选择.以下声明特别困扰我:

如果读取操作占应用程序流量的很大一部分,则向次要成员分发读取可以提高读取吞吐量.但是,在大多数情况下,分片可以为更大规模的操作提供更好的支持,因为群集可以在一组机器上分配读写操作.

但是,在数据集相对较小的情况下,分片根本没有意义.有人可以对正确的配置有所了解吗?

Jai*_*ash 0

我能够使用标签参考来部分解决该问题https://docs.mongodb.com/manual/tutorial/configure-replica-set-tag-sets/

conf = rs.conf()
conf.members[1].tags = { "tagType": "dummyValue"}
rs.reconfig(conf)
Run Code Online (Sandbox Code Playgroud)

在每台辅助计算机上设置自定义标签,并使用标签集定义不同的 mongo 模板(我使用 Spring Mongo)(https://docs.mongodb.com/manual/core/read-preference/#tag -套

<bean id="tag" class="com.mongodb.Tag">
    <constructor-arg value="tagType" />
    <constructor-arg value="dummyValue" />
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

使用不同的 mongo 模板手动分配调用,因此是在辅助 mongo 服务器上分配负载的部分解决方案。