我试图理解mongodb副本集中的读取行为.特别是我的环境具有高读取率,低写入率和相对较小的数据集(比如小于8GB).我有一个3节点副本集.
我看了这个文件:
http://docs.mongodb.org/manual/core/read-preference/
特别是:
主要默认模式.所有操作都从当前副本集主要读取.
primaryPreferred在大多数情况下,操作从主数据库读取,但如果不可用,则从辅助成员读取操作.
secondary所有操作都从副本集的辅助成员中读取.
secondaryPreferred在大多数情况下,操作从辅助成员读取,但如果没有辅助成员可用,则从主要成员读取操作.
最近的操作从副本集的最近成员读取,无论成员的类型如何.
所以我的理解是默认情况下读取主要内容.有读取首选项允许从辅助(secondary,和secondaryPreferred)读取.在这些情况下,可以提供陈旧的数据.
在我看来,最好是在主机和辅助机器上分配读取,以便我可以最好地利用所有3台机器.但我并不认为这是一个选择.以下声明特别困扰我:
如果读取操作占应用程序流量的很大一部分,则向次要成员分发读取可以提高读取吞吐量.但是,在大多数情况下,分片可以为更大规模的操作提供更好的支持,因为群集可以在一组机器上分配读写操作.
但是,在数据集相对较小的情况下,分片根本没有意义.有人可以对正确的配置有所了解吗?
我能够使用标签参考来部分解决该问题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 服务器上分配负载的部分解决方案。
| 归档时间: |
|
| 查看次数: |
749 次 |
| 最近记录: |