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

  1. Session: Una conexión de servidor por sesión de cliente. Seguro, pero poco eficiente.
  2. Transaction (Recomendado): Una conexión de servidor por transacción. Ideal para aplicaciones web.
  3. 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 = transaction para rendimiento óptimo en aplicaciones web.
  • Mantenga max_connections en PostgreSQL bajo, y deje que max_client_conn de PgBouncer maneje los miles de clientes.

Artículos Relacionados