我们正在构建一个应用程序,每个客户端都有自己的数据库。没有一个数据库特别大(每个数据库 20MB 到 400MB),但开始时会有大约 5,000 个数据库,并且任何时候都会有大约 100 个数据库处于活动状态。
我们的团队一直在讨论如何最好地设置系统。客户每 2 周仅访问一次数据库(401k/财务处理),并且每次仅使用 10-30 分钟。操作均匀分布在读取/写入之间。
我们团队中有一半的人认为,我们应该将数据库分布在多个廉价服务器上,然后只使用 SQL Express ...他们说,由于每个数据库的使用时间很短,内存/缓存不会那么有用(我们没有足够的预算在多台服务器上使用完整的 SQL 标准)。
是这样吗?更高的内存限制确实是我看到的 MSSQL Standard 给我们带来的唯一优势(我们已经有用于执行备份/恢复、架构升级、迁移数据等的脚本)。
更新
我特别感兴趣的是多个数据库与单个数据库的性能特征。最终用户体验使用单个 200MB 数据库不是比使用 1TB 数据库更好吗(即使两者都有良好的索引)?这也意味着我们可以轻松快速地备份/恢复单个客户端数据库,对吗?我们是否需要调整 SQL Server 以更好地处理“数千个数据库”的情况?
答案1
我会把所有东西都放在一台服务器上。维护几台廉价的 sql express 服务器会很麻烦。您可以将数据库、日志和临时数据库分布在不同的 RAID 磁盘阵列上。您应该考虑将临时数据库移动到它自己的阵列中,因为它可能同时被所有数据库使用。
检查 2008 资源管理器,确保没有用户会导致服务器运行缓慢。不过它只在企业版中提供。
答案2
如果您提供多租户客户端访问托管,您还可以选择批量许可作为服务提供者,这比购买每个 CPU 的标准许可证要便宜得多,而且成本可以有效地转嫁到您的服务每月定价上。
部署多个 SQL Express 实例进行托管实际上是反对建议。
虽然对于 SQL 2008 和 R2 来说有点过时,但我建议阅读白皮书Web 托管环境的 SQL Server 2005 部署指南,该指南不仅适用于 Web 托管,还适用于其他托管和多租户环境。
答案3
杰西,
无需了解您的环境或使用模式,我只能说,如果每个客户端都有自己的数据库(数千个小型数据库 vs. 1 个大型数据库),您可能会看到性能有所提高。您可以潜在地减少表和行锁定的可能性,因为客户端只会访问他们自己独特的一组表,而不是共享一组表。然而,磁盘 I/O 仍然是一个限制因素。
此外,安全性也会更加清晰,因为每个数据库对每个客户端都有自己独特的权限集。正如您所说,使用较小的数据库,备份和恢复会快得多,但这些备份作业的设置和维护会非常复杂(但听起来您已经考虑到了这一点)。
如果您有硬件,我强烈建议您为数据、日志和 TempDB 设置不同的 RAID 阵列(正如 Sam 所建议的那样)。如果您正在使用某种直接连接存储或 SAN,并且您可以负担得起额外的阵列,您甚至可以考虑将数据库的实际文件拆分到不同的阵列上。
HTH,丹
答案4
您应该牢记的另一个考虑因素是维护分布在“多台廉价服务器”上的数千个 SQL 数据库的外围成本。随着服务器数量的增加,您的机架空间需求也会增加,为数据中心提供所有附加硬件的电力和冷却成本也会增加。更不用说维护多台服务器而不是一台服务器所带来的管理成本/时间的增加。