1

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

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

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

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

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

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

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

你会用什么设计?

4

1 回答 1

0

访问时间短是成本与收益的函数。首先你需要识别,多低是低。您是否需要应用程序的整体响应时间为 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% 来自中东,那么您应该首先为他们快速处理。使用相同的原理,您需要找出响应时间最慢的组件,并改进它们。为此,您需要收集数据。

聚类

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

考虑通过文档进行复制分片

示例服务器设置

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

这里符号 s1p1 表示,shard1 - 主 1 和 s1s1 是 shard 1 辅助 1 等等

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

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

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

希望能帮助到你。

于 2012-11-29T11:46:48.407 回答