MongoDB中readPreference和readConcern的区别是什么?

MongoDB中readPreference和readConcern的区别是什么?,mongodb,Mongodb,我读了很多MongoDB文档,但是我不理解readConcern和readPreference选项之间的区别 例如:如果我在我的阅读关注选项中设置“多数”,并将“主要”设置为我的阅读偏好选项,结果会是什么?这两种选择似乎是对立的 我知道在查询级别我只能设置readConcern首选项,但在客户端级别我也可以设置readConcern首选项。readConcern-是我们希望从mongo读取数据的方式-这意味着如果我们有一个副本集,则readConcern多数将允许将数据保存(持久化)到大多数副本

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

例如:如果我在我的阅读关注选项中设置“多数”,并将“主要”设置为我的阅读偏好选项,结果会是什么?这两种选择似乎是对立的


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

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


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

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

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

读取关注点是副本集的一个查询选项。默认情况下,读取关注点是本地的。这将返回执行查询时可用的最新数据。数据可能尚未持久化到大多数副本集成员,可能会回滚。该选项可以设置为多数,这将使查询读取已持久化到大多数副本集成员的最新数据,并且不会回滚。但是,您必须正确设置(仅适用于WiredTiger引擎和其他一些要求…),并且您可能会丢失写入但未持久化到大多数副本集成员的较新数据

让我们假设您对阅读首选项和阅读关注点使用默认选项。然后,MongoDB驱动程序将读取请求路由到主副本集成员(主实例),该实例将返回此时可用的最新数据。该数据可能尚未持久化到大多数副本集成员,可能会回滚

类似地,您可以考虑使用不同的阅读关注点和阅读偏好选项组合的用例

  • 本地/初级优先
  • 本地/中学
  • 本地/二级优先
  • 本地/最近的
  • 多数/主要优先
  • 多数/中等
  • 多数/二等优先
  • 多数/最接近
MongoDB文档中描述了这些选项。某些组合在某些情况下可能有意义,而某些其他组合在其他情况下可能有意义。为了完整起见,我只是在这里列出了它们。我的解释如下:

  • 根据读取首选项(驱动程序选项)路由请求
  • 第二,根据读取关注点选项(查询选项)执行请求

  • 教授您好,首先,谢谢您的回复。我认为readPreference不仅仅是关于负载,readPreference还涉及一致性和可用性。