假设有三个节点的副本集:1个主要P
和2个次要S1
和S2
。还假设P
和S1
位于另一个数据中心DC1
中的S2
和DC2
。
假设客户位于DC1
(即与P
和S1
位于同一数据中心内)且S1
已关闭。客户端查询将在何处进行? P
或S2
?
答案 0 :(得分:4)
secondaryPreferred
会选择辅助,即使距离较远(我假设S2
的优先级较低,因为它可能不应该是主要的,因此在您的方案中{{1}是次要的,它在延迟意义上更远了。)
您可以使用tag sets代替data-center awareness / geographically distributed members或nearest
read-preference,这将选择更接近的服务器,无论它是主要服务器还是辅助服务器。
答案 1 :(得分:1)
在大多数情况下,操作从辅助成员读取,但在集合由单个主要(而不是其他成员)组成的情况下,读取操作将使用集合的主要成员。
当读取首选项包含标记集时,客户端会尝试查找与指定标记集匹配的辅助成员,并将读取指向最近的组中的随机辅助。如果没有辅助节点具有匹配的标签,则客户端会忽略标签并从主节点读取。
使用secondaryPreferred模式的读取操作可能会返回过时数据。
我的猜测是,您将从S2
获取数据,因为这是您要求的首选后缀。 secondary
选项完全排除了主要内容,但secondaryPreferred
允许在没有附加内容的情况下使用主数据库。
虽然通过在同一数据中心使用服务器的标签,但您可以从主服务器读取驱动程序,即使辅助服务器存在于副本集的其余部分中也是如此。