我正在构建一个多租户SaaS应用程序,在那里我有很多客户(可以从数百到数千(。这些客户中的每一个都有自己的客户,他们可以在我们的应用程序上创建帐户并进行互动。我的服务器使用Node,数据库使用MongoDB。
目前,我存储租户数据的方法是将他们的所有数据放在一个数据库中,并使用Mongodb Sharding对租户的所有数据进行分区,并在未来需要时进行扩展。在我看来,MongoDB分片是一种划分和管理数据的好方法。
但是,有些人建议我为每个租户提供一个数据库。他们说这更好,因为它更容易"迁移/管理/扩展",而且"更安全"。我想对这件事有另一种看法。
给每个租户一个数据库会增加我的应用程序的复杂性,所以我想知道这是否真的有必要。
如果有任何见解,我将不胜感激。提前感谢您的回答!
这些是我的意见,很乐意讨论。
有几种众所周知的方法可以存储基于租户的数据。我认为这取决于你的解决方案、预算、团队规模以及你想把复杂性放在哪里。
-
每个租户的数据库系统实例:我们通常将此方法用于
on-premise
解决方案。租户在自己的服务器/云上使用和管理自己的数据库实例 - 每个租户的数据库:对于云解决方案,这是将租户的数据相互隔离的最安全方法。但是需要额外的维护和管理工作(备份、开发更改、重新索引等(。此外,应用程序应该能够处理/池化每个数据库的连接
- 每个租户的架构(在MongoDb世界中,这是不可能的,因为它没有架构(
- 每个租户的表/集合:
- 每个租户的行/文档:提供弱隔离。并且必须针对每种查询进行良好的优化。然而,最简单的维护方法
考虑由一个非常小的团队(2或3人(维护的解决方案:我会使用document-based isolation (with a field tenantId)
,并有几个sharded clusters
通过使用租户名称的首字母缩写作为分片密钥来扩展租户数据。
- cluster#01:名称为A-H的租户
- 集群#02:名称为H-S的租户
考虑一个由全球数千名客户使用并由大型团队维护的云解决方案:我可能会使用sharded clusters
(在不同的国家/地区位置(,并根据租户的位置将租户分散到各自的分片集群中,并使用database per tenant
。
考虑企业解决方案:我更愿意向客户提供on-premise
。
除此之外:我可以考虑使用从replica sets
来执行读取操作,而不是使用主实例。