🎯 Objetivo de este capítulo
Al terminar este capítulo:
PgBouncer estará configurado específicamente para Odoo
Evitarás errores típicos de producción
Tendrás una base estable para tuning avanzado
👉 No buscamos “máximo rendimiento” todavía.
Buscamos estabilidad + previsibilidad.
🧱 Principio clave: PgBouncer no se configura “genérico”
La mayoría de guías fallan aquí.
PgBouncer:
no se configura igual para todas las apps
depende del patrón de conexiones
depende de transacciones
Odoo tiene un patrón muy particular.
📁 Archivo principal
Todo lo que tocamos está en:
/etc/pgbouncer/pgbouncer.ini
🗂️ Sección [databases]
Ejemplo recomendado:
[databases] odoo = host=127.0.0.1 port=5432 dbname=odoo
Buenas prácticas
Usa un alias por base
No uses * = en producción
Mantén explícito el dbname
⚙️ Sección [pgbouncer] – Configuración base
🔌 Puertos y escucha
listen_addr = 0.0.0.0 listen_port = 6432
Usa 0.0.0.0 solo si Odoo está en otro host
Si todo está en el mismo servidor:
listen_addr = 127.0.0.1
🔐 Autenticación (recomendada)
auth_type = scram-sha-256 auth_file = /etc/pgbouncer/userlist.txt
👉 SCRAM es más seguro y estable que md5.
🔄 Pool mode (CRÍTICO)
pool_mode = transaction
Por qué transaction y no session
Odoo abre transacciones frecuentemente
session mantiene la conexión ocupada
transaction libera la conexión al terminar
❌ session = starvation asegurado
✅ transaction = reutilización eficiente
📊 Tamaño de pools (valores seguros iniciales)
max_client_conn = 500 default_pool_size = 20 reserve_pool_size = 5
Qué significa cada uno
max_client_conn
Máximo de conexiones desde Odoo a PgBouncer
default_pool_size
Conexiones reales a PostgreSQL por base
reserve_pool_size
Conexiones extra para picos breves
👉 Estos valores no son finales, son seguros para empezar.
⏱️ Timeouts importantes
server_idle_timeout = 60 query_timeout = 0
server_idle_timeout:
cierra conexiones ociosas
libera recursos
query_timeout = 0:
no romper queries largas de Odoo
Odoo maneja sus propios timeouts
🧠 Manejo de transacciones problemáticas
idle_transaction_timeout = 60
Evita:
transacciones colgadas
workers bloqueando pools
🧾 Logging (muy recomendado)
log_connections = yes log_disconnections = yes log_pooler_errors = yes
En producción:
ayuda a detectar saturación
permite debugging real
🧪 Configuración completa recomendada (base)
[databases] odoo = host=127.0.0.1 port=5432 dbname=odoo [pgbouncer] listen_addr = 127.0.0.1 listen_port = 6432 auth_type = scram-sha-256 auth_file = /etc/pgbouncer/userlist.txt pool_mode = transaction max_client_conn = 500 default_pool_size = 20 reserve_pool_size = 5 server_idle_timeout = 60 idle_transaction_timeout = 60 query_timeout = 0 log_connections = yes log_disconnections = yes log_pooler_errors = yes
🔁 Aplicar cambios
sudo systemctl reload pgbouncer
(O usa restart si cambiaste auth o puertos)
👀 Verificar que todo esté bien
Conéctate a PgBouncer:
psql -p 6432 -U odoo pgbouncer
Y ejecuta:
SHOW POOLS; SHOW STATS;
Qué debes ver:
pools activos
pocas conexiones reales
clientes entrando y saliendo
❌ Errores comunes en esta fase
pool_mode = session
pools demasiado pequeños
timeouts agresivos
no mirar métricas
copiar configs genéricas de internet
📌 Conclusión
Con esta configuración:
Odoo deja de saturar PostgreSQL
PgBouncer actúa como amortiguador
El sistema se vuelve estable
👉 Todavía no es óptimo, pero ya es correcto.
Siguiente capítulo ->