MySQL多租户应用程序 - 太多表和&性能问题

时间:2017-01-03 19:09:15

标签: mysql database database-design multi-tenant

我正在开发一个多租户应用程序,在每个租户中,我在LAMP环境中的单个MySQL数据库中创建单独的50个表。

在每个集合中,平均表大小为10 MB,但大约10个表的大小在50到200 MB之间。

MySQL InnoDB为每个表创建了2个文件(.frm& .ibd)。

对于100个租户,将有100 x 50 = 5000个表x 2个文件= 10,000个文件

对我来说太高了。我是以错误的方式做到这一点,还是在这种情况下常见的做法。我应该考虑哪些其他选择?

我也是read this question但是这个问题被主持人关闭了,所以它没有吸引很多想法。

3 个答案:

答案 0 :(得分:1)

每个租户都有一个数据库。这将是100个目录,每个目录有2 * 50 = 100个文件。 100是合理的;在大多数操作系统中,目录中的10,000个项目都是危险的。

<强>附加物

如果您有15个表供所有租户使用,请将它们放在一个额外的数据库中。如果您调用该数据库Common,请考虑以下信息:

USE Tenant;    -- Customer starts in his own db
SELECT ... FROM table1 ...;   -- Accesses `table1` for that tenant
SELECT a.this, b.blah
    FROM table1 AS a             -- tenant's table
    JOIN Common.foo AS b  ON ... -- common table

关于拨款的说明......

GRANT ALL PRIVILEGES ON Tenant_123.* TO tenant_123@'%' IDENTIFIED BY ...;
GRANT SELECT ON Common.* TO tenant_123@'%';

也就是说,授予&#39;他自己的数据库的一切。 他显示对Common数据的访问权限非常有限。

相反,如果您管理登录并且所有访问都通过,例如,PHP API,那么您可能只有一个mysql&#39;用户&#39;对于所有访问。在这种情况下,我上面关于GRANTs的说明不相关。

让租户可以访问所有内容。您的整个系统很快就会被黑客攻击并可能被破坏。

答案 1 :(得分:0)

通常情况下,这与使用哪种方式几乎没有关系,哪种方式基本上会让您的客户以完成方式销售,或者在某些情况下由于类型而无法选择数据。

例如,您的应用程序是否有定义用户生成数据隔离的策略或类似内容?您的应用程序是否存储HIPAA或PCI类型数据?如果是这样,您甚至可能没有选择权,如果客户期望这种隐私,由于创建分离的潜在开销,这通常会非常宝贵。

如果不需要分离/隔离数据,那么从表格中添加一个字段来指示哪个应用程序拥有数据将是最理想的,从性能的角度来看,您只需要更新您的查询以根据它进行过滤。

答案 2 :(得分:0)

使用MySQL或MariaDB,我更喜欢对所有租户使用一个数据库,并通过对每个租户仅使用其数据权限的不同数据库用户来限制对数据的访问。

您可以通过使用tenant_id列来完成,该列存储拥有数据的租户的数据库用户名。添加新行时,我使用触发器自动填充此列。然后,我使用“视图”过滤其中tenant_id = current_database_user的表。然后,我限制租户数据库用户只能访问视图,而不能访问实际表。

我能够使用这种技术在一个周末内将大型单租户应用程序转换为多租户应用程序,因为我只需要修改数据库和数据库连接代码。

我写了一篇博客文章,充分描述了这种方法。 https://opensource.io/it/mysql-multi-tenant/