如何决定在生产环境中使用MongoDB复制集。

4

我们目前在ec2上使用官方的MongoDB Docker镜像进行托管,为我们的生产环境提供服务。该服务器有32GB内存,专门用于这项服务。

如何通过使用副本集来改善我们的MongoDB性能?我们当前面临的问题是查询响应速度日益变慢。

是否有任何措施可以确定投资副本集将提供有价值的好处,并且不会是过早优化。


1
副本集用于高可用性,而不是扩展性。如果随着数据量的增加查询变得更慢,那么很可能是索引问题。 - kevinadi
查询正在执行IXSCAN,所以我猜这是我们能够实现的最好结果,副本集是否可以通过将负载分配到单个Mongo节点上的其他副本来帮助我们? - Raj Saraogi
尽管它正在执行IXSCAN,但它可能不是最好的索引,因此它仍然可能很慢。我建议您打开另一个问题,描述您的查询、索引以及查询的explain()输出。 - kevinadi
2个回答

1
MongoDB复制是一种高可用性解决方案(有关复制的更多细节,请参见本文末尾的注释)。复制不是性能改进解决方案。
MongoDB查询性能取决于各种因素:集合大小、文档大小、数据库设计、查询定义和索引。不足的硬件(内存、硬盘、CPU和网络)可能会影响查询性能。同时进行的操作数量也可能影响性能。
为了获得更快的查询性能,主要考虑使用索引。索引直接影响查询过滤和排序操作。要确定查询是否执行得最佳并使用正确的索引,请使用“executionStats”模式生成查询计划,并研究计划。Explain可以运行在MongoDB查找、更新、删除和聚合查询上。所有这些查询都可以从索引中受益。请参见Query Optimization
向现有硬件添加功能称为垂直扩展;而复制不是垂直扩展。
复制:
这是配置为副本集的 - 一个主节点和多个次要节点。主节点是应用程序的主要联系点 - 所有写操作都在主节点上进行(默认情况下也包括读操作)。写入主节点的数据会被复制到次要节点。这样就实现了数据冗余。当主节点出现故障时,其中一个次要节点将接管主节点,并通过故障转移过程使系统持续运行。数据耐久性、高可用性、冗余和故障转移是副本集的主要概念。在MongoDB中,副本集群可以有多达50个节点。

是的,我理解。副本集是否可用于读取查询,例如使用此功能,我们是否可以将写入查询重定向到主节点并将读取查询重定向到副本节点?如果可以实现这一点,性能会提高吗? - Raj Saraogi
您可以为查询指定_Read Preference_,它可以将读取指向辅助节点。我认为它并不是用于查询性能;请参阅Read Preference Use Cases - prasad_
是的,我明白查询性能不会提高,但它能减轻主节点面临的大量写操作负载吗?这会导致性能操作吗? - Raj Saraogi
但是,次要节点上也有写操作(复制是一种写操作)。通常应遵循前面评论中的“读取首选项用例”链接。 - prasad_

0

建议在生产环境中使用副本集,以便使用 HA 功能。

由于来源限制一方面,生产环境下需要 HA 的另一方面,我建议您创建一个最小的副本集,其中包括主服务器、从服务器和仲裁者(仲裁者不包含任何数据,内存消耗非常低)。

此外,写入通常对内存性能的影响要比读取更大。为了实现更好的写入性能,我建议您创建更多的分片(您有越多的主服务器,就可以同时处理更多的写入)。

然而,我不确定什么情况会导致您的 MongoDB 性能下降得如此之快。我认为您应该:

  1. 检查是哪些因素影响了生产环境的性能(复杂查询或困难的写入)。
  2. 将读取首选项更改为“最近”。
  3. 考虑禁用 Read Concern “majority”(请记住,默认情况下存在写入“majority”注意事项。成员应保持最新状态)。
  4. 查找更好的索引。
  5. 当然还要创建一个副本集!

祝你好运!:P


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接