【问题标题】:Best server design for MongoDB based system (low response times needed)基于 MongoDB 的系统的最佳服务器设计(需要低响应时间)
【发布时间】:2012-11-17 08:37:58
【问题描述】:

我正在开发一个网络服务,它将为全世界的用户提供服务。

服务器基于托管在 IIS 上的 C# WCF 应用程序。 它使用一个 MsSQL 配置数据库(访问时间在这里并不重要), 和一个包含所有重要数据的 MongoDB 数据库(访问时间在这里非常重要)。 它还提供小图像(48px * 48px JPEG)。

现在,对于图像托管,我可能会使用亚马逊的 CloudFront CDN 托管(除非你们有更好的建议)。

我的问题是保持对 Web 应用程序和 MongoDB 的较短访问时间 (ping)。

我想在新加坡 + 美国 + 欧洲 + 中东租用 4 台服务器以缩短响应时间。

每台服务器都将保存 Web 应用程序和一个 MongoDB 实例。 一台服务器将保存 MsSQL 实例。

我需要同步所有 MongoDB(如果有问题,不是立即同步)。

你会使用什么设计?

【问题讨论】:

标签: c# mongodb database-design architecture


【解决方案1】:

访问时间短是成本与收益的函数。首先你需要识别,多低是低。您是否需要应用程序的整体响应时间为 100 毫秒?还是1s?

一旦你这样做了,你就可以计算出不同的成本。

   Total time taken = time for request + //across internet 
processing by web app + request for data + 
preparing the response + response back to client.

如果您希望的延迟是 100 毫秒,那么无论您的服务器有多快,它都很有可能无法完成,这很简单,因为网络流量可能需要太长时间。

您需要分析数据集。查询 1000 个文档不同于查询 10 亿个文档。您需要计算索引占用的大小,以及它是否在 RAM 中。如果索引不在 RAM 中,您的访问将会很慢。

MongoDB配置

Mongodb 可以在集群中工作,具有自动同步(立即或延迟,这是可配置的)和自动故障转移(或手动,这也是可配置的)。如果您的数据集很大,它还支持分片,因此请求被发送到实际包含数据的服务器。

同样,您需要查看您的应用服务器并确定组件的慢/快程度才能获得保证的响应时间。

根据您提供的信息,这是我可以给出的详细回复。

分析然后优化

如果您 80% 的请求来自中东,那么您应该首先为他们快速处理。使用相同的原理,您需要找出响应时间最慢的组件,并改进它们。为此,您需要收集数据。

聚类

在一个大陆或跨大陆设置集群将帮助您提供冗余、自动故障转移(如果已配置)和负载平衡(取决于您的配置方式)。如果您有大量数据,请考虑分片。

考虑查看replicationsharding 的文档。

示例服务器设置

假设您想要 10 个复制因子为 3 的分片,即您的数据分布在 10 台服务器上,每台服务器实际上是 3 台服务器的副本集(用于可用性和故障转移),即副本集中的每台服务器都包含重复的数据。

这里的符号 s1p1 表示,shard1 - primary 1,s1s1 是 shard 1 secondary 1,依此类推

s1p1 s2p1 ...  s10p1
s1s1 s2s1  ... s10s1
s1s2 s2s2  ... s10s2

分片 1-10 划分数据,其中每个分片大约保留总数的 1/10。每个分片由一个副本集组成,该副本集具有一个主副本和 2 个辅助副本。如果需要更多冗余,可以增加此值。尽量保持奇数,因此在选举期间会有决胜局。如果您只想拥有 2 个数据副本,那么您还可以引入一个“Arbiter”来打破平局。

您可以分析您的查询,并选择一个分片键,以便它们转到最近的服务器,或服务于该区域的服务器。您很可能需要进行某种分析来优化这一点。

希望对你有帮助。

【讨论】:

  • 您好,感谢您的评论。我知道响应时间问题,但我的问题是,我应该对 MongoDB 实施什么设计。我应该持有一个实例吗?或者每个大陆都有一个实例以确保低 ping。
  • 首先您需要弄清楚所需的响应时间。然后弄清楚数据库消耗了多少时间。如果数据库消耗 10% 而 90% 在其他地方,那么可能还有另一条龙要杀死。但是要回答您的问题,如果您在每个大陆都有一个,那肯定会有所帮助,但是问题是,是否需要它? (有商业案例吗?如果有,那就去做吧)。理想情况下,您需要一个可以处理流量、提供自动故障转移和冗余的集群(如果需要,可以分布在各大洲)。如果需要,请查看分片。
  • 它是必需的,因为我必须保持低于 100 毫秒的低 ping 速率。我的主要问题是数据库位置。我应该分片吗?复制?谢谢
  • 分片对于读取特别有用(如果不立即需要重新平衡,则写入)。如果数据分布良好,理想情况下,查询将命中几个分片,因此您的响应会更好。复制是为了缓解慢速网络、服务器问题或其他服务器可能不可用的情况,并且您希望备份/辅助服务器可用于从中读取数据(并且它可能成为新的主服务器,因此您也可以对其进行写入)
  • 根据数据的大小,您可能希望两者都做。复制当然。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多