对于我们的其中一个系统,我们拥有敏感的客户数据,并将每个客户的数据存储在单独的数据库中。该系统有大约 10-15 个客户。
但是,我们正在开发一个新系统,该系统将拥有 50-100 个客户,甚至更多。我认为在这种情况下每个客户端拥有一个数据库(用于存储敏感记录和审计历史)可能是不可行的。但是我不知道这是否完全正常,或者是否有另一种维护安全的方法。
对此有什么想法吗?
对于我们的其中一个系统,我们拥有敏感的客户数据,并将每个客户的数据存储在单独的数据库中。该系统有大约 10-15 个客户。
但是,我们正在开发一个新系统,该系统将拥有 50-100 个客户,甚至更多。我认为在这种情况下每个客户端拥有一个数据库(用于存储敏感记录和审计历史)可能是不可行的。但是我不知道这是否完全正常,或者是否有另一种维护安全的方法。
对此有什么想法吗?
管理 100 个或 500 个数据库实际上与管理 5 个或 10 个数据库并没有什么不同——您只需要接受自动化并制定一个可扩展性计划(并且不打算使用每个数据库的高成本功能,例如在所有数据库中进行镜像)客户)。
在我之前的工作中,我们使用了这种架构,我从来没有想过将两个客户端合并到一个数据库中,尽管其中一些挑战可能是“困难的”。
最大的好处是独立的恢复模型(
a
可以是简单的,b
可以是完整的等),能够在不中断其他客户端的情况下恢复到某个时间点(或完全删除)客户端,能够无缝移动资源密集型客户端到它自己的存储或完全不同的服务器,几乎没有透明度(你更新一个配置文件或表,告诉应用程序在哪里可以找到该客户端)。我在这些帖子中解决了一些反对意见和/或如何解决问题:
在多租户数据库架构中处理越来越多的租户
使用 SQL Server 2008 的多租户数据库?
海量数据库备份自动化
总而言之,我认为我们中的任何人都无法告诉您管理对您来说变得不切实际的点- 只要知道您遇到任何具体挑战,您都可以单独询问这些问题。
我建议您阅读Multi-Tenant Data Architecture,这是一份讨论您拥有的选项以及优缺点的白皮书。总而言之,它提供了三个选项:
您现在处于单独的数据库阶段,它提供了最好的分离(租户之间的隔离),但最难管理。当您成长为数百个租户时,您会意识到管理 100 个数据库的后勤工作绝非易事。想想备份恢复(备份文件、作业、计划等的位置)。想想您将如何监控和管理数百个 DB 中的文件分配、使用的磁盘空间和数据库增长。想想在不久的将来,拥有 1000 个租户的高可用性/灾难恢复方案将是什么?1000 个镜像数据库,1000 个日志传送会话?想想如果你的开发团队在 6 个月后来找你说“我知道如何为我们的产品提供这个很棒的功能,我们将使用事务复制!”,你会说什么?“当然,让我建立 500 个出版商,“!管理数百个数据库并非不可能,但如果你打算这样做,你最好提高你的PowerShell技能并立即停止使用 UI 管理工具。
此外,您需要考虑多个(数百个)数据库对性能和成本有可衡量的影响:
尽管由于隔离,分离的数据库具有一些优势,主要优势是独立备份/恢复。
像您这样的场景是SQL Azure 数据库的完美候选者。无需管理磁盘空间,无需提供 HA/DR,可扩展到数百/数千个 DB 等。
在我之前的工作中,我们不仅为每个客户端托管一个数据库——在大多数情况下,还不止这些!在我离开时,一个 MariaDB 集群中运行着 4,500 多个数据库,另一个(具有讽刺意味的是更小的)集群中运行着近 7,000 个数据库,以及每个托管 4 个“分片”(完全独立的、独立的 Web 和数据库服务器,甚至在一个完全独立的数据中心中)单个 MySQL 服务器中的 200-500 个数据库。那家公司仍在以良好的速度增长。
总而言之,那家公司的成功证明了这样的架构确实是可行的。(警告:与使用单独数据库的明显收益相反,所有数据都是通过三个紧密耦合的应用程序访问的,这些应用程序都使用相同的数据库用户/通行证!我怀疑如果每个客户端的性能可能会受到如此轻微的影响有一个单独的用户/通行证——但只有一点点。)
根据我与系统管理员密切合作的经验(从技术上讲,我是公司的一名程序员,但实际上我是他们拥有的最好的 DBA,也是他们唯一知道如何设置防火墙的人!),与性能相关问题归结为并发访问、查询复杂性/时间、索引性能等——换句话说,所有常见的问题,服务器上的数据库数量没有起到明显的作用,这个结论得到了高薪专家的肯定我们定期咨询的顾问。
最重要的是,您应该关注您的应用程序、基础架构,而不是您碰巧拥有的数据库数量。所有这些其他因素足以让您忙于解决性能问题和瓶颈。