在某些情况下,将读请求发送给副本集的备份节点是合理的,例如,单个服务器无法处理应用的读压力,就可以把查询请求路由到可复制集中的多台服务器上。现在绝大部分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. 【转载】Android内存泄漏的8种可能

    Java是垃圾回收语言的一种,其优点是开发者无需特意管理内存分配,降低了应用由于局部故障(segmentation fault)导致崩溃,同时防止未释放的内存把堆栈(heap)挤爆的可能,所以写出来的 ...

  2. Python计算美国总统的身高并实现数据可视化

    代码如下: import numpy as np import pandas as pd import matplotlib.pyplot as plt data=pd.read_csv('presi ...

  3. Thymeleaf对象的使用:字符串对象

    Thymeleaf主要使用 org.thymeleaf.expression.Strings 类处理字符串,在模板中使用 #strings 对象来处理字符串. 开发环境:IntelliJ IDEA 2 ...

  4. KumuluzEE - Java EE的微服务框架

    KumuluzEE - Java EE的微服务架构 https://www.jdon.com/soa/kumuluzEE.html

  5. MySQL问题记录——2003-Can't connect to MySQL server on 'localhost'(10038)

    MySQL问题记录——2003-Can't connect to MySQL server on 'localhost'(10038) 摘要:本文主要记录了连接到MySQL数据库时出现的问题以及解决办 ...

  6. Linux—软连接与硬连接

    软链接的创建,删除,修改 创建软链接:ln -s[目标文件或目录][软链接地址] 解释:软链接地址相当于快捷方式,目标文件或目录才是真正的内容.[软链接地址]指“快捷键”文件名称,该文件是被指令创建的 ...

  7. JUC-4-CopyOnWriteArrayList

    什么是CopyOnWrite容器 CopyOnWrite容器即写时复制的容器.通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新 ...

  8. Statements、PreparedStatement及CallableStatement(三)

    当获得了与数据库的连接后,就可以与数据库进行交互了.JDBC Statement,CallableStatement和PreparedStatement接口定义了可用于发送SQL或PL/SQL命令,并 ...

  9. SP1716 GSS3 - Can you answer these queries III 线段树

    问题描述 [LG-SP1716](https://www.luogu.org/problem/SP1716] 题解 GSS 系列的第三题,在第一题的基础上带单点修改. 第一题题解传送门 在第一题的基础 ...

  10. As Simple as One and Two

    time limit per test3 secondsmemory limit per test256 megabytesinput: standard inputoutput: standard ...