gpt4 book ai didi

ruby-on-rails - 是否可以在 rails 中有多个数据库连接池进行切换?

转载 作者:行者123 更新时间:2023-12-04 04:25:02 24 4
gpt4 key购买 nike

一点背景

我一直在使用Apartment gem多年运行 Multi-Tenancy 应用程序。现在最近需要将数据库扩展到单独的主机,数据库服务器根本无法再跟上(读取和写入都太多了) - 是的,我将硬件扩展到最大(专用硬件、64 个内核、raid 10 中的 12 个 Nvm-e 驱动器、384Gb ram 等)。

我正在考虑为每个租户执行此操作(1 个租户 = 1 个数据库连接配置/池),因为这将是达到 number-of-tenants 的“简单”且有效的方法。 - 无需进行大量应用程序代码更改,容量就增加了几倍。

现在,我正在运行 rails 4.2 atm。,很快升级到 5.2。我可以看到 rails 6 添加了对每个模型连接定义的支持,但这并不是我真正需要的,因为我的 20 个租户中的每一个都有一个完全镜像的数据库模式。通常我会为每个请求(在中间件中)或每个后台作业(sidekiq 中间件)切换“数据库”,但是这目前是微不足道的,并且可以在 Apartment gem 中处理,因为它只是设置了 search_path在 Postgresql 中并没有真正改变实际的连接。当切换到每租户托管策略时,我需要根据请求切换整个连接。

问题:

  • 我知道我可以做 ActiveRecord::Base.establish_connection(config)每个请求/后台作业 - 但是,据我所知,这会触发一个全新的数据库连接握手并在 rails 中生成一个新的数据库池 - 对吧?我想在对我的应用程序的每个请求上都产生这种开销是一种性能自杀。
  • 因此,我想知道是否有人可以看到带有 rails 的选项,例如从一开始就预先建立多个(总共 20 个)数据库连接/池(例如在应用程序启动时),然后每个请求在这些池之间切换?这样他的数据库连接已经建立并可以使用了。
  • 这一切只是一个糟糕的想法,我应该寻找不同的方法吗?例如。 1 个应用实例 = 与一个特定租户的一个特定连接。或者是其他东西。
  • 最佳答案

    据我了解, Multi-Tenancy 应用程序有 4 种模式:

    1.专用模型/多生产环境

    每个实例或数据库实例完全托管不同的租户应用程序,并且租户之间没有共享任何内容。

    这是 1 个租户的 1 个实例应用程序和 1 个数据库。开发会很容易,就像您只为 1 个租户提供服务一样。但是,如果你有 100 个租户,那么对于 devops 来说将是一场噩梦。

    2. 租户物理隔离

    所有租户的 1 个实例应用程序,但 1 个租户的 1 个数据库。这就是您要搜索的内容。您可以使用 ActiveRecord::Base.establish_connection(config) ,或使用 gems,或按照其他建议更新到 Rails 6。请参阅下面 (2) 的答案。

    3. 隔离模式模型/逻辑隔离

    在独立架构中,租户表或数据库组件在逻辑架构或 namespace 下分组,并与其他租户架构分开,但是架构托管在同一数据库实例中。

    为所有租户提供 1 个实例应用程序和 1 个数据库,就像使用公寓 gem 一样。

    4. 部分隔离组件

    在该模型中,具有共同功能的组件在租户之间共享,而具有独特或不相关功能的组件被隔离。在数据层,通用数据(例如识别租户的数据)被分组或保存在单个表中,而租户特定数据在表或实例层被隔离。

    至于(1),ActiveRecord::Base.establish_connection(config)如果您正确使用它,则不会根据请求与 db 握手。您可以查看hereread all the comment here .

    至于(2),如果不想用establish_connection , 你可以使用 gem multiverse (它适用于rails 4.2)或其他 gem 。或者,正如其他人建议的那样,您可以更新到 Rails 6。

    编辑:Multiverse gem 正在使用 establish_connection .它将附加 database.yml ,并创建一个基类,以便每个子类共享相同的连接/池。基本上,它减少了我们使用 establish_connection 的工作量.

    至于(3),答案是:

    如果您的租户不多,并且您的应用程序非常复杂,我建议您使用专用模型模式。因此,您选择 1 个应用程序实例 = 与一个特定租户的一个特定连接。您不必通过添加多个数据库连接来使您的应用程序更复杂。

    但是如果你有很 Multi-Tenancy ,我建议你使用租户的物理隔离或部分隔离的组件,这取决于你的业务流程。

    无论哪种方式,您都必须更新/重写您的应用程序以符合新架构。

    关于ruby-on-rails - 是否可以在 rails 中有多个数据库连接池进行切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60421158/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com