我有一个应用程序,我的任务是设计一个mongo支持的数据存储。
应用程序目标是以最快的加载时间提供最新数据(无陈旧数据)。
在应用程序写入繁重的情况下,数据大小约为几百万。
在选择3节点副本集(1个主节点,1个副节点,1个仲裁节点)的读取策略时,我遇到了两种不同的策略来确定从哪里获取读取 -
从辅助节点读取以减少主节点上的负载。使用writeConcern = REPLICA_SAFE
,从而确保在主要和次要上完成写入。设置读取首选项。到secondaryPreferred
。
始终从小学读取。但在阅读之前确保数据处于初级状态。所以设置writeConcern= SAFE
。读取首选项是默认值 - primaryPreferred
。
在选择其中一个选项之前需要考虑的事项是什么。
答案 0 :(得分:4)
根据文档REPLICA_SAFE是不推荐使用的术语,应替换为REPLICA_ACKNOWLEDGED。这里的另一个问题是这里的w
值似乎是 2 。
这是您的配置问题,因为您的主服务器和仅一个辅助服务器与仲裁服务器相结合。如果节点发生故障或无法访问,其级别设置为此,则表示要确认来自 2个节点的所有写入,其中<强> 2个节点可用。您可以通过这种方式暂停写操作。
您的配置的最佳情况是MAJORITY,因为无论节点数量如何,它都将确保写入主节点和“大多数”辅助节点。 但在您的情况下,任何涉及超过PRIMARY 的写入关注条件阻止 所有写入,如果其中一个您的节点已关闭或不可用,因为您必须拥有至少两个辅助节点,以便仍然有“大多数”节点来确认写入。或者删除ARBITER并有两个SECONDARY节点。
因此,您必须坚持默认w=1
,其中所有写入都被PRIMARY确认,除非您在一个 SECONDARY出现故障时处理写入失败。
您可以将阅读首选项设置为secondaryPreferred
,只要您接受“可能”可能“正在阅读陈旧或未将数据的最新表示作为唯一 real 保证是对主节点的写入。一般复制注意事项仍然存在,因为节点在处理能力上应该稍微相等,否则可能导致查询操作导致滞后或一般性能下降
请记住,复制是针对冗余实施的,而不是提高性能的系统。如果您正在寻找性能,那么可能需要考虑扩展系统硬件或实现分片以分配负载。