多租户应用:Mongodb Sharding 所有租户一库 VS 一租户一库

KJ *_*Ang 1 sharding multi-tenant mongodb node.js

我正在构建一个多租户 SaaS 应用程序,其中有许多客户(可以从数百到数千)。每个客户都有自己的客户,他们可以在我们的应用程序上创建帐户并进行交互。我使用 Node 作为我的服务器,使用 MongoDB 作为数据库。

目前,我存储租户数据的方法是将他们的所有数据放在一个数据库中,并使用Mongodb Sharding对所有租户的数据进行分区,并在将来需要时进行扩展。在我看来,MongoDB 分片是一种分区和管理数据的好方法。

然而,有些人建议我应该为每个租户拥有一个数据库。他们说它更好,因为它更容易“迁移/管理/扩展”并且“更安全”。我想就此征求第二意见。

为每个租户提供一个数据库会增加我的应用程序的复杂性,因此我想知道它是否真的有必要。

如果有任何见解,我将不胜感激。预先感谢您的答复!

den*_*maz 5

这些是我的意见,很乐意讨论。

有几种众所周知的方法来存储基于租户的数据。我认为这取决于您的解决方案、预算、团队规模以及您想要将复杂性放在哪里。

  • 每个租户的数据库系统实例:我们通常使用这种方法来on-premise解决。租户在自己的服务器/云上使用和管理自己的数据库实例。
  • 每个租户数据库:这是云解决方案中将租户数据彼此隔离的最安全方法。但需要额外的维护和管理工作(备份、开发变更、重新索引等)。此外,应用程序应该能够处理/池化每个数据库的连接。
  • 每个租户的架构(在 MongoDb 世界中这是不可能的,因为它没有架构)
  • 每个租户的表/集合
  • 每个租户的行/文档:提供弱隔离。并且必须针对每种查询进行良好的优化。然而,最简单的维护方法。

考虑由一个非常小的团队(2 或 3 人)维护的解决方案:我将使用document-based isolation (with a field tenantId)并拥有多个sharded clusters通过使用租户姓名首字母作为分片键来扩展租户数据。

  • cluster#01:名称以 AH 开头的租户
  • cluster#02:名称以 HS 开头的租户
  • ...

考虑到全球成千上万的客户使用并由大型团队维护的云解决方案:可能我会选择having sharded clusters(在不同的国家/地区位置),并按租户的位置将租户分散到相应的分片集群中并拥有database per tenant

考虑企业解决方案:我更喜欢提供on-premise给客户。

除此之外:我可以考虑使用从属实例replica sets来执行读取操作,而不是使用主实例。