一边搭建一边理解MongoDB副本集(写偏好)

一边搭建一边理解MongoDB副本集(写偏好)

读偏好描述了MongoDB客户端是怎样路由读请求到副本集中的成员。

这里写图片描述

默认情况下,应用程序将其读取操作指向副本集中的主成员。

IMPORTMANT:
指定读偏好时需要谨慎:除了主节点模式,其他模式返回的可能是过期的数据,因为在异步复制时,从节点中的数据不能反映最近的写入操作。

NOTE:
读偏好不会影响数据的可见性,例如客户端可以在通知前或传播到大部分节点前看到写操作的结果:

  • 无论写关注,其他使用“local”如关注的客户端可以在通知前看到写操作的结果。

  • 使用“local”读关注的客户端可能会读到随后被回滚的数据。

使用场景

下面是使用非主节点关注模式的常用场景:

  • 运行不会影响前台应用的系统操作

    NOTE:
    读偏好和直接连接到一台的MongoDB实例不相关。但是,为了在副本集的从节点的其中之一上进行读操作,你必须设置读读偏好,比如从节点偏好。

  • 为地理分布的应用提供本地读。
    如果你在多个数据中心拥有应用服务,你可以考虑使用地理分布的副本集并且使用非主节点或nearest读偏好。这允许客户端读取延迟最低的成员而不是一直从主节点读取。

  • 在故障切换时保持可用性
    在一般情况下,如果你想要应用从主节点读取,可以使用primaryPreferred。但是当主节点不可用时允许从从节点读取过期数据。这提供了在故障切换时为你的应用提供了“只读”模式。

一般来说,不要使用secondary和secondaryPreferred来提供额外的读能力,因为:

  • 所有的副本集大致拥有相同的写流量,所以,从节点服务读操作的速率大致和主节点相同。
  • 副本集是异步同步的,因此在写操作成功到复制到从节点有一定的延迟。从从节点读取数据返回的可能是过期的数据,从不同从节点读取可能导致非单调读(不同节点返回不一致的数据)。
  • 对于分片集合的查询,对于均衡器开启的集群,由于不完整或被终止的块合并,从节点可能返回丢失或重复的过期数据。

分片通过增加一组机器分散读写操作增加了读写性能,这通常是增加性能更好的方法。

读偏好模式

IMPORTANT:
除了primary模式其他的读偏好都有可能返回过期数据因为从节点的复制操作有一些延迟。如果你选择非primary模式,确保你的应用可以容忍过期数据。

MongDB驱动支持5中读偏好模式。

读偏好模式描述
primary默认模式,所有的读操作都从当前副本集主节点
primaryPreferred多数情况下,从主节点读取数据,但是如果主节点不可用了,会从从节点读取
secondary所有读操作都从副本集的从节点读取
secondaryPreferred多数情况下, 从从节点进行读操作,但是如果从节点都不可用了,从主节点读取
nearest从副本集中延迟最低的成员读取,不考虑成员的类型

读偏好在通过mongos连接到分片集群时也可以使用。mongos实例在连接到集群中副本集提供的分片时遵守读偏好。

在mongo shell中,readPref()指正方法提供了读偏好。

最大过期时间

version 3.4 新增

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

IMPORTANT:
maxStalenessSeconds读选项试图让从从节点读取的应用避免从那些远落后于主节点写入的从节点读取。比如,从节点可能因为和主节点之间网络中断而停止复制。这种情况下,客户端应该停止从这个从节点读取数据直到管理员解决的中断并从节点赶上了主节点。

要使用maxStalenessSeconds,你部署的所有MongoDB实例必须使用MongoDB 3.4或更高。如果任何一个实例的版本早于该版本,驱动或mongos会抛出异常。

你可以在下面几个读偏好模式中定义maxStalenessSeconds:
- primaryPreferred
- secondary
- secondaryPreferred
- nearest

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

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

如果没有主节点,客户端使用从节点最近一次写操作来比较。

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

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

标签集

标签集允许你将读操作定向到副本集的特定成员。

自定义读偏好和写关注以不同的方式使用标签集。读偏好在选择成员读取时考虑标签的值。写关注在选择成员时忽略标签的值,除了考虑值是否是唯一的。

你可以在下面读偏好模式下定义标签集:

  • primaryPreferred
  • secondary
  • secondaryPreferred
  • nearest

标签和primary模式不匹配,并且一般来说,只在读操作选择从节点成员时才能应用。但是nearest读模式在绑定了标签集时,会在匹配的成员中选择网络延迟最低的。这个成员可能是主节点或从节点。

使用相同成员选择逻辑的接口会基于读偏好的模式和标签集来选择指向哪个成员进行读操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值