Mysql 和多租户数据库:最好的组织方式?

bra*_*r19 5 mysql multi-tenant

我以前从未完成过任何多租户项目......

使用 mysql 组织多租户数据库的最佳方法是什么?并在不同公司之间分开访问?

确保可以通过不同的方式完成:

  1. 每个公司的数据库不同
  2. 每个公司都有不同的表
  3. 每个表一个数据库,列为tenant_id

我更喜欢第三个选择。

但是:是否有可能以某种方式限制不同公司数据之间的访问,例如使用 mysql 模式(或其他东西)而不使用后端代码?

我听说,在 postgresql 中可以使用模式......

但这在mysql中可能吗?(例如tenant1无法查看tenant2的数据)

Ric*_*mes 2

  • 如果您有数千个表或数千个数据库,则可能会出现性能问题。
  • 如果你让客户自己直接连接到mysql,那么必须控制他们的GRANTs,可以在数据库或表级别进行管理。(这是“限制访问”的一种方法。)
  • 如果您将所有客户放入同一组表中,那么您必须通过应用程序层提供安全性,并自行管理登录,而不是通过 MySQL 的GRANTs.
  • 可以尝试使用VIEWs, 和权限来限制用户。让用户连接到数据集,但仅限于查看。在视图中构建一种将其限制为 的方法tenant_id...。(这个方法我没有深思熟虑,可能有致命的缺陷。)
  • 第四种选择是拥有单独的 MySQL 实例;每个客户几乎可以完全控制他的实例。(您保持管理控制权。)
  • 对于第四个选项,有很多选择 - VM、Docker、mysql_multi 等。请注意:这些往往在 *nix 上工作得更好,而不是在 Windows 上。(尽管经过了数十年的发展,当谈到“服务器”领域的“黄金时段”准备时,Win 仍然落后于 *nix。)
  • 使用第四个选项,CGroups 可用于限制每个客户的资源使用。这样,一个逃跑的顾客就不会严重伤害其他顾客。
  • 另一个考虑因素:“分片”有多容易?也就是说,拥有多个服务器,每个服务器处理一些客户。特别是,将客户从一个分片迁移到另一个分片需要什么。一旦解决了这个问题,你就解决了如何升级硬件、操作系统、MySQL 版本等问题。
  • 你们是否提供特定的客户端软件(例如 WordPress)(SaaS)?或者您只是提供一个数据库引擎(DaaS)?
  • 同一个服务器上会有客户端软件吗?