跳转到主要内容

当使用PgBouncer作为连接池时需要

项目描述

Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

本模块使得可以使用PgBouncer作为odoo的连接池。

为什么Odoo的连接池不够好呢?

Odoo内置的连接池在进程级别工作:每个Odoo进程都有自己的ConnectionPool,限制在db_maxconn

它负责复用池中可用的打开连接。但它从不关闭这些连接,除非达到db_maxconn

在实践中,我们观察到每个odoo工作进程最终会在其池中结束多达3个打开的连接。如果有10个http工作进程,那么仅针对一个实例就持续打开多达30个连接。

这就是PgBouncer的用武之地

PgBouncer将帮助限制打开连接的数量,通过在实例级别共享连接池,在所有工作进程之间共享。Odoo工作进程仍然可以保持多达3个打开的连接,但这些将是到PgBouncer的连接,而PgBouncer将关闭到pg的不必要连接。

这在具有多个实例的Odoo部署中已被证明有助于提高性能。

它允许您根据优先级定义如何共享资源,例如

  • 主机A上的关键odoo实例可以打开多达30个连接

  • 而主机B上的odoo实例,专门用于报告,只能打开多达10个连接

最重要的是,它可以帮助您确保pg服务器端永远不会达到max_connections的最大连接数。

为什么需要这个模块?

当配置PgBouncer时,您可以在两种事务池模式之间进行选择

  • pool_mode = session

  • pool_mode = transaction

如果我们选择pool_mode = session,则一个服务器连接将绑定到特定的odoo进程,直到其终止,这正是我们试图改变的地方。因此,为了在事务完成后释放服务器连接,我们使用pool_mode = transaction

这可以正常工作,但Odoo的longpolling功能依赖于pg的LISTEN/NOTIFY机制,该机制与该模式不兼容

更准确地说,在该模式下,NOTIFY语句被PgBouncer正确传输;只有LISTEN语句不被传输(因为它需要保持服务器连接打开)。

因此,对于需要此语句的每个实例的唯一“监听”连接(此处),我们需要odoo直接连接到pg服务器,绕过PgBouncer。

这正是本模块实现的内容,通过覆盖Dispatcher的相关方法。

目录

安装

您不需要在数据库中安装此模块即可启用它。

但您需要在服务器端加载它

  • 通过使用--load=web,bus_alt_connection启动Odoo

  • 或者更新其配置文件

[options]
(...)
server_wide_modules = web,bus_alt_connection

配置

您需要定义如何直接连接到数据库

  • 可以通过定义环境变量来实现

    • IMDISPATCHER_DB_HOST=db-01

    • IMDISPATCHER_DB_PORT=5432

  • 或者Odoo的配置文件中

[options]
(...)
imdispatcher_db_host = db-01
imdispatcher_db_port = 5432

错误跟踪

错误在GitHub Issues上跟踪。如果遇到问题,请检查那里是否已经报告了您的问题。如果您是第一个发现它的人,请通过提供详细且受欢迎的反馈来帮助我们解决它。

不要直接联系贡献者以获取支持或技术问题的帮助。

致谢

作者

  • Trobz

贡献者

维护者

本模块由OCA维护。

Odoo Community Association

OCA,即Odoo社区协会,是一个非营利组织,其使命是支持Odoo功能的协作开发并推广其广泛使用。

本模块是GitHub上的OCA/server-tools项目的组成部分。

欢迎您做出贡献。要了解如何操作,请访问https://odoo-community.org/page/Contribute

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装软件包的信息。

源代码分发

此发布版本没有提供源代码分发文件。有关生成分发存档的教程,请参阅生成分发存档

构建分发

由以下支持