El Problema de Conexiones en PostgreSQL
PostgreSQL crea un proceso nuevo por cada conexión, lo que consume memoria (5-10 MB) y CPU. PgBouncer es un pooler de conexiones ligero que se sitúa entre su aplicación y la base de datos, aceptando miles de conexiones cliente pero manteniendo solo un pequeño y eficiente pool de conexiones reales con PostgreSQL.
Requisitos Previos
- Servidor Linux con PostgreSQL (12+).
- Acceso root o sudo.
Configuración Paso a Paso
1. Instalar PgBouncer
sudo apt update && sudo apt install pgbouncer
2. Configurar Autenticación (userlist.txt)
Extraiga las contraseñas hasheadas de PostgreSQL:
sudo -u postgres psql -Atq -c "SELECT concat('\"', usename, '\" \"', passwd, '\"') FROM pg_shadow;" > /tmp/userlist.txt
sudo mv /tmp/userlist.txt /etc/pgbouncer/userlist.txt
sudo chown postgres:postgres /etc/pgbouncer/userlist.txt
sudo chmod 600 /etc/pgbouncer/userlist.txt
3. Configurar pgbouncer.ini
Edite /etc/pgbouncer/pgbouncer.ini:
[databases]
midb = host=127.0.0.1 port=5432 dbname=midb
[pgbouncer]
listen_addr = *
listen_port = 6432
auth_type = md5 # O scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
default_pool_size = 20
max_client_conn = 2000
4. Iniciar PgBouncer
sudo systemctl restart pgbouncer
5. Conectar la Aplicación
Cambie el puerto en su cadena de conexión de 5432 a 6432.
Modos de Pooling
- Session: Una conexión de servidor por sesión de cliente. Seguro, pero poco eficiente.
- Transaction (Recomendado): Una conexión de servidor por transacción. Ideal para aplicaciones web.
- Statement: Una conexión por consulta. Las transacciones de múltiples consultas fallarán.
Resumen
- Use PgBouncer para prevenir el agotamiento de memoria en PostgreSQL.
- Establezca
pool_mode = transactionpara rendimiento óptimo en aplicaciones web. - Mantenga
max_connectionsen PostgreSQL bajo, y deje quemax_client_connde PgBouncer maneje los miles de clientes.