在使用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时,您可以选择2种事务池模式之一
pool_mode = session
pool_mode = transaction
如果我们选择 pool_mode = session,则一个服务器连接将与指定的Odoo进程绑定,直到其结束,这正是我们试图改变的地方。因此,为了在事务完成后释放服务器连接,我们使用 pool_mode = transaction。
这工作得很好,但Odoo的longpolling功能依赖于来自pg的 LISTEN/NOTIFY 机制,这与该模式不兼容。
更准确地说,NOTIFY 语句在该模式下被PgBouncer正确传递;只有 LISTEN 语句没有(因为它需要保持服务器连接打开)。
因此,对于每个实例所需的唯一“监听”连接,该语句需要直接连接到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。
项目详情
odoo14_addon_bus_alt_connection-14.0.1.0.1.dev2-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | afef7edf1e1c174dd3c74a450a3d89c47ccae22026476cef9ed00016ca0a8daa |
|
MD5 | 0d6125c19fd2afaafa4edf6d77184152 |
|
BLAKE2b-256 | 1308204aaaee9ef8577a9e2fbff75800dccfe42d41b1794d96833828f1be42ae |