mongo - 阅读偏好设计策略

时间:2014-02-26 00:28:54

标签: mongodb replicaset

我有一个应用程序,我的任务是设计一个mongo支持的数据存储。

应用程序目标是以最快的加载时间提供最新数据(无陈旧数据)。

在应用程序写入繁重的情况下,数据大小约为几百万。

在选择3节点副本集(1个主节点,1个副节点,1个仲裁节点)的读取策略时,我遇到了两种不同的策略来确定从哪里获取读取 -

  • 从辅助节点读取以减少主节点上的负载。使用writeConcern = REPLICA_SAFE,从而确保在主要和次要上完成写入。设置读取首选项。到secondaryPreferred

  • 始终从小学读取。但在阅读之前确保数据处于初级状态。所以设置writeConcern= SAFE。读取首选项是默认值 - primaryPreferred

在选择其中一个选项之前需要考虑的事项是什么。

1 个答案:

答案 0 :(得分:4)

根据文档REPLICA_SAFE是不推荐使用的术语,应替换为REPLICA_ACKNOWLEDGED。这里的另一个问题是这里的w值似乎是 2

这是您的配置问题,因为您的主服务器和仅一个辅助服务器与仲裁服务器相结合。如果节点发生故障或无法访问,其级别设置为此,则表示要确认来自 2个节点的所有写入,其中<强> 2个节点可用。您可以通过这种方式暂停写操作。

您的配置的最佳情况是MAJORITY,因为无论节点数量如何,它都将确保写入主节点和“大多数”辅助节点。 在您的情况下,任何涉及超过PRIMARY 的写入关注条件阻止 所有写入,如果其中一个您的节点已关闭或不可用,因为您必须拥有至少两个辅助节点,以便仍然有“大多数”节点来确认写入。或者删除ARBITER并有两个SECONDARY节点。

因此,您必须坚持默认w=1,其中所有写入都被PRIMARY确认,除非您在一个 SECONDARY出现故障时处理写入失败。

您可以将阅读首选项设置为secondaryPreferred,只要您接受“可能”可能“正在阅读陈旧或未将数据的最新表示作为唯一 real 保证是对主节点的写入。一般复制注意事项仍然存在,因为节点在处理能力上应该稍微相等,否则可能导致查询操作导致滞后或一般性能下降

请记住,复制是针对冗余实施的,而不是提高性能的系统。如果您正在寻找性能,那么可能需要考虑扩展系统硬件或实现分片以分配负载。