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)