当使用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
池模式 = 事务
如果我们选择 池模式 = 会话,则一个服务器连接将一直绑定到一个给定的Odoo进程,直到其终止,这正是我们想要改变的地方。因此,为了在事务完成后释放服务器连接,我们使用 池模式 = 事务。
这工作得很好,除了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。
项目详情
哈希 为 odoo13_addon_bus_alt_connection-13.0.1.0.1-py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e6403726572d6ce1a79fe4447163086f475c1aa2f49b27f7a7a7d3c0c89fad36 |
|
MD5 | a765e0b3112ff9faa70bbe0c406da713 |
|
BLAKE2b-256 | 68b684c26606ad9cd5fa7b91bab0e0cdf0b39e3af2ea94184e7d8e262c8d05c5 |