当前位置: 首页 > 知识库问答 >
问题:

如何设计多租户节点。js应用程序?

宋飞掣
2023-03-14

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

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

结构如下:

  • 有一个核心数据库,用于保存特定租户的数据和关系
  • 有多个租户数据库实例(通过核心数据库中的查询,可以确定我应该连接到哪个租户id)
  • 每个租户都位于一个单独的数据库实例(位于单独的服务器上)
  • 每个租户都有特定的数据,其他租户都不应访问这些数据
  • 每个数据库最好是mySQL(但如果有更好的选择,我愿意接受建议)
  • 后端用膝关节炎框架
  • 编写
  • 核心数据库和租户数据库的数据库模型不同
  • 每个租户数据库最大的表可能有大约100万条记录(无需审计)
  • 乐观地说,租户数量可能会增长到50人

关于该项目的其他数据:

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

问题是:

这是设计多租户体系结构的正确方法,还是应该对体系结构进行重新设计?

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

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

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

编辑:-这些数据库当前将托管在Azure中,但如果需要的话,我们更希望它们可以迁移出去

共有2个答案

夏侯衡
2023-03-14

对我来说似乎很好。

我发现一个瓶颈是每个租户都在一个单独的DB服务器或DB实例上。这意味着您需要为每个租户保留一个单独的连接池,或者根据租户的不同为每个请求创建一个新连接。尝试使用任何可以为所有租户(名称空间、模式或仅使用特定于租户的前缀作为租户表名称的前缀)提供一个DB连接的概念

但是,如果您需要将租户的DBs分开,例如,由于不同的备份策略、资源限制等,您不能这样做,必须为每个租户管理单独的连接池。这还取决于你有多少租户。成千上万?

我还建议你把房客藏起来

苏健柏
2023-03-14

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

第一个选项:

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

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

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

第二种选择

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

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

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

第三个选择:

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

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

第四选项

行隔离。

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

另一个优点是,您不需要devops复杂的策略,而且如果您使用的是SQL Server,我知道,存在一个名为行级安全性的资源,您只需要获得登录用户有权限的数据。

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

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

 类似资料:
  • 我目前正试图找出为我的系统设置多租户的最佳方法。我面临的问题是,租户并不总是必须是子域,但可以作为子域的一部分进行设置,子域可以有多个租户。我似乎在网上找不到任何东西可以帮助我在Laravel 6中进行设置。 系统要求: 一台服务器可以有许多子域 系统必须设置一个数据库,该数据库将使用tenant_id来确定哪些数据属于租户。 我目前正在以以下结构将所有子域数据存储在“subdomains”表中:

  • 问题内容: 让我们说我需要设计一个数据库,该数据库将托管多个公司的数据。现在出于安全和管理目的,我需要确保正确隔离了不同公司的数据,但我也不想启动10个mysql进程来在10个不同的服务器上托管10个公司的数据。使用mysql数据库执行此操作的最佳方法是什么。 问题答案: 多租户数据库有几种方法。为了进行讨论,它们通常分为三类。 每个租户一个数据库。 共享数据库,每个租户一个模式。 共享数据库,共

  • 我必须在j2ee中开发一个多租户SaaS应用程序,从Iaas和PaaS开始实现三种云模型,我选择了openstack和openshift origin。SaaS应用程序的第一个标准是多租户,我知道有三种方法来实现它——单独的数据库——共享数据库,单独的模式——共享数据库,共享模式。我在这里迷失了方向,因为许多框架,比如ATHENA,ORM,比如hibernate,还有TOPLINK。我需要帮助了解

  • 我已经安装了keycloak-angular包,我使用它的方式如下:https://www.npmjs.com/package/keycloak-angular 问题是,在我的应用程序中,我希望有多租户。这意味着在应用程序加载期间不知道领域名。 在说明中,它说“KeycloakService应该在应用程序加载期间使用APP_INITIALIZER标记初始化”,问题是该领域是由用户给定的,在应用程序

  • 我正在使用Java、Spring、Struts2和Hibernate设计一个多租户SaaS Web应用程序。经过一些研究,我选择在共享数据库、共享模式、共享表的方法中实现多租户。并用tenantid标记每个db行。 我已经重写了我的应用程序,所以管理者和DAO将把tenantId作为一个参数,只为正确的数据库资源服务。 当获取信息时,这对所有视图来说都是完美的。也用于创建新的东西(使用登录的用户t

  • 我有两个来自不同组织(租户)的SharePoint网站: 房客1:abc.sharepoint.com 房客2:xyz.sharepoint.com 已在azure portal for Tenan 1'abc上注册并授予应用程序所需的权限。sharepoint。com”,以便租户2用户可以访问它:“xyz”。sharepoint。com' 认证工作正常 当我与租户1的abc用户进行身份验证时,对