参考 > 复写 > 复制集读取和写入语义 > 阅读偏好 > 阅读偏好用例
在本页面
以下文档介绍了各种读取首选项模式的常见用例
,以及
概述了不应该将读取首选项更改为默认值时的反指示primary
。
读取首选项模式 | 描述 |
---|---|
primary |
默认模式。所有操作均从当前副本集primary中读取 。 |
primaryPreferred |
在大多数情况下,操作从主服务器读取,但如果不可用,则从辅助 成员读取操作。 |
secondary |
所有操作均从副本集的辅助成员读取。 |
secondaryPreferred |
在大多数情况下,操作会从辅助 成员读取,但如果没有辅助成员可用,则操作会从primary读取。 |
nearest |
从副本集的成员读取的操作具有最小的网络延迟,而与成员的类型无关。 |
以下是使用非primary
读取首选项模式的常见用例:
正在运行不影响前端应用程序的系统操作。
为地理分布的应用程序提供本地读取。
如果您在多个数据中心中都有应用程序服务器,则可以考虑具有地理上分散的副本集,并使用非主要或
nearest
读取首选项。这允许客户端从最低延迟成员中读取,而不是始终从主要成员中读取。
在故障转移期间保持可用性。
使用primaryPreferred
,如果你想要一个应用程序从初级正常情况下阅读,而是让陈旧从次级读取当主不可用。这为故障转移期间的应用程序提供了“只读模式”。
在一般情况下,千万不能使用secondary
,并
secondaryPreferred
提供额外容量进行读取,这是因为:
副本的所有成员具有大致相等的写入流量;结果,辅助服务器将以与主服务器大致相同的速率读取数据。
复制是异步的,在成功的写操作及其复制到辅助副本之间存在一定的延迟。从辅助服务器读取可能会返回陈旧数据;来自不同次级的读取可能会导致非单调读取。
在3.6版中进行了更改:从MongoDB 3.6开始,客户端可以使用客户端会话和因果一致性保证来确保单调读取。
如果集合中的任何成员都不可用,则将读取操作分配给次要对象可能会损害可用性,因为集合中的其余成员将需要能够处理所有应用程序请求。
分片通过在一组计算机之间分布读写操作来增加读写容量,并且通常是增加容量的更好策略。
有关读取首选项的内部应用程序的更多信息,请参见服务器选择算法。
为避免过时的读取,请使用primary
读取首选项和
。如果主数据库不可用,例如在选举期间或大部分副本集不可访问时,使用读取首选项的读取操作将产生错误或引发异常。"majority"
readConcern
primary
在某些情况下,副本集可能会暂时具有两个主副本。但是,只有一个主节点能够确认与写入有关的"majority"
写入。
P
旧的)隔离到具有少数节点的分区中,而另一侧则包含大多数节点。具有多数的分区将选择一个新的主节点(P
new),但是在很短的时间内,旧的主节点(P
old)可能仍继续为读取和写入服务,因为它尚未检测到只能看到少数节点。在副本集中。在此期间,如果旧的主数据库(P
old)作为主数据库仍对客户端可见,则从该主数据库读取的数据可能反映了过期数据。P
旧)可能会变得无响应,这将触发选举,并且可以选择新的主节点(P
新)来为读取和写入服务。如果没有响应的主数据库(P
old)开始再次响应,则短暂可见两个主数据库。当P
旧的退步时,短暂的时期将结束。但是,在短暂的时间内,客户端可能会从旧的primary P
old读取数据,该数据可以提供陈旧的数据。为了提高一致性,您可以禁用自动故障转移;但是,禁用自动故障转移会牺牲可用性。
要在可能的情况下允许读取操作,请使用
primaryPreferred
。如果有主数据库,您将获得一致的读取[1],但是如果没有主数据库,您仍然可以查询次数据库。但是,使用此读取模式时,请考虑secondary vs secondaryPreferred中描述的情况
。
[1] | 在某些情况下,副本集中的两个节点可能会短暂地认为它们是主要节点,但至多,其中一个节点将能够完成写操作而无需担心。可以完成
写入操作的节点是当前主节点,另一个节点是以前的主节点,由于网络分区,该主节点尚未意识到其降级。发生这种情况时,尽管已请求读取首选项,但连接到前主数据库的客户端可能仍会观察到过时的数据
,并且对前主数据库的新写入最终将回滚。{ w:
"majority" } { w: "majority" } primary |
要始终从低延迟节点读取,请使用nearest
。驱动程序或mongos
将从最近的成员读取,并且距离最近的成员不超过15毫秒[2]
。
nearest
并不能保证一致性。如果距离应用程序服务器最近的成员是具有某些复制滞后的次要成员,则查询可能会返回陈旧数据。nearest
仅反映网络距离,不反映I / O或CPU负载。
[2] | 此阈值是可配置的。见
localPingThresholdMs 的mongos 或相应的设置你的驱动程序文档。 |
如果副本集的成员在地理上分布,则可以创建副本标签以反映实例的位置,然后将应用程序配置为查询附近的成员。
例如,如果在“东”和“西进”的数据中心成员被
标记 ,并
在华东数据中心的应用程序服务器可以从下面的内容偏好附近的成员如下:{'dc': 'east'}
{'dc': 'west'}
尽管nearest
已经偏爱具有低网络延迟的成员,但是包含标签可以使选择更加可预测。
secondary
VS secondaryPreferred
¶对于特定的专用查询(例如ETL,报告),您可以使用secondary
读取首选项模式将读取负载从主要负载转移。对于此用例,该secondary
模式比该模式更可取,secondaryPreferred
因为
secondaryPreferred
存在以下情况的风险:如果所有辅助服务器都不可用,并且副本集具有足够的仲裁器 [3],可以防止主服务器降级,则主服务器将接收来自主服务器的所有流量。客户。如果主服务器无法处理此负载,则查询将与写入竞争。因此,请使用读取首选项secondary
代替来分发这些特定的专用查询
secondaryPreferred
。
[3] | 通常,避免每个副本集部署多个仲裁器。 |