我们正在build立一个应用程序,每个客户端都有自己的数据库。 没有一个数据库是特别大的(每个20MB到400MB),但是会有5000个启动,并且在任何时候都有100个左右的活动。
我们的团队一直在讨论如何最好地build立系统。 客户只能每2周访问一次数据库(401k /金融处理),一次只能使用10-30分钟。 操作在读/写之间均匀分布。
我们一半的团队认为,我们应该将数据库分布在多台便宜的服务器上,并使用SQL Express …他们说,考虑到每个数据库使用的时间很短,内存/caching将不会有用。没有超过1台服务器的完整SQL标准的预算)。
这是这种情况吗? 更高的内存限制实际上是我看到MSSQL Standard给我们带来的唯一优势(我们已经有用于执行备份/恢复,模式升级,迁移数据等的脚本)。
更新
我对多个数据库与一个数据库的性能特点特别感兴趣。 最终用户的体验不会比1TB数据库更好地打到一个200MB的数据库(即使这两个数据库的索引都很好)? 这也意味着我们可以非常快速地轻松备份/恢复单个客户端数据库,对吧? 我们是否需要调整SQL Server以更好地处理“数千个数据库”情形?
我把它扔在一台服务器上。 维护几个便宜的sql express服务器将是一个痛苦。 您可以将数据库,日志和临时数据库分布在不同的RAID磁盘arrays中。 您应该考虑将您的临时数据库移动到它自己的数组中,因为它可能一次被所有数据库使用。
查看2008资源调控器,确保没有任何用户将服务器抓取。 这只是在企业版本。
如果您为多租户客户端访问提供托pipe服务,则还可以select批量许可作为服务提供商 ,这比购买每CPU标准许可证要便宜得多,并且成本可以有效地传递到您的服务月定价
部署多个用于托pipe的SQL Express实例实际上违背了这些build议 。
尽pipe在SQL 2008和R2方面已经有点过时了,但我build议阅读白皮书SQL Server 2005虚拟主机环境部署指南 ,该指南适用于其他托pipe和多租户环境,不仅适用于Web托pipe。
杰斯,
在不了解你的环境或使用模式的情况下,我会说你可能会看到每个客户端拥有自己的数据库(所以数以千计的小型数据库与1个大型数据库)的性能有所提高。 您可能会减less表和行locking的机会,因为客户端只会碰到他们自己的唯一一组表,而不是共享一组表。 磁盘I / O仍然是一个限制因素。
另外,安全性会更加清晰,因为每个数据库对于每个客户端都有自己独特的许可权限。 正如你所说的,备份和恢复速度会比较小的数据库快得多,但是这些备份工作的设置和维护将会非常复杂(但是听起来你已经考虑到了这一点)。
如果您有硬件,我强烈build议为您的数据,日志和TempDB设置不同的RAIDarrays(如Sam所build议的)。 如果您正在使用某种直接连接存储或SAN,并且您可以购买额外的arrays,则甚至可以考虑将数据库的实际文件拆分到不同的arrays上。
HTH,丹
你最大的挑战可能涉及备份; 如果你使用SQL Express,你没有Agent来运行它们,你需要依靠Windows Scheduled Tasks和一些奇特的脚本。
如果您使用SQL Std / Ent Edition,并且尝试使用内置维护计划来备份所有数据库,则它将一次执行一个,可能需要一段时间。 相同的日志备份。
甚至不要考虑在服务器上使用多个数据库进行镜像。
我会倾向于更多的服务器,有一个深思熟虑的故障转移策略。
另一个需要注意的问题是维护在“多个廉价服务器”上传播的数以千计的SQL数据库的外围成本。 随着服务器数量的增加,您的机架空间需求将会增加,同时您的所有额外硬件也将为您的数据中心供电和降温。 更不用说pipe理成本/时间的增加,不得不维护多台服务器而不是一台服务器。
这里要考虑的一件事是将多个文件添加到tempdb,并将db文件分布到多个磁盘上。 然后,SQL可以在主轴上传播读写…参见https://stackoverflow.com/questions/719869/how-to-spread-tempdb-over-multiple-files
请不要把这个错误。 你可能有很好的理由去做你正在做的事情。 从我所在的位置,我不明白为什么有人想要有数千个数据库。 在我看来,你的应用程序中有一个devise缺陷,现在你正在寻找克服它的方法,而不修复它。 我会认真地推荐重新考虑基本的数据库devise。
话虽如此:如果有这么多的数据库有很好的(可能合法的)理由,那么考虑一下:一个体面的MS SQL Server可以轻松处理数百个小型数据库(500 x 400MB = 200GB的数据,这不是问题)。 这应该会产生足够的收入,而不必担心额外的SQL Server许可证。 然后,您可以简单地通过命名或您select的其他方法来拆分它们。
或者,您可能会考虑使用MySQL,其中授权不是这样的问题(尽pipe我认识到如果大量使用存储过程,这不是一个选项)。