我正在开发一项服务于全世界用户的网络服务。
服务器基于IIS上托管的C#WCF应用程序。 它使用MsSQL配置数据库(访问时间在这里并不重要), 以及包含所有重要数据的MongoDB数据库(访问时间非常重要)。 它还提供小图像(48px * 48px JPEG)。
现在,对于图片托管我可能会使用亚马逊的CloudFront CDN托管(除非你们有更好的建议)。
我的问题是维持对Web应用程序和MongoDB的访问时间(ping)较低。
我想在新加坡+美国+欧洲+中东地区租用4台服务器以获得较低的响应时间。
每个服务器都将保存Web应用程序和MongoDB实例。 一台服务器将保存MsSQL实例。
我需要同步所有MongoDB(如果出现问题则不会立即同步)。
你会用什么设计?
答案 0 :(得分: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%的请求来自中东,那么你应该先让它们快速完成。使用相同的主体,您需要在响应时间中找出最慢的组件,并改进它们。为此,您需要收集数据。
<强>聚类强>
在一个大洲或跨大洲设置群集,将帮助您提供冗余,自动故障转移(如果已配置)和负载平衡(取决于您的配置方式)。如果您有很多数据,请考虑分片。
考虑浏览replication和sharding的文档。
示例服务器设置
假设您希望拥有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份数据副本,那么你也可以引入一个“仲裁者”来打破平局。
您可以分析您的查询,并选择一个分片键,以便它们转到最近的服务器或服务该区域的服务器。你很可能不得不进行某种分析来优化这一点。
希望它有所帮助。