共享多租户 MySQL 数据库的可扩展性

Posted

技术标签:

【中文标题】共享多租户 MySQL 数据库的可扩展性【英文标题】:Scalability in shared multi-tenant MySQL database 【发布时间】:2018-07-13 20:38:20 【问题描述】:

我正在为大量租户设计通用的基于 Web 的 CRM 应用程序。 用户(租户)在线注册以使用该应用程序。最初不会有那么多用户,但将来有可能。

我想使用单一共享的 mysql 数据库。由于选择的场景和未来的功能集成,不可能为每个租户创建单独的数据库。编程将使用 php

但是,我应该如何解决数据可扩展性问题:

    如果表中的行超过表的大小怎么办。如何解决这个问题? 如果我使用自动递增 BIGINT 主键,例如“联系人”表。达到 BIGINT 的最大值后会发生什么? 在真正的大数据表中使用外键约束是最佳实践吗?如果使用或不使用,它将如何影响应用程序的性能? MySQL 是否适合此类应用程序? Zoho CRM 的多租户数据库技术是什么?

【问题讨论】:

仅仅问这些问题表明你没有什么可担心的,因为你不了解数字和缩放。最大的 bigint 是 9,223,372,036,854,775,807。鉴于这大约是人类数量的十亿倍,我不会担心你的联系人表溢出——假设你的联系人是人类。 我不得不查一下这个数字,因为我不知道有多大,但 "nine quintillion two hundred twenty-three quadrillion three hundred seventy-two trillion thirty-six billion eight hundred fifty-four million seven hundred seventy-five thousand eight hundred seven" 让我头晕目眩 【参考方案1】:

MySQL 是一个很好的扩展up,即使有巨大的表。基本上你可以把你的数据库放在更大更强大的服务器上来处理需求。根据我的经验,它通常受到 RAM 的限制。

一旦该技术开始变得冒险,您就可以通过创建数据库的只读副本来扩展。基本上,这些是主数据库的只读副本,与主数据库持续同步。在您的应用程序中使用两个不同的数据库连接。第一个连接是一个只读副本,用于所有 SELECT 语句。另一个连接是到您的主服务器,用于所有 INSERT、UPDATE 和 DELETE 语句。由于许多应用程序执行的 SELECT 操作比其他任何操作都多,并且您可以创建的只读副本数量几乎没有限制,这将大大扩展您的潜在规模。

在 MySQL 中,我倾向于为所有租户使用单个数据库,并通过为每个租户使用不同的数据库用户名来分割数据。通过按tenant_id 过滤的tenant_id 列和视图,我可以确保租户无权访问其他租户的数据。我写了一篇关于如何在周末将单租户应用程序转换为多租户的博客文章:https://opensource.io/it/mysql-multi-tenant/

为所有租户拥有一个数据库和一个代码库比多个数据库或架构更容易维护。

【讨论】:

嗨,Rob,指向您博客文章的链接似乎已损坏。你有其他链接吗?谢谢!

以上是关于共享多租户 MySQL 数据库的可扩展性的主要内容,如果未能解决你的问题,请参考以下文章

多租户SaaS的数据库设计模式

如何在多租户应用程序的业务层中为可扩展的数据库结构设计实体?

OpenStack 企业私有云的若干需求:多租户和租户间隔离(multi-tenancy and isolation)

多租户私有云和多租户公有云的区别

每个租户托管建议的数据库(高可扩展性)

如何使用共享数据库和共享模式方法提高多租户的性能