如何设计多租户node.js应用程序?

时间:2018-04-13 07:55:56

标签: node.js database orm multi-tenant koa

目前我正面临着一项技术决策,而且我个人无法自己找到解决方案。

我目前正在开发多租户数据库。

结构如下:

  • 有一个核心数据库可以保存有关特定租户的数据和关系
  • 有多个租户数据库实例(来自核心数据库中的查询,确定应该连接哪个租户ID)
  • 每个租户都在一个单独的数据库实例上(在单独的服务器上)
  • 每个租户都有其他租户无法访问的特定数据
  • 每个数据库最好都在mySQL中(但如果有更好的选择,我愿意接受建议)
  • 后端是用koa框架编写的
  • 核心数据库和租户数据库中的数据库模型不同
  • 每个租户数据库的最大表可能大约为1mil记录(没有审核)
  • 乐观地认为租户的数量可能增长到50

有关该项目的有条件数据:

  • 所有项目的数据均可供所有者使用
  • 每位客户都有可供自己租客使用的数据
  • 每个租户都有自己的网站
  • 每个租户的数据库结构保持不变
  • 项目主要是物流服务,其数据是针对每个不同的地区进行隔离的。

问题:

这是设计多租户架构的正确方法还是应该在架构中进行重新设计?

如果可能有多个服务器的多租户 - 是否应该有一个更好的工具/技术堆栈? (希望更具体地了解这个

最好使用ORM。我目前正在尝试使用Sequelize,但我已经在早期遇到问题(多个数据库不能共享相同的模型,管理多个连接)。

理想的目标是在没有太多额外配置的情况下添加额外租户的可能性。

编辑: - 数据库当前将托管在Azure中,但我们更喜欢可以在需要时迁移它们的选项

2 个答案:

答案 0 :(得分:3)

存在一些在多租户架构中构建数据结构的方法。 很难说什么是更好的选择,但我会尝试用我的小知识来帮助你。

第一个选项:

在分布式服务器中隔离您的数据库,例如每个租赁都将您自己的数据库服务器完全隔离。

这可能很好,因为我们在租赁数据方面有很多安全性,我们可以确保其他租赁从未看到其他租赁数据。

在这种情况下,我看到一些问题,考虑成本,我们可以增加很多,因为我们需要一台机器给每个客户,也许软件许可,取决于你的环境。考虑到devops,我们需要一个复杂的策略来创建和部署每个新租户的新实例。

第二个选项

单独的数据库,我们有一台服务器,我们为每个租赁创建单独的数据库。

如果您需要为每个客户提供隔离,通常会使用此方法,因为我们可以将不同的登录,权限等关联到每个数据库

其他一些缺点:每个数据库需要一个不同的连接池,必须跨所有数据库复制更新,没有资源共享(除非使用弹性数据库池),并且您需要跨所有数据库的多个备份策略,以及复杂的devops战略,以部署和创建新的租约。

第三个选项:

单独的模式,实施多租户架构是一个很好的策略,我们可以共享一些资源管理器,因为一切都在同一个数据库中,但是使用的模式是不同的,每个租户都有一个单独的模式。这使您甚至可以自定义特定租户而不会影响其他租户。而且您只需支付一个数据库就可以节省成本

一些缺点:您需要复制每个模式中的所有数据库对象,因此对象数量可以无限增加,必须跨所有模式复制更新,数据库的连接池必须保持不同的连接租户(或一组凭证),每个租户需要一个不同的用户(存储在服务器级别),您必须独立备份该用户。

第四个选项

行隔离。

此选项,服务器,数据库和架构中共享所有内容。租户的所有数据都位于同一数据库中的相同表中。它们区分的唯一方法是基于TenantId或表级别中存在的其他一些列。

其他好处是你不需要devop复杂的策略,如果你使用的是SQL Server,我知道存在一个名为行级安全的资源,你只能得到用户有权限的数据。

但是在这种情况下,如果你有数千名用户同时访问数据库,你需要一些approch以获得良好的可扩展性

所以你需要考虑你的情况以及你的系统如何成长,你可以选择更好的选择。

答案 1 :(得分:0)

对我来说似乎很好。

我看到瓶颈在于每个租户都在一个单独的数据库服务器或数据库实例上。这意味着您需要为每个租户保留一个单独的连接池,或者根据租户为每个请求创建一个新连接。尝试使用任何可以为所有租户建立一个数据库连接的概念(名称空间,模式或只是为租户表名添加一些特定于租户的前缀)

但是如果你需要将租户DB分开,例如。由于不同的备份策略,资源限制等,您无法执行此操作,并且必须为每个租户管理单独的连接池。这还取决于你有多少租户。几万,几千?

我还建议你在应用程序的某处缓存租户 - >数据库映射,而不是每次都从核心数据库中查询它。