多租户 PHP SaaS - 为每个客户端单独的数据库,或将它们分组?
Posted
技术标签:
【中文标题】多租户 PHP SaaS - 为每个客户端单独的数据库,或将它们分组?【英文标题】:Multi-tenant PHP SaaS - Separate DB's for each client, or group them? 【发布时间】:2012-10-30 19:04:21 【问题描述】:您必须忍受我在这里可能会弄错一些术语,因为我什至不知道这属于整个“多租户”“软件即服务”类别,但在这里会的。
我为客户开发了一个会员系统(用 php 编写)。我们现在正在考虑将其作为完全托管的解决方案提供给我们的其他客户,提供子域(甚至是他们自己的域)。
就数据存储而言,我似乎有以下选择:
选项 1 - 将所有内容存储在 1 个大数据库中,并在需要它的表上有一个“client_id”字段(大约有 30 个表适用),并有一个'clients' 表存储他们的主要设置、详细信息等以及映射到它们的域。然后,这只是设置了一个包含其各自客户端 ID 的全局可访问变量 - 我显然必须修改每个查询以检查 client_id 列。
选项 2 - 有一个包含“共享参考”表和“客户”表的主表。然后有其他数据库的“块”,每个数据库都包含 10 个客户端。客户将获得他们自己的数据库表,并以他们的客户 ID 为前缀。这增加了一点安全性,以防止在出现问题时看到其他客户端数据。
选项 3 - 与选项 2 完全相同,除了每个客户端都有 1 个数据库,将它们与其他客户端完全隔离,理论上提供比 1 个客户端的表更多的保护被黑客入侵或以其他方式损坏,它不会影响其他任何人。最大的缺点是,在部署新客户端时,需要设置整个数据库、用户和密码等。这是否也可能会导致相当大的开销,或者就像你让所有人合二为一一样数据库?
还有几点 - 其中一些客户将拥有 5000 多个“客户”以及这些客户的所有详细信息 - 这就是为什么选项 1 可能有点问题 - 如果我有 100 个客户,这可能等于 1 个表中超过 50 万行。
在客户数据(和支付信息)的安全性是关键的情况下,我认为选项 3 是最佳方式,这是否正确。根据我的建议,有些人说选择选项 1,因为“它更容易”,但我真的不这么认为。我认为这是一个潜在的瓶颈,因为如果他们有自己的数据库,我肯定可以更轻松地移动客户。
(仅供参考,系统是基于 PHP 和 mysql)
【问题讨论】:
【参考方案1】:多年前,当我设计一个用 PHP 构建 SaaS 应用程序的平台时,我选择了第三种选择:多租户代码和单租户数据库。
根据我的经验,这是最具可扩展性的选项,但它还需要一组脚本来在更新代码、数据库方案、为租户启用应用程序等时传播更改。
因此,我花了很多精力来构建基于组件的可扩展引擎,以完全自动化所有这些任务并最大限度地减少系统管理工作。如果您想采用第三种选择,我强烈建议您构建这样的架构。
【讨论】:
【参考方案2】:我同意 Ozzy 的观点——我这样做是为了一个在线数据库产品。我们有一个主数据库,它基本上有一个美化的用户表。每个客户都有自己的数据库。这样做的好处是我可以轻松地将一个客户数据库从服务器 A 移动到服务器 B [mysql],并且可以在紧要关头使用命令行工具来完成。同样对大表进行维护,删除/添加索引真的会搞砸你的应用程序,特别是如果说添加索引会锁定表 [mysql]。它影响到每个人。使用较小的数据库,您可能会对此更免疫,并且在您需要推出模式级别更改时有更多选择。我就是喜欢这种灵活性。
【讨论】:
【参考方案3】:选项 3 是最具可扩展性的。虽然一开始它可能看起来更复杂,但它可以完全自动化,并且会为您省去未来的麻烦。您还可以通过在多台服务器上安装客户端数据库来更有效地扩展以提高性能。
【讨论】:
谢谢 Ozzy - 这也是我的想法。唯一的潜在缺点,虽然不是一个主要缺点,但是是将表更新推送到所有数据库。但是,由于所有数据库都将运行同一组表,具有完全相同的结构,理论上我认为可以制作一个简单的脚本来循环所有数据库详细信息,连接,运行更新查询,断开连接然后移动到下一个数据库。以上是关于多租户 PHP SaaS - 为每个客户端单独的数据库,或将它们分组?的主要内容,如果未能解决你的问题,请参考以下文章