MongoDB中readPreference和readConcern有什么区别?

Kro*_*ock 9 mongodb

我读了很多MongoDB文档,但我无法理解readConcern和readPreference选项之间的区别.

例如:如果我在读取关注选项中设置"多数"并将"主要"设置为我的读取偏好选项,结果是什么?这两个选项似乎是矛盾的.

我知道在查询级别我只能设置readConcern首选项,但在客户端级别我也可以设置readPreference.

Ely*_*Ely 12

在副本集中,主MongoDB实例是接收所有写入操作的主实例.

主要读的偏好是默认模式,涉及MongoDB的客户; 它是一个驱动程序/客户端选项.这意味着您首先从主实例中读取数据(在复制到其他副本集成员之前).
如果使用除主要读取首选项之外的其他模式,则可能会读取过时数据.

Read concern是副本集的查询选项.默认情况下,读取问题是本地的.这将返回查询执行时可用的最新数据.数据可能尚未持久保存到大多数副本集成员,可能会回滚.该选项可以设置为多数,这将使查询读取已保留到大多数副本集成员的最新数据,并且不会回滚.但是,您必须正确设置它(仅适用于WiredTiger引擎和其他一些要求......),您可能会错过最近写入但未持久保存到大多数副本集成员的数据.

假设您使用默认选项来读取首选项和读取问题.然后,您的MongoDB驱动程序将读取请求路由到主副本集成员(主实例),该实例将返回此时可用的最新数据.该数据可能未持久保存到大多数副本集成员,并且可能会回滚.

同样,您可以考虑使用读取关注点和读取首选项选项的不同组合的用例.

  • local/primaryPreferred
  • 本地/中学
  • local/secondaryPreferred
  • 当地/最近的
  • 多数/ primaryPreferred
  • 多数/中学
  • 多数/ secondaryPreferred
  • 多数/最近的

MongoDB Doc中描述了这些选项.某些组合在某些情况下可能有意义,而某些其他组合在其他情况下可能有意义.我只是在这里列出它们的完整性.我将其解释如下:

  1. 请求根据读取首选项选项(驱动程序选项)进行路由
  2. 第二,根据读取的关注选项(查询选项)执行请求


pro*_*r79 5

readConcern - 是我们想要从 mongo 读取数据的方式 - 这意味着如果我们有一个副本集,那么 readConcern Major 将允许将数据保存(持久化)到大多数副本集,因此我们可以放心,本文档不会如果复制出现问题,则回滚。

readPreference - 可以帮助平衡负载,因此我们可以有一个报告生成器进程,该进程始终从辅助服务器读取数据,并让主服务器为在线用户提供数据。