1

假设有一个包含三个节点的副本集P:1 个主节点和 2 个辅助节点,S1并且S2. 还假设PS1位于一个数据中心DC1S2另一个数据中心DC2

假设客户端位于(即与 和位于DC1同一数据中心)并且已关闭。客户查询将去哪里?还是?PS1S1PS2

4

2 回答 2

4

secondaryPreferred将选择次要的,即使它更远(我假设它S2的优先级较低,因为它可能不应该是主要的,所以在你的场景S2中是次要的并且它在延迟意义上更远)。

您可以改为使用标签集来了解数据中心/地理分布的成员或nearestread-preference,这将选择更近的服务器,无论它是主要的还是次要的。

于 2014-02-20T10:35:26.900 回答
1

MongoDB 文档

次要的

在大多数情况下,操作从辅助成员中读取,但在集合由单个主成员(并且没有其他成员)组成的情况下,读取操作将使用集合的主成员。

当读取首选项包含标签集时,客户端尝试查找与指定标签集匹配的次要成员,并将读取定向到最近组中的随机次要。如果没有辅助节点有匹配的标签,客户端会忽略标签并从主节点读取。

使用secondaryPreferred 模式的读取操作可能会返回陈旧的数据。


我的猜测是您将从 中获取数据S2,因为这是您使用首选后缀所要求的。该secondary选项完全排除主节点,但secondaryPreferred允许在没有辅助节点的情况下使用主节点。

尽管通过在同一数据中心中为您的服务器使用标签,您可以使驱动程序从主服务器读取,即使副本集中的其余部分中存在辅助服务器。

于 2014-02-20T10:39:49.470 回答