在某些情况下,将读请求发送给副本集的备份节点是合理的,例如,单个服务器无法处理应用的读压力,就可以把查询请求路由到可复制集中的多台服务器上。现在绝大部分MongoDB驱动支持读偏好设置(read preference;或翻译为读取首选项),用来告诉驱动从特定的节点读取数据。

1  读偏好选项

primary — 这是默认的设置,表明只从可复制集的主节点读取数据,因此具有强一致性。如果可复制集有问题,并且没有可选举的从节点,就表示出现错误。

premaryPreferred — 设置了此参数的驱动会从主节点读取数据,除非某些原因使主节点不可用或者没有主节点,此时它会从从节点读取数据。此种设置下,读请求无法保证一致性。

secondary — 这个设置告诉驱动应该一直从从节点读取数据。这种设置对于我们想确保读请求不会影响主节点的写入请求时非常有用。如果没有可用的从节点,读请求会抛出异常。

secondarypreferred—读请求会发出到从节点,除非没有从节点可用,此时才会从主节点读取。

nearest –驱动会尝试从最近的可复制集成员节点读取读取数据,通过网络延迟判断。可以是主节点也可以是从节点。因此读请求只会发送给驱动认为最快通信的节点。

primary是唯一一个可以确保读一致的模式。因为写请求首先在主节点完成,从服务器的更新会有些延迟,所以可能在从节点无法找到刚刚在主节点写入的文档数据。

汇总以上知识,各偏好设置下读取数据请求所发往的节点如下所示:

2  最大过期时间

MongoDB 3.4及更新的版本新增了maxStalenessSeconds设置。

副本集的从节点可能因为网络阻塞、磁盘吞吐低、长时间执行操作等,导致其落后于主节点。读设置maxStalenessSeconds选项让你对从节点读取定义了最大落后或“过期”时间。当从节点估计过期时间超过了maxStalenessSeconds,客户端会停止使用它进行读操作。

最大过期和primary模式不匹配,只有选择从节点成员读取操作才能应用。

当选择了使用maxStalenessSeconds进行读操作的服务端,客户端会通过比较从节点和主节点的最后一次写时间来估计从节点的过期程度。客户端会把连接指向估计落后小于等于maxStalenessSeconds的从节点。如果没有主节点,客户端使用从节点间的最近一次写操作来比较。

默认是没有最大过期时间并且客户端也不会在指向读操作时考虑从节点的落后。

必须定义maxStalenessSeconds的值大于等于90秒:定义一个更小的值会抛出异常。客户端通过定期检查每个副本集成员最后一次写时间来估计副本集过期程度。因为检查不频繁,所以估计是粗略的。因此,客户端不能强制maxStalenessSecconds小于90秒。

3  连接字符串格式

副本集连接字符串格式

mongodb://username:password@host1:port1,host2:port2[,...,hostN:portN]/database?options

options是连接配置中的可选项,replicaSet、readPreference、maxStalenessSeconds是其中的一个子项。

下面我们举一个例子来说明字符串是怎么配置的,测试环境的副本集信息如下:

副本集名称

节点角色

节点IP

端口

Reptest

主服务器

172.171.X.XX1

27017

副本节点

172.171.X.XX2

27017

仲裁节点

172.171.X.XX3

27017

账号信息如下:

Username

Password

DBName

mongousertest

testuserpwd

mongotestdb

如果希望程序读请求路由到从节点secondary,100秒为节点数据失效时间,此时C#程序中connectionStr的字符串可以设置如下:

stringconnectionStr = "mongodb://mongousertest:testuserpwd@172.171.x.xx1:27017,172.171.x.xx2:27017/mongotestdb?replicaSet=reptest&readPreference=secondary&maxStalenessSeconds=100";

 本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

 

实现MongoDB读写分离的“读偏好”介绍的更多相关文章

  1. MySQL数据库读写分离、读负载均衡方案选择

    MySQL数据库读写分离.读负载均衡方案选择 一.MySQL Cluster外键所关联的记录在别的分片节点中性能很差对需要进行分片的表需要修改引擎Innodb为NDB因此MySQL Cluster不适 ...

  2. Mysql - 读写分离与读负载均衡之Maxscale

    一.概述 常见的高可用方案如MMM和MHA等都将重点放在主库上,一旦主库出现故障,通过这些方案能将主库故障进行转移. 本文将给大家介绍一款由mariadb公司出品的中间件Maxscale,该中间件能实 ...

  3. 采用Atlas+Keepalived实现MySQL读写分离、读负载均衡【转载】

      文章 原始出处 :http://sofar.blog.51cto.com/353572/1601552 ============================================== ...

  4. Atlas+Keepalived实现MySQL读写分离、读负载均衡

    一.基础介绍 ========================================================================================== 1. ...

  5. 采用Atlas+Keepalived实现MySQL读写分离、读负载均衡

    ========================================================================================== 一.基础介绍 == ...

  6. 012.MongoDB读写分离

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

  7. mongodb读写分离的一些选项的理解

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

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

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

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

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

随机推荐

  1. BUGKU-逆向(reverse)-writeup

    目录 入门逆向 Easy_vb Easy_Re 游戏过关 Timer(阿里CTF) 逆向入门 love LoopAndLoop(阿里CTF) easy-100(LCTF) SafeBox(NJCTF) ...

  2. 客户端通过Feign发起请求 服务端通过request取 json对象

    @RestController @RequestMapping(value = "test") public class TestServer { @RequestMapping( ...

  3. Spring Boot druid监控页添加登录访问权限(用户名+密码)

    需求 druid作为数据源的一名后起之秀,凭借其出色的性能,渐渐被大家使用.当然还有他的监控页面也有这非常大的作用.但是监控页面往往包含了很多隐私的数据信息,所以需要将其保密,所以可以为监控页面添加一 ...

  4. 深入解析 H.265 编码模式,带你了解Apple全面推进H.265的原因

    今天我们聊聊视频编码.视频文件亘古以来存在一个矛盾:高清画质和视频体积的冲突,相同编码标准下,视频更高清,视频体积更大.因此,应用更先进的视频编码标准,降低视频体积,可以大幅降低网站的流量消耗. 目前 ...

  5. PHP分页倒序时,需要注意的问题

    PHP分页倒序请求,如果有新数据加入,下一页会出现重复数据 解决方案: 第一次查询时,给前端返回一个查询时间戳,下一次请求时,把时间戳带过来,只查询比这个时间戳小的数据

  6. C#版 - 小红书后台开发面试题: 二维数组中的查找

    二维数组中的查找 热度指数:24274 时间限制:1秒 空间限制:32768K 本题知识点: 查找 ​ 在线提交网址: http://www.nowcoder.com/practice/abc3fe2 ...

  7. Lucene 06 - 使用Lucene的Query API查询数据

    目录 1 Query对象的创建(方式一): 使用子类对象 1.1 常用的Query子类对象 1.2 常用的Query子类对象使用 1.2.1 使用TermQuery 1.2.2 使用NumericRa ...

  8. 带着萌新看springboot源码12(启动原理 下)

    先继续接上一篇,那个启动原理还有一点没说完. 6. afterRefresh(context, applicationArguments); 看这个名字就知道,应该就是ioc容器刷新之后的一些操作了, ...

  9. Linux 清理boot分区

    今天一登录虚拟机  就被提示boot空间不足 于是赶紧看了下 还有9.2M,刚安装的时候好好的,为什么用了一段时间后就提示空间不足呢? 原因是使用yum update升级内核后  boot分区中就多了 ...

  10. 补习系列(10)-springboot 之配置读取

    目录 简介 一.配置样例 二.如何注入配置 1. 缺省配置文件 2. 使用注解 3. 启动参数 还有.. 三.如何读取配置 @Value 注解 Environment 接口 @Configuratio ...