【发布时间】:2016-04-28 03:35:26
【问题描述】:
我阅读了很多 MongoDB 文档,但我无法理解 readConcern 和 readPreference 选项之间的区别。
例如:如果我在阅读关注选项中设置“多数”并在阅读偏好选项中设置“主要”,结果会怎样?这两个选项似乎是矛盾的。
我知道在查询级别我只能设置 readConcern 首选项,但在客户端级别我也可以设置 readPreference。
【问题讨论】:
标签: mongodb
我阅读了很多 MongoDB 文档,但我无法理解 readConcern 和 readPreference 选项之间的区别。
例如:如果我在阅读关注选项中设置“多数”并在阅读偏好选项中设置“主要”,结果会怎样?这两个选项似乎是矛盾的。
我知道在查询级别我只能设置 readConcern 首选项,但在客户端级别我也可以设置 readPreference。
【问题讨论】:
标签: mongodb
在副本集中,主要的 MongoDB 实例是接收所有写入操作的主实例。
primary 读取首选项是默认模式,涉及 MongoDB 客户端;这是一个驱动程序/客户端选项。这意味着您从首先写入数据的主实例读取数据(在复制到其他副本集成员之前)。
如果您使用 primary 读取首选项以外的其他模式,那么您可能会读取过时的数据。
读取关注是副本集的查询选项。默认情况下,读取关注点是 local。这将返回查询执行时可用的最新数据。数据可能尚未持久化到大多数副本集成员,可能会被回滚。该选项可以设置为 majority,这将使查询读取已持久化到大多数副本集成员并且不会回滚的最新数据。但是,您必须正确设置它(仅适用于 WiredTiger 引擎和一些其他要求...),您可能会错过写入但未持久保存到大多数副本集成员的最新数据。
假设您对阅读偏好和阅读关注使用默认选项。然后,您的 MongoDB 驱动程序会将读取请求路由到主副本集成员(主实例),该实例将返回当时可用的最新数据。该数据可能没有保留到大多数副本集成员,可能会被回滚。
同样,您可以考虑使用读取关注点和读取偏好选项的不同组合的用例。
MongoDB Doc 中描述了这些选项。某些组合在某些情况下可能有意义,而其他一些组合在其他情况下可能有意义。为了完整起见,我只是在这里列出了它们。我会解释如下:
【讨论】:
readConcern - 是我们想要从 mongo 读取数据的方式 - 这意味着如果我们有一个副本集,那么 readConcern 多数将允许将数据保存(持久)到大多数副本集,因此我们可以放心,如果复制出现问题,该文档不会被回滚。
readPreference - 有助于平衡负载,因此我们可以有一个报告生成器进程,该进程将始终从辅助服务器读取数据并离开主服务器为在线用户提供数据。
【讨论】: