默认情况下 驱动程序会将所有的请求路由到主节点 这通常也是你需要的 但是也可以通过设置驱动程序的读取首选项(read preferences)配置其他选项 可以在读选项中设置需要将查询路由到的服务器的类型

 
虽然将读请求路由到到备份节点不是一个好主意 但是在特定的情况下这是有意义的 如果你正在考虑将读请求发送到备份节点 请先从下面几个方面好好权衡 
  1. 考虑一致性   对于一致性要求非常高的应用程序 不应该从备份节点读取数据 通常来说 备份节点的数据只会比主节点 落后几号秒 ,但是由于加载问题 配置错误 网络故障等原因 落后几分钟几个小时 几天也是有可能 但是客户端并不知道备份节点的数据有多新鲜 读取一个远远落后于主节点的数据 客户端不会觉得有任务问题  至于这些数据 是不是有问题这就需要你自己根据业务来判断了  如果应用程序需要读取他自己的写操作 那么就不要把读请求发给备份节点 后果自己想.因为客户端发送请求的速度可能会不备份节点复制操作要快 为了能够始终将写请求和读请求发给主节点  许多将读选项设置为Primary 默认就是这个选项 如果没有主节点 查询会出错误
  2. 考虑负载均衡 许多用户将请求发给备份节点 以便实现分布式的负载均衡 例如如果你的服务器每秒只能处理1000次查询 而你需要每秒3000次的查询 那么就需要设置几个备份节点 来分担一些数据加载的工作 这种做法很危险 容易系统意外过载  一旦出现这种情况 很难恢复 假如你遇到了上述情况 你决定创建拥有4个成员的副本集 每个备份节点的压力都在可承受范围内  整个系统也在正常运转 后来其中一个备份节点崩溃了.那么剩余的每个成员的负载都是100 如果需要恢复刚刚崩溃的成员 那么就需要从其他成员处复制数据 这个崩溃的成员换选择一个同步源 这样 这个作为同步源的成员的要过载 服务器过载晋朝导致新能变慢,副本集性能进一步降底 然后强制其他成员承担过多的负载 导致这些成员变得更慢 这是一个恶心循环, 如果能明确知道每台服务器能够承受的负载,你可能会觉得自己能够更好地因对这种情况 使用五台 而不是4台 这样即使1台崩溃 也不会过载 即使这样你也要处理其他服务器负载过大的情况 一个更好地选择就是用分片做分布式负载


读偏好(Read Preference)
 
读偏好描述了MongoDB客户端如何将读请求路由到副本集的成员。
 
默认情况下,一个应用会将其读操作导向副本集中的primary。从primary中读可以保证读操作返回的是最新的文档。如果一个应用不需要完全实时的数据,则可以通过分布一些或全部的读操作到副本集的secondary成员上,从而提高读操作的吞吐量或者降低时延。
 
MongoDB驱动允许客户端应用对于每个连接、每个collection或者每个操作进行读偏好设置。
读偏好模式同样对通过mongos连接分片簇的客户端有效。
注意:如果一个应用的读操作比例很大,则从secondary成员分布式读可以提高吞吐量。
 
读偏好模式:
primary
所有的读操作只访问当前副本集的primary,为默认模式。如果primary不可用,则读操作会产生一个error或抛出一个异常。
 
primaryPreferred [prɪ'fɜ:d]
在通常情况下,从副本集的primary上读数据,当primary不可用时,也就是在故障切换的过程中,从副本集的secondary成员上读数据。
 
secondary
读操作只从副本集的secondary成员上读数据。如果没有secondary可用,则产生一个error或者抛出一个异常。
 
secondaryPreferred
在通常情况下,读操作从secondary成员上读数据,但是当副本集中只有一个primary成员时,则从primary读数据。
 
nearest['nɪərɪst]
驱动从最近的集合成员中读数据时一个成员选择的过程。该模式不关注成员的类型,不管是primary还是secondary成员。
 
        为了做离线处理 你可能希望创建很多索引,但是又不想将这些索引创建在主节点上 这种情况下 可以设置一个与主节点拥有不同索引的备份节点,如果希望这样使用备份节点的话 最好使用驱动程序创建一个直接连接目标备份节点的连接 而不是连接副本集
 总结 应该根据应用程序的实际需求选择合适的选项 也可以多个选项组合使用
1,如果某些读请求必须从主节点读取数据,那就对这些请求使用Primary选项 
2,如果另一些请求并不要求数据是最新的,那么可以对这些读请求使用Primary preferred选项  
3,如果某些请求要求对延迟的要求打过一致性的要求 那么可以使用Nearest.

mongodb读写分离的一些选项的理解的更多相关文章

  1. 012.MongoDB读写分离

    一 读写分离概述 1.1 读写分离描述 从应用程序角度来看,使用Replica Set 和使用单台mongo很像.默认的驱动程序会连接primary节点,并且将所有读写请求都路由到主节点.但也可以通过 ...

  2. 实现MongoDB读写分离的“读偏好”介绍

    在某些情况下,将读请求发送给副本集的备份节点是合理的,例如,单个服务器无法处理应用的读压力,就可以把查询请求路由到可复制集中的多台服务器上.现在绝大部分MongoDB驱动支持读偏好设置(read pr ...

  3. MongoDB副本集(一主两从)读写分离、故障转移功能环境部署记录

    Mongodb是一种非关系数据库(NoSQL),非关系型数据库的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模 ...

  4. spring mongodb 复制集配置(实现读写分离)

    注:mongodb当前版本是3.4.3   spring连接mongodb复制集的字符串格式: mongodb://[username:password@]host1[:port1][,host2[: ...

  5. MongoDB如何实现读写分离

    MongoDB如何实现读写分离 MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对 ...

  6. mongodb的读写分离

    转自:http://blog.csdn.net/sd0902/article/details/21538621 mongodb的读写分离使用Replica Sets来实现 对于replica set ...

  7. Redis+MongoDB 最佳实践 做到读写分离 -摘自网络

    方案1. (被否定) 加上Redis,做到MongoDB的读写分离,单一进程从MongoDB及时把任务同步到Redis中. 看起来很完美,但是上线后出现了各种各样的问题,列举一下: 1.Redis队列 ...

  8. MongoDb的“not master and slaveok=false”错误及解决方法,读写分离

    首先这是正常的,因为SECONDARY是不允许读写的, 在写多读少的应用中,使用Replica Sets来实现读写分离.通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力 ...

  9. MongoDB的搭建并配置主从以及读写分离

    1.环境准备  1.Centos7 2.mongodb3.4.93.三台机器IP分别是:10.170.1.16.10.170.1.18.10.170.1.33 2.mongdb数据库的安装 如下操作是 ...

随机推荐

  1. maven学习(五)——maven命令的组合使用

    Maven的命令组合使用 maven的编译,清理,测试,打包,部署命令是可以几个命令同时组合起来使用的,常用的命令组合如下: 1.先清理再编译:"mvn clean compile" ...

  2. centos7下使用git

    问:为什么需要版本控制系统?[转:http://www.cnblogs.com/shenliang123/p/3824383.html] 版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情 ...

  3. HDU 4178 模拟

    Roll-call in Woop Woop High Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  4. Hadoop入门第三篇-MapReduce试手以及MR工作机制

    MapReduce几个小应用 上篇文章已经介绍了怎么去写一个简单的MR并且将其跑起来,学习一个东西动手还是很有必要的,接下来我们就举几个小demo来体验一下跑起来的快感. demo链接请参照附件:ht ...

  5. box-sizing重置

    html { /*-webkit-box-sizing: border-box; -moz-box-sizing: border-box;*/ box-sizing: border-box; } *, ...

  6. 地理课(geography)

    地理课(geography) 题目描述 地理课上,老师给出了一个巨大的地图,由于世界日新月异,会有一些道路在某一时刻被删除,也会有一些道路在某一时刻被修建.这里的道路均为双向的. 老师认为,有一些城市 ...

  7. 蔬菜(vegetable)

    蔬菜(vegetable) 题目描述 题目背景:您使用脚本刷出了上题游戏 998244353 关的最高分 (最优解),心满意足的准备点继续学习,忽然一条弹窗弹了出来:你想明白活着的意义吗?你想真正的. ...

  8. js 一/二维数组排序

    JavaScript中数组排序方法 用到的最多的当然是封装好的sort()方法了 一:sort()方法怎么使用? sort方法并不像我们想的那么容易使用,不是单纯的arr.sort()就行了,需要我们 ...

  9. 洛谷 P1342 请柬

    题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被雇来分发这些请 ...

  10. [LeetCode] Min Stack 栈

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...