当使用PgBouncer作为连接池时需要
项目描述
本模块使得可以使用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上跟踪。如果遇到问题,请检查那里是否已经报告了您的问题。如果您是第一个发现它的人,请通过提供详细且受欢迎的反馈来帮助我们解决它。
不要直接联系贡献者以获取支持或技术问题的帮助。
致谢
贡献者
Nils Hamerlinck <nils@trobz.com>
维护者
本模块由OCA维护。
OCA,即Odoo社区协会,是一个非营利组织,其使命是支持Odoo功能的协作开发并推广其广泛使用。
本模块是GitHub上的OCA/server-tools项目的组成部分。
欢迎您做出贡献。要了解如何操作,请访问https://odoo-community.org/page/Contribute。
项目详情
哈希值 for odoo_addon_bus_alt_connection-16.0.1.0.0.2-py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a6fc8b34100f0d870947fe131db600434c9e8e6cff268eae95929eb685f2a748 |
|
MD5 | df56d83bd8c046405b97e18e956cbd5d |
|
BLAKE2b-256 | 0cecfeb6c248fc27f1af0158b9a977cc1b983931f20fbc9748b869c386fcb5fe |