在某些情况下,将读请求发送给副本集的备份节点是合理的,例如,单个服务器无法处理应用的读压力,就可以把查询请求路由到可复制集中的多台服务器上。现在绝大部分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 节点Role 端口
repltest 168.17.XXX.XX1 主节点 27017
168.17.XXX.XX2 从节点
168.17.XXX.XX3 仲裁节点

账号信息如下:

Username Password DBName
mongousertest testuserpwd mongotestdb

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

string connectionStr = "mongodb://mongousertest:testuserpwd@168.17.XXX.xx1:27017,168.17.XXX.xx2:27017/mongotestdb?replicaSet=repltest&readPreference=secondary&maxStalenessSeconds=100";

  

部分内容参考官网:https://docs.mongodb.com/manual/core/read-preference/index.html

MongoDB 读偏好设置中增加最大有效延迟时间的参数的更多相关文章

  1. 在visual studio工程设置中增加宏定义的方法

    在Solution Explorer中鼠标右键点击其project之后,Configuration(Release)->Configuration Propertity ->C++ -&g ...

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

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

  3. iOS中偏好设置的创建,数据写入与读取

    NSUserDefaults与NSDictinary? 应用通过NSUserDefaults用键值对的方式来读取和保存偏好设置数据,与通过键从NSDictionary对象中获取数据一样,不同之处在于N ...

  4. iOS-数据持久化-偏好设置

    一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用都有个NSUserDefaults实例,通过它来存取偏 ...

  5. 持久化存储——偏好设置,plist,归档---学习笔记二

    //一. 本地持久化 //1.沙盒 //1.1 应用程序包:存放的是应用程序的源文件,包括资源文件和可执行文件 NSString *path = [[NSBundle mainBundle]bundl ...

  6. iOS数据持久化文件读写之偏好设置

    很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能.每个应用都有个NSUserDefaults实例,通过它来存取偏好设置.比如, ...

  7. iOS开发UI篇—ios应用数据存储方式(偏好设置)

    iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...

  8. iOS开发之数据存储之Preference(偏好设置)

    1.概述 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能. 每个应用都有个NSUserDefaults实例,通过它来存取偏好 ...

  9. ios应用数据存储方式(偏好设置)-转

    一.简单介绍 1.很多ios应用都支持偏好设置,比如保存用户名,密码,字体大小等设置,ios提供了一套标准的解决方案来为应用加入偏好设置功能. 2.每个应用都有个NSUserDefaults实例,通过 ...

随机推荐

  1. IDEA org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    引用地址:https://guozh.net/idea-org-apache-ibatis-binding-bindingexception-invalid-bound-statement-not-f ...

  2. ABP入门教程15 - 小结

    点这里进入ABP入门教程目录 效果预览 至此,ABP入门教程的CURD(增删改查)示例已完成,效果如下 登录 首页 查询课程 新增课程 修改课程 删除课程 阶段总结 关键步骤: 领域层创建实体基础设施 ...

  3. WebMagic使用代理ip爬数据解决HTTP407问题

    手头一个小活儿是爬竞品网站数据.使用webmagic来实现.光公司ip不行,被封了就会影响业务正常访问.刚好公司另一个项目购买了代理IP资源“站大爷”,那个项目夭折了,于是申请借来用用. 调通站大爷提 ...

  4. linux下Oracle与swap分区大小配置规划

    Oracle于Linux系统---交换空间大小规划 分三种常用情况(1)实际内存为1GB~2GB建议交换空间为内存的1.5倍 (2)实际内存为2GB~8GB建议交换空间与内存相同 (3)实际内存超过8 ...

  5. Linux 定位进程对应的文件路径

    ls -al /proc/[pid]/exe # 例如: [root@localhost ~]# ls -al /proc/9109/exe lrwxrwxrwx. 1 ibaboss ibaboss ...

  6. java8-08-创建stream流

    为什么用stream                             应用函数式编程  配合Lamdba表达式 更快操作集合类 数组      什么是 stream               ...

  7. 浅谈JS函数节流及应用场景

    说完防抖,下面我们讲讲节流,规矩就不说了,先上代码: <!DOCTYPE html> <html lang="en"> <head> <m ...

  8. request请求参数与http请求过程

    request请求参数

  9. 第05组 Alpha事后诸葛亮

    组长博客链接(2分) 组长博客链接 现代软件工程 项目Postmortem 模板(27分) 设想和目标(2分) 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? ...

  10. java(二)变量

    基础数据类型: 数值型:整型(byte.short.int.long).浮点型(float.double)java各整数类型有固定的表数范围和字段长度,不受具体os的影响,以保持java的可移植性:j ...