多租户应用程序:Mongodb分片所有租户的一个数据库VS每个租户的一个数据库

时间:2020-04-20 17:14:34

标签: node.js mongodb multi-tenant sharding

我正在构建一个多租户SaaS应用程序,在那里我有很多客户(可能从数百到数千)。这些客户中的每一个都有自己的客户,他们可以在我们的应用程序上进行帐户和互动。 我将Node用于服务器,将MongoDB用于数据库。

当前,我存储租户数据的方法是将所有数据存储在一个数据库中,并使用 Mongodb Sharding 对所有租户的数据进行分区并在我将来需要它。在我看来,MongoDB分片似乎是一种分区和管理数据的好方法。

但是,有人建议我为每个租户建立一个数据库。他们说这样做会更好,因为更容易“迁移/管理/扩展”和“更安全”。我想对此发表第二意见。

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

我将不胜感激。预先感谢您的回答!

1 个答案:

答案 0 :(得分:3)

这些是我的观点,很想讨论。

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

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

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

  • 集群#01:名称开头为A-H的租户
  • 集群#02:名称相同的租户以H-S开头
  • ...

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

考虑企业解决方案:我更愿意向客户提供on-premise

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