我们有一个用 ASP 和 SQL Server 开发的应用程序。我们使用 Rackspace 来托管它。我们的每个“客户”都有自己的 IIS 站点和 SQL 数据库。每个客户可能有十几个或几百个用户访问该应用程序。
我们现在有几百个客户。到目前为止,我们所做的是在出于性能原因需要时添加另一对服务器(一个 IIS,一个 SQL)。我们现在最多有四对服务器。
我们将继续添加新客户,并且我们正在寻找其他方式来扩大规模,而无需简单地添加成对的服务器。
我们正在考虑的一种方法是为 IIS 端设置一个网络场,为数据库端设置一个 SQL Server 集群和 SAN。
这是一个好方法吗?我们现在大概有 400 个客户,每个客户都有自己的 IIS 站点和 SQL 数据库。如果我们增长到 1,000 人会怎样?5000?一个 SQL 集群可以处理数千个数据库吗?
每个数据库都有数百个表。我们一些大客户的主表可能有几十万条记录。
转向大型 IIS 网络场和大型 SQL 集群的一个吸引力在于,如果一台服务器出现故障,其他服务器可以承担负载。现在,如果我们的一台 SQL Server 出现故障,或者我们的一台 IIS 服务器出现故障,我们四分之一的客户将无法使用该系统。因此,我们希望提高我们的可靠性以及增加我们增加新客户的能力。
SQL Server 群集不是可伸缩性解决方案,严格来说是高可用性解决方案。在 SQL Server 群集中,只有一个节点处于活动状态并处理负载,所有其他节点只是被动待机,等待活动节点出现硬件故障。因此,您最多只能从 SQL Server 集群获得单个 SQL Server 实例的性能。您有时会发现对所谓的“主动-主动”部署的引用,但这不是 SQL Server 集群。所谓的“主动-主动”是两个独立的集群,它们以相反的角色使用彼此的节点(一个集群在节点 A 上主动,在 B 上被动,另一个是主动 B,在 A 上被动)。
如果您的应用程序已经分区并且每个客户都有一个单独的数据库,那么您最好继续向外扩展。管理和维护问题可以得到解决,一旦您自动管理 4 台服务器(即现在),您就可以自动管理 1000 台服务器。版本控制、部署和帐户配置的问题也是如此。
虽然现在您可能会被纵向扩展解决方案的易于管理、故障排除和调整所吸引,但您将遇到新的问题,更难以解决,最终限制您可以纵向扩展的高度。
在您编辑 OP 并解释与横向扩展相关的问题后更新。
事实上,纵向扩展和集群提供了一种高可用性解决方案。SQL Server 基本上有两种 HA 解决方案:集群和数据库镜像。由于您计划使用数千个单独的数据库,因此这几乎排除了镜像。但您必须记住的是,SQL Server 集群仅在有限的硬件组合列表中受支持:
这并不意味着您不能在任何具有共享 SCSI 总线的硬件对/组上运行集群。这意味着如果您遇到未经批准的硬件问题,您将无法向 Microsoft CSS 请求支持。
SQL Server 群集提供针对硬件故障的保护,但媒体故障除外(因为媒体在节点之间共享)。它没有提供保护以防止人为管理错误,不幸的是,这是停机的主要原因。在单个集群上拥有一千个客户数据库,您将在一个篮子中烹饪一个非常大的煎蛋……
至于你问一个集群可以运行多少个数据库,最终一个集群在任何时候都只有一个活动实例,所以单个实例的限制也适用于集群。连接一千个数据库并不是什么大事,真正的问题是负载,有多少用户将同时运行查询。要获得一个大致的数字区域,请考虑为 SQL Server 发布的 TPC-C 基准测试是在 64 路 Superdome 上每分钟处理大约 120 万个事务,这意味着大约每秒 16k 个事务。您预计大约有 5k 个客户端连接,这为您提供了每个客户端每秒 3 个查询的余量,并且要达到这个目标,您需要一个非常强大的硬件和一个非常好的应用程序。
我同意以前的海报。听起来您肯定处于需要开始更多地考虑扩展的情况。但是,如果我拥有听起来像现在这样的环境,我将把更多的时间花在自动化事情上,并确保我对我的环境有一个坚实的鸟瞰图。无论您选择如何扩展,如果您没有编写脚本和自动化流程,您将陷入管理噩梦。
就实际规模策略而言,我认为您的可能设置可能如下所示;
1) 所有客户的网络文件都在所有网络服务器上
2) 在所有服务器上的 IIS 中配置的所有客户网站
3) 对任何客户 Web 文件的更改都会同步到所有 Web 服务器
4)以下网络配置
然后,一旦我开始看到我的 SQL 集群的限制,我会创建一个新的 SQL 集群,将我的数据库拆分到我的 2 个集群中,并更改客户连接字符串,以便它们指向各自的集群。
这里的想法是让负载均衡器做它最擅长的事情并在 Web 层之间分配流量。随着流量的增加,您总是可以将新的 Web 服务器投入到轮换中以稍微平衡一下。保持所有网络服务器同步是这里的关键。
此外,我们让数据库服务器做他们最擅长的事情,一旦它们开始陷入困境,我们将在混合中添加一个新的服务器\集群以平衡工作。温暖的 SQL Server 为您提供了一定程度的冗余,尽管我在这里可能会就是否真的需要它存在一些分歧。
最近有一篇关于 Foursquare 以及它们如何平衡负载的文章。他们使用的方法基本上是跨分区分布用户,在 MongoDB 中,这些分区是单独的服务器。这对他们来说非常有效,直到一组用户碰巧都是重度用户并且在同一个分区(分片)上,通过使其达到极限来降低分片。当然还有更多内容,但要点是;分布在机器上并监控使用情况,以便您知道何时再次拆分和重新平衡负载。
无论如何....那是我的 2 美分。
您可能需要考虑像 Amazon Web Services 的 EC2 和补充数据库和存储服务这样的云解决方案。它非常容易扩展并且完全可编程。您可以构建自定义仪表板来管理所有服务器并根据需要进行扩展。您只需为使用的内容付费,它们支持 Windows 和 Linux 平台,包括 IIS。如果您需要扩展到多台服务器或通过在东海岸和西海岸甚至欧洲托管服务器来提供地理冗余,您可以构建自己的自定义映像。Rackspace 有一个类似的解决方案,但我不确定他们是否发布了 Windows 支持——他们可能已经发布了。我两种都试过了,发现亚马逊更灵活、更全面,但既然你已经在使用 Rackspace,它可能更有意义。祝你好运!