Seleccionar página

Un cliente disponía de una arquitectura antigua confeccionada en el año 2003, la cual se basaba en Apache Tomcat, Jonas, el middleware C-JDBC replicando contra unas bases de datos PostgreSQL 8.

En el proyecto, se nos pedía mejorar la arquitectura y se planteó adaptar el proyecto como una aplicación montada sobre CentOS 6, JBoss EAP 6, dos bases de datos PostgreSQL 9 en modo maestro – esclavo anteponiendo el middleware PgPool (modo balanceo).

A la hora de obtener las métricas de la parte de la persistencia, optamos por ‘olfatear’ las consultas SQL que se estaban ejecutándose en una de las bases de datos antiguas durante 3600 segundos en intervalos de 5 segundos (el truco consiste en leer la tabla pg_stat_activity, la cual indica que se está ejecutando en el momento de lanzar esta consulta).

Para ello, creamos el fichero get_sentences_postgresql_wdb.py en Python :

#/usr/bin/env python
# -*- coding: utf-8 -*-

import psycopg2
import time
import datetime

DSN = "dbname='neodoo_dbname' host='neodoo_host' user='neodoo_user' password='neodoo_passwd'"

def leer_datos():

        count = 0

        while (count < 720):

                con = psycopg2.connect(DSN)
                cur = con.cursor()
                query = "select current_query from pg_stat_activity where datname='neodoo_dbname' and client_addr='10.20.8.11' and current_query <> '';"

                now = datetime.datetime.now()
                print ("Fecha de ejecución: %s"  % now )
                cur = con.cursor()
                cur.execute(query)
                resultado = cur.fetchall()
                for sentencia in resultado :
                        print sentencia[0]

                cur.close()
                con.close()
                time.sleep(5)
                count = count + 1

if __name__== "__main__":
   leer_datos();

… siendo client_addr la IP de la máquina desde dónde se lanzaba el script.

Lanzamos el script con la siguiente sentencia :

python get_sentences_postgresql_wdb.py >> get_sentences_postgresql_wdb.log &

El fichero de salida get_sentences_postgresql_wdb.log irá creciendo y aparecerán un contenido similar al siguiente :

Fecha de ejecución: 2013-12-16 11:49:10.200482
select ac.codigo_articulo,descripcion_articulo,ac.pvl,clase_articulo,pvf,caja_origen,lleva_descuento,precio_envase,pvp,marca_generico,descuento_efg1,codigo_laboratorio, iva,nombre_imagen,url_imagen,es_caja_origen,categoria,es_estupefaciente,tipo_oferta, descuento_efg1, descuento_ofermes1,umbral_ofermes1,descuento_ofermes2,umbral_ofermes2,descuento_ofermes3,umbral_ofermes3,descuento_ofermes4,umbral_ofermes4,descuento_ofermes5,umbral_ofermes5  from articulos_consulta  ac left join atributos_articulo_consulta ar on ac.codigo_articulo=ar.codigo_articulo  where  pvf > 0.01 and  es_estupefaciente = 'N' and  ac.codigo_articulo not in (select codigo_articulo from articulos_oferta_consulta where codigo_oferta in (select codigo_oferta from ofertas_consulta where fecha_desde < '2013-12-16' and fecha_hasta > '2013-12-16' and tipo_oferta = '')) and  descripcion_articulo ilike '%M%' escape ''  order by descripcion_articulo limit 16 offset 0
Fecha de ejecución: 2013-12-16 11:49:15.269790
Fecha de ejecución: 2013-12-16 11:49:20.280943
Fecha de ejecución: 2013-12-16 11:49:25.294591

Con la captura de las consultas SQL que se estaban ejecutando en real, las utilizamos para confeccionar una batería de pruebas con la herramienta JMeter y calcular los tiempos del sistema de persistencia (comparativas entre PostgreSQL 8 / 9 y el middleware PgPool ).

Gráfico JMeter y PostgreSQL 9

 Ejemplo de diagrama obtenido con JMeter en un test de carga contra la base de datos PostgreSQL. 

Como véis, es una forma sencilla de obtener métricas de las bases de datos y tremendamente efectiva para aportar informes de valor al cliente.