node.js - 如何设计 Multi-Tenancy node.js 应用程序?

标签 node.js database orm multi-tenant koa

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

我目前正在开发一个 Multi-Tenancy 数据库。

结构如下:

  • 有一个核心数据库,保存特定租户的数据和关系
  • 有多个租户数据库实例(从核心数据库中的查询,确定我应该连接到哪个租户id)
  • 每个租户都在一个单独的数据库实例上(在一个单独的服务器上)
  • 每个租户都有其他租户无法访问的特定数据
  • 最好每个数据库都在 mySQL 中(但如果有更好的选择,我愿意接受建议)
  • 后台使用koa框架编写
  • 核心数据库和租户数据库的数据库模型不同
  • 每个租户数据库的最大表可能有大约 100 万条记录(未经审计)
  • 最乐观的情况是租户数量可以增加到 50

有关项目的其他数据:

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

问题:

这是设计 Multi-Tenancy 架构的正确方法还是应该重新设计架构?

如果 Multi-Tenancy 和多台服务器是可能的——是否有更好的工具/技术栈应该做? (想更具体地了解这一点)

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

理想的目标是无需太多额外配置即可添加更 Multi-Tenancy 。

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

最佳答案

存在一些在 Multi-Tenancy 架构中构建数据结构的方法。 很难说什么是更好的选择,但我会尽力用我的一点知识帮助你。

第一个选项:

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

这可能很好,因为我们对租户数据有很多安全措施,我们可以确保其他租户永远不会看到其他租户数据。

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

第二个选项

独立的数据库,我们有一台服务器,我们在其中为每个租户创建独立的数据库。

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

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

第三个选项:

Separate Schemas,这是实现 Multi-Tenancy 架构的好策略,我们可以共享一些资源,因为一切都在同一个数据库中,但使用的模式不同,每个租户都有一个单独的模式。这使您甚至可以自定义特定租户而不影响其他租户。您只需为一个数据库付费即可节省成本。

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

第四个选项

行隔离。

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

另一个好处是你不需要复杂的 devops 策略,如果你使用的是 SQL Server,我知道,存在一个名为行级安全性的资源,你可以只获取登录用户具有权限的数据。

但在这种情况下,如果您有成千上万的用户同时访问数据库,您将需要一些方法来实现良好的可伸缩性。

因此您需要考虑您的情况以及您的系统将如何成长,以选择更好的选项。

关于node.js - 如何设计 Multi-Tenancy node.js 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49811993/

相关文章:

mongodb - Node.js + MongoDB this._handle.write(data) 在 net.js 中的窃听

javascript - AWS - 输入域 URL 时没有此类存储桶错误

java - 哪个 ODBC-JDBC 桥将自己的调用映射到 JDBC 驱动程序?

php - Laravel Eloquent 困难关系查询

hibernate - PropertyAccessor 和 PropertyAccessorFactory 是否已删除或弃用?

python - django 'QuerySet' 对象中的反向关系没有属性 'name'

node.js - 使用koa,我可以有条件地应用passport中间件吗?

javascript - 将单独 JS 文件中的项目迭代添加到行中的 HTML/EJS 表中 - 使用 NodeJS

database - 如何在 Vaadin 上创建用户身份验证?

java - CPU 进程可以决定应用程序的速度潜力