MongoDB中readPreference和readConcern有什么区别?

时间:2016-04-27 18:51:29

标签: mongodb

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

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

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

2 个答案:

答案 0 :(得分:12)

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

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

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

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

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

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

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

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

答案 1 :(得分:2)

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

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