参考官网这里:

Connection String URI Format — MongoDB Manual

Read Preference — MongoDB Manual

对于分布式数据库(多节点),更好的实现数据隔离、以及数据读策略的多样化。

1、readPreference

readPreference 主要控制客户端driver从副本集(Replica Set)读数据的时候如何路由,如下图。这个特性可以方便的配置读写分离、就近去读等策略。

各个配置的含义如下:

(1)primary:只主(默认模式)。只从primary节点读数据。

(2)primaryPreferred:先主后从。优先从primary读取,primary不可用时从secondary读。

(3)secondary:只从。只从副本集中secondary节点读数据。

(4)secondaryPreferred:先从后主。优先从secondary读取,如果secondary不可用时就从primary读。

(5)nearest:就近。根据网络距离,就近读取,根据客户端与服务端的PingTime是实现。

2、使用readPreference需要知道的一些点

(1)除了primary模式以外的其他模式可能返回的数据都不是那么实时,因为从primary进行副本操作到secondary是异步操作。因此在你选中primary以外模式的时候请确保你的程序能够忍受这种stale(不新鲜)。

(2)当然也可以通过设置一些选项(如maxStalenessSeconds)来避免从secondary节点读出来的数据过于“stale”。

        该选项不适应于primary模式,这个比较好理解只有选择从节点成员读取操作才能应用。当选择使用maxStalenessSeconds进行读操作,客户端会通过比较从节点和主节点的最后一次写时间来估计从节点的过期程度;客户端会把链接指向估计落后小于等于maxStalenessSeconds的从节点。另外需要注意的是选项值要大于等于90秒,较小的值可能会刨异常。客户端通过定期检查每个副本集成员的最后一次写操作时间估计过期程度,因为检查不频繁,所以只是一个相对粗略的估计。

3、readPreference的使用

(1)通过mongodb连接串参数指定

mongodb://mongouser:qiyeqq%40mongo@11.222.6.220:27017/?readPreference=secondaryPreferred

(2)mongodb驱动程序API

MongoCollection.withReadPreference(ReadPreference readPref)

(3)mongo shell

db.collection.find().readPref(“secondary”)

4、配置效果

(1)不配置的情况下默认是只从primary读。其效果是压测的时候primary节点cpu特别高,但secondary节点cpu几乎没有占用。显然资源没有得到充分利用,压出来的qps不好看。

(2)配置readPreference后从节点的cpu占用瞬间上来了。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐