【问题标题】:Multi-tenancy: Individual database per tenant多租户:每个租户的单独数据库
【发布时间】:2021-09-23 23:41:07
【问题描述】:

我们正在开发一个多租户应用程序。在架构方面,我们为业务逻辑设计了共享中间层,为数据持久化设计了每个租户一个数据库。也就是说,业务层将与每个租户的数据库服务器建立一组连接(连接池)。这意味着应用程序为每个租户维护单独的连接池。如果我们预计大约有 5000 个租户,那么这个解决方案需要很高的资源利用率(每个租户的应用服务器和数据库服务器之间的连接),这会导致性能问题。

我们已经通过保持公共连接池解决了这个问题。为了维护跨不同数据库的单一连接池,我们创建了一个名为“App-master”的新数据库。现在,我们总是先连接到“App-master”数据库,然后将数据库更改为租户特定的数据库。这解决了我们的连接池问题。

此解决方案与本地数据库服务器完美配合。但它不适用于 Azure Sql,因为它不支持更改数据库。

提前了解如何维护连接池或更好的方法/最佳实践来处理这种多租户场景。

【问题讨论】:

  • 池是每个不同的连接字符串。这意味着如果您有 5000 个租户,则池大小为 5000*100 个连接(每个连接字符串池中有 100 个连接)。我想知道你当时谈论的是什么问题。我们维护了几个拥有数千个租户的多租户应用程序,并且没有发现任何与池相关的问题会导致我们实施自定义池。
  • 我们在 Azure 中有一个类似的系统,与现有的池连接相比,与数据库的初始连接时间明显慢。
  • 快速问:您是直接从云外部连接到数据库,还是(大提示)您使用 Web 服务将连接问题牢牢控制在 Azure 端?
  • @WiktorZychla,感谢您的回复。实际上,我们认为它应该成为我们的瓶颈,所以要小心。所以,你的意思是你已经经历过这样的场景,你没有发现任何问题(SQL Server /所有其他应用服务器)?
  • @SeanCocteau,目前我们正在尝试使用本地开发盒,但最终生产将在 Azure 上进行。

标签: c# azure azure-sql-database connection-pooling multi-tenant


【解决方案1】:

我之前曾在多个具有单独数据库的租赁方案中看到过这个问题。有两个重叠的问题;每个租户的 Web 服务器数量,以及租户总数。第一个是更大的问题 - 如果您通过 ADO.net 连接池缓存数据库连接,那么任何特定客户连接进入与其数据库有开放连接的 Web 服务器的可能性与您的 Web 服务器数量成反比有。扩展的越多,任何给定的客户都会注意到每次调用(而不是初始登录)延迟,因为 Web 服务器代表他们与数据库进行初始连接。对非粘性、高度可扩展的 Web 服务器层的每次调用都将降低找到可重用的现有开放数据库连接的可能性。

第二个问题只是池中有这么多连接,这可能会造成内存压力或性能不佳。

您可以通过建立数量有限的数据库应用程序服务器(简单的 WCF 端点)来“解决”第一个问题,这些服务器代表您的 Web 服务器执行数据库通信。每个 WCF 数据库应用程序服务器都服务于一个已知的客户连接池(东部区域转到服务器 A,西部区域转到服务器 B),这意味着对于任何给定请求,连接池命中的可能性非常高。这还允许您单独扩展对数据库的访问以访问 HTML 呈现 Web 服务器(数据库是您最关键的性能瓶颈,因此这可能不是一件坏事)。

第二种解决方案是通过 NLB 路由器使用特定于内容的路由。这些基于内容的流量路由,并允许您按客户分组(西部地区、东部地区等)划分您的 Web 服务器层,因此每组 Web 服务器的活动连接数量要少得多,获得的可能性相应增加一个打开且未使用的连接。

这两个问题通常都是缓存问题,作为一个完全“非粘性”的架构横向扩展得越多,任何调用访问缓存数据的可能性就越小 - 无论是缓存的数据库连接,还是读取缓存的数据。管理用户连接以最大限度地提高缓存命中的可能性对于保持高性能很有用。

【讨论】:

    【解决方案2】:

    另一种限制每个应用服务器连接池数量的方法是使用应用程序请求路由 (ARR) 来划分租户并将它们分配给 Web 层的子集。这适用于更具可扩展性的“pod”架构,其中“pod”是与数据库子集耦合的 Web/应用程序服务器的小集合。关于这种方法的一篇好文章在这里: http://azure.microsoft.com/blog/2013/10/31/application-request-routing-in-csf/

    如果您正在构建多租户数据库应用程序 Azure,您还应该查看新的 Elastic Sc​​ale 客户端库,这些库可以简化数据相关路由并促进跨分片查询和管理操作。 http://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-scale-documentation-map/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2017-09-16
      • 2014-11-01
      相关资源
      最近更新 更多