您的应用程序中有两个不同的元素。有应用程序服务器,它是持有 ASP .Net 应用程序的服务器,还有数据库服务器。
Web 应用程序服务器本质上是无状态的,因此扩展应用程序服务器将非常容易。只需将应用程序部署在多个实例上,然后在它们前面放置一个负载均衡器。
对于数据库服务器,事情要复杂得多。关系数据库由于其事务性和关系性质,很难横向扩展,这通常涉及在应用程序级别编写自定义代码以支持横向扩展方案。这实际上是一个重要方面,因为可扩展性不会简单地通过添加更多硬件(更多机器)来透明地实现,而且您还必须在编码方面进行投资。使用 Sql Server 进行横向扩展的两种最流行的方法可能是镜像和分区。当 Sql Server 部署在云中时,云本身对横向扩展没有任何帮助,它仍将基于内置选项。
除了在一定程度上涉及非免费数据库解决方案的复杂性之外,水平扩展可能会比垂直扩展更昂贵。例如,考虑以下场景:
1 x 10000$ 机器 + 1 x 8000$ Sql Server 专业许可证 = 18000$
10 x 1000$ 机器 + 10 x 8000$ Sql Server 专业许可证 = 90000$
因为它只需要一个 Sql Server 许可证,所以一台昂贵的机器最终会比使用 10 台廉价机器和 10 个许可证便宜得多。
现在我已经到了在云中扩大规模的地步,事情变得有点复杂了。云提供商给你的本质上是虚拟机。虚拟机在划分 CPU 和 RAM 内存方面非常出色,如有必要,您可以通过增加更多 CPU 功率和更多内存来增加机器的功率。这很好,但数据库高度依赖于 I/O(硬盘)速度,而这是虚拟机表现不佳的一个领域。
与 Amazon 云服务和 Sql Server 相关,我可以推荐 this 非常好的文章(我实际上是通过 @marc_s 提供的链接了解的)。为了在扩展场景中获得良好的 I/O 速度,作者使用了EBS 卷。这种方法的问题在于,EBS 卷不是您部署数据库的服务器内部的硬盘,而是可通过网络访问的存储卷,这会大大降低其效率。
如果您不依赖亚马逊,那么您可以尝试在其基础架构中提供物理机(专用服务器)的云提供商。据我所知 gogrid 正在这样做,但可能还有其他人。想法是将数据库部署在专用服务器上(良好的 I/O 性能),并将应用程序服务器部署在虚拟机上(可水平扩展)。
Microsoft 也提供云服务,称为 Windows Azure,它可能是目前最有趣的产品之一,但在我看来,他们的关系数据库产品让它失望了。他们为此提供了专门的服务,称为Sql Azure。它的主要优点之一是它比普通数据库更容易管理,但不利的一面是它非常受限于扩展。唯一的扩展选项是数据库大小,最多只能达到 50Gb。他们没有提及任何关于 DB 提供的性能的信息,您也无法进行任何与此相关的配置。性能可能低于廉价专用服务器的性能(事实上,StackOverflow 上有一些帖子有人抱怨 Sql Azure 的速度与物理机相比)。您可以使用分片进行横向扩展,但如上所述,这确实会影响和限制数据库结构及其在代码中的使用方式。
结论:
- 如果您正在构建对关系数据有非常大需求的业务应用程序,那么云提供商可能不是您的最佳选择。您可以考虑使用自己的硬件,或者可以考虑使用可以让您选择使用专用服务器的提供商。
- 您可以考虑使用 nosql 数据库解决方案构建您的应用程序。这些更具可扩展性,但不利的一面是它们有一些功能限制(没有事务、没有连接、有限的索引)。如果您对这种方法感兴趣,Sql Table Storage 可能是一个起点。您也可以考虑一种混合方法,这将涉及到您的部分数据将保存在关系数据库中,而部分数据将保存在 nosql 数据库中。
- 在扩展数据库之前,请检查是否没有任何其他选项可以先尝试。例如,检查是否存在低效查询或构建缓存层,这取决于应用程序,可以减轻数据库的很大压力。