Despliegue de EzWeb empleando PgPool

Introducción

PgPool es un middleware que proporciona un wrapper de Postgres para la obtención de conexiones persistentes, balanceo de carga, ejecución concurrente de consultas, y otras capacidades avanzadas. En el caso de EzWeb, es especialmente interesante su uso ya que Djando no proporciona ningún mecanismo de persistencia en las conexiones con la base de datos. Esto provoca que cada petición emplee una nueva conexión que destruirá cuando haya terminado de servir el recurso. Puesto que Postgres crea un nuevo proceso para atender cada nueva petición, esto resulta gravemente ineficiente al producirse una sobrecarga por la continua creación y destrucción de procesos por parte del sistema operativo. Por estos motivos, el uso de PgPool resulta fundamental en despliegues con una gran cantidad de usuarios.

Esta página wiki documenta el proceso de instalación de un entorno basado PgPool en sistemas Ubuntu GNU/Linux

Instalación

PgPool está disponible como paquete Debian. Podemos instalarlo de la siguiente forma:

root@ezweb-test:~# apt-get install pgpool2
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  pgpool2
0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded.
Need to get 276kB of archives.
After unpacking 979kB of additional disk space will be used.
Get:1 http://old-releases.ubuntu.com gutsy/universe pgpool2 1.1.1-1 [276kB]
Fetched 276kB in 2s (130kB/s)
Selecting previously deselected package pgpool2.
(Reading database ... 26274 files and directories currently installed.)
Unpacking pgpool2 (from .../pgpool2_1.1.1-1_amd64.deb) ...
Setting up pgpool2 (1.1.1-1) ...
 * Starting pgpool-II pgpool
   ...done.

Processing triggers for libc6 ...
ldconfig deferred processing now taking place

Configuración

Los pasos de configuración son los siguientes:

  • Preparar la base de datos que empleará PgPool para almacenar su información de sistema
  • Configurar los backends que emplearemos

Preparación de la base de datos

PgPool precisa de una base de datos donde almacenar los datos de su lógica de manera persistente. Para ello, crearemos dicha base de datos:

  • Conectamos con la base de datos
    root@ezweb-test:~# psql -U postgres -d postgres
    
  • Creamos la base de datos correspondiente
    postgres=> create database pgpool;
    
  • Creamos el usuario que empleará PgPool
    postgres=> create user pgpool;
    postgres=> grant all privileges on pgpool to pgpool;
    
  • Conectamos con la nueva base de datos
    postgres=> \c pgpool
    
  • Creamos las entidades necesarias
    pgpool=> \i /usr/share/pgpool-II/system_db.sql
    

Configuración de los backends

Los backends han de ser configurados en /etc/pgpool.conf. Basta con localizar la sección donde se definen las propiedades backend_* y añadir las siguientes líneas:

backend_hostname0 = 'localhost'
backend_port0 = 5432
backend_weight0 = 1

Conexión con la base de datos

Conexión con el terminal de Postgres

Una vez aplicada la configuración, el demonio de PgPool estará escuchando en el puerto 5433. Para conectar con la base de datos empleando PgPool como middleware, bastará con:

root@ezweb-test:~# psql -p 5433 -U ezweb -d ezweb_new
Welcome to psql 8.1.10, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

ezweb_new=> 

El puerto en que trabaja PgPool puede configurarse mediante la propiedad port en /etc/pgpool.conf.

Conexión con Django

Para configurar EzWeb de manera que emplee PgTool en lugar de acceder directamente a Postgres, basta con establecer el puerto correspondiente en la configuración de Django. Cambiamos dicho valor en el fichero settings.py del espacio EzWeb.

DATABASE_PORT = '5433'             # Set to empty string for default. Not used with sqlite3.

Configuración de Postgres

Dependiendo de la configuración de postgres, puede ser necesario aumentar el nº máximo de conexiones. La configuración por defecto de pgpool es la siguiente:

num_init_children = 32
max_pool = 4

Lo que da un nº de conexiones de 128. Por tanto, es necesario verificar el nº de conexiones del fichero '/etc/postgresql/8.2/main/postgresql.conf':

max_connections = 200                   # (change requires restart)