PostgreSQL: ¿la base de datos empezó a consumir exageradamente espacio de disco? (actualizado)

En un proyecto gubernamental, donde me desempeño como consultor, estamos trabajando desde hace unos pocos años con el manejador de bases de datos PostgreSQL.

Luego de tener la sorpresa de que nuestro servidor de base de datos (dedicado solo a esa tarea) dejara de funcionar por falta de espacio en disco, tuvimos que iniciar una proceso de auditoría para determinar si las causas eran por uso normal o por alguna situación anormal en su funcionamiento.

Tenía un vago recuerdo que hace unos años atrás la base de datos no superaba los 500 Megas para almacenar los datos en disco. En GNU/Linux los datos se encuentran ubicados en el directorio /var/lib/pgsql/data y con solo hacer un du -h --max-depth=1 sobre el directorio nos mostrará el "uso de disco".

Lo malo de estos casos es que este tipo de situaciones se pueden prever si se cuenta con un Administrador de Bases de Datos (DBA), pero cuando estás en una situación que careces de él, debes repartir tu trabajo diario de desarrollador por el de "DBA Part Time" (con todos los riesgos que conlleva).

Mi sorpresa fue mayúscula al enterarme que a principios de febrero la base estaba consumiendo en el entorno de los 6 Gigas de disco. Luego de seguir su evolución por varios días pude concluir que el crecimiento rondaba los 100 Megas diarios, lo que parecía exagerado teniendo en cuenta la cantidad y el tipo de información que se ingresa por día: generalmente datos "planos", no existiendo ingreso de información "binaria", es decir, documentos, imágenes, etc.

LVM: Logical Volume Management

Primer medida de contención que tuve que tomar fue la de separar en distintas particiones determinadas zonas críticas de consumo de espacio de disco: zona de datos, zona de logs y zona de respaldos (si, es algo que se debe de planear antes, pero así ocurrió por la falta de tiempo y el apuro de cumplir con otras tareas).

Lo que mejor se me ocurrió fue implementar el famoso LVM: Logical Volume Management (Administración de Volúmenes Lógicos).


Esta utilidad no es novedad del ambiente GNU/Linux, en sí muchos sistemas Unix de nivel empresarial ya manejan desde hace mucho tiempo antes este concepto: la idea es contar con una partición física y crear dentro varios volúmenes lógicos, a los cuales les podemos asignar dinámicamente su tamaño.

Lo bueno de esta técnica es que nos permite administrar el espacio a nuestro gusto como si fuera una partición común, pero adaptable según nuestra necesidad, sin tener que estar obligados a crear nuevas particiones, darles formato, mover los datos a la nueva partición, tener el servidor fuera de funcionamiento por un tiempo, etc.



Obviamente, siempre y cuando tengamos un buen margen de espacio libre para poder asignar y desasignar de nuestros volúmenes lógicos.

El mantenimiento de la base de datos

Esta base de datos necesita un determinado "mantenimiento" (en sí, todas lo necesitan) que es provisto en general por una utilidad propia de este motor que se llama vacuum.

En nuestro caso disponemos de una tarea planificada que corre a primera hora de la mañana y a última hora de la noche. Esta aplicación efectuaría el mantenimiento estándar de la base de datos, que comprende (según el siguiente FAQ):

"Para determinar si debe ser usado un indice, PostgreSQL debe tener estadísticas acerca de la tabla. Estas estadísticas son obtenidas usando el comando VACUUM ANALYZE, o simplemente ANALYZE. Utilizando las estadísticas, el optimizador sabe cuantos registros hay en la tabla y de esta manera puede determinar mejor si los índices deben ser usados. Las estadísticas también son valiosas en el momento de determinar el orden de unión o el método de unión óptimos. La obtención de estadísticas debe ser realizada periódicamente conforme los contenidos de las tablas cambien."

¿Qué significa esto? Que debemos programar que corra este utilitario regularmente para hacer este mantenimiento en las horas que se supone no afecten el desempeño de la base de datos.

En nuestro caso usamos un pequeño scripts que tiene la siguiente sintaxis:

time su - postgres -c "vacuum --all --verbose --analyze"

Pero a pesar de todo, este "mantenimiento" se viene haciendo diariamente desde que tenemos la base de datos en producción... entonces, porqué sigue creciendo exponencialmente?

Cuando todo falla, hay que leer los manuales

La base de datos siguió aumentando de tamaño con los días, pero ahora a 200 megas por día. En los últimos días la base de datos había crecido de 6 Gigas a 9 Gigas, y que gracias al LVM se pudo contener al reasignar espacio libre de otras particiones.

Luego de releer nuevamente todos los manuales de las aplicaciones involucradas, el siguiente apartado vuelve a tener sentido para mi:
--full

"Selects "full" vacuum, which may reclaim more space, but takes much longer and exclusively locks the table."
Por los comentarios que estuve leyendo en grupos de discusión, muchos administradores aconsejaban este procedimiento cuando hay mucho ingreso y borrado de información, o cuando se crean o borran abruptamente tablas o bases enteras. El tema era que desde que estamos usando Postgres en producción, nunca usamos la opción "full", solo la alternativa "estándar" (y así lo recomiendan los manuales). La opción vacuum que estábamos usando hace un "bloqueo" a nivel de tuplas para correr el proceso de mantenimiento, y la diferencia con la versión "full" es que el proceso es mucho más profundo y el bloqueo es a nivel de tablas, no siendo posible correrlo en horarios de trabajo de la base de datos.

Actualmente a los scripts de mantenimiento le agregamos el "--full", y la situación cambió radicalmente.

Estos se ejecutan todos los días, 7:30am y 21:30 pm, unas horas antes del uso intensivo de la base de datos. La idea de la primer hora es que la base de datos se encuentre pronta justo antes de la hora crítica de trabajo, y la hora nocturna para adelantar el trabajo de la primer hora (la degradación de la base es acumulativa, por decirlo de alguna manera).

Comentario al margen: de todas formas no sería tan necesario hacer este proceso todos los días, se podría hacer una vez por semana o por mes, según evolucione el uso de la base y el consumo de espacio.

Resultado Final

Bueno, la primera vez que corrió demoro 1 hora y media, y cuando me enteré del resultado final casi me da un infarto: ¡de 9.2 Gigas pasamos a 700 y poco megas! ;-)

Mi primera impresión fue: "¡listo, lo que me faltaba, acabo de destruir la base de datos!" ;-), aunque el comentario proviene de alguien que es normalmente histérico con su trabajo, pues los respaldos estaban al día, y antes de hacer todos estos cambios se hicieron más respaldos adicionales, previendo tener que rearmar la base desde el respaldo (de todas formas, el cambio fue demasiado impactante ;-).

Luego de verificar que los datos eran coherentes, que la base funcionaba, que los logs no reportaban errores, etc, la última evaluación terminó de serenarme: los respaldos posteriores a esta "depuración" tenían el mismo tamaño que los respaldos anteriores. Esto significa que si tomamos en cuenta que el respaldo a través de un dump concluye con un archivo de texto con todas las sentencias sql para rearmar la estructura de las bases existentes, tablas y datos, el hecho que ambos respaldos tuvieran el mismo tamaño garantizaba que los datos eran los mismos (o por lo menos, que era la misma cantidad de información) y que no se habían perdido datos.

Conclusión

Primero, antes de hacer todo esto, _siempre_ debemos estar al día con los respaldos, tenerlos probados que funcionan (auditorías regulares) y que recuperan toda la base de datos sin faltar nada (es el 50% del respaldo tener verificado que funciona). Segundo, no olvidar del mantenimiento de Postgres, y tercero, siempre, "cuando todo falle, lee el manual", aunque sepas que alguna vez lo leíste de arriba a abajo ;-)

Ejemplo de configuración de un mantenimiento regular

En el crontab se podría agendar para que lo haga en horas que no se esté usando la base de datos:

30 7 * * 1-5 /var/respaldos/scripts/mantenimiento_postgresql.sh
30 21
* * 1-5 /var/respaldos/scripts/mantenimiento_postgresql.sh
Y el scripts "mantenimiento_postgresql.sh" podría contener:

#!/bin/bash

ECHO=`which echo`
TIME=`which time`
SU=`which su`
VACUUM=`which vacuumdb`

$ECHO "Mantenimiento Base de Datos"
$TIME $SU - postgres -c "$VACUUM --all --full --verbose --analyze"

PD: no, no, y no, no me gusta el trabajo de "DBA Part Time" ;-)

Documentación

PostgreSQL
LVM
Actualizaciones
  • 7/2/2007 - Scripts de respaldos y configuración del crontab.

Gmail Drive: "mi respaldo alternativo"

La verdad que esta utilidad, aunque no es oficial (no la hizo Google), y por parte de los autores hay duda de si en algún momento puedan impedir su uso (porque no respeta el contrato de uso del servicio Gmail), la encuentro verdaderamente útil.

Hace no mucho tiempo que adquirí un pendrive de 1 Giga (cada vez que lo digo, me emociono de tener tanta capacidad digital en tan pocos átomos ;-), pero el destino me obsequió que los puertos usb de mi equipo de trabajo no funcionen correctamente, corrompiendo la información que transfiero a él (no me queda otra opción que acceder desde otra máquina).

Historia & Concepto

Este proyecto se inició (no podía ser de otra forma) desde la plataforma GNU/Linux, creando una unidad virtual que permitiera usar la cuenta de Gmail como si fuera un dispositivo local. Nos permite copiar, mover, borrar, etc, los archivos dentro de esa unidad, como si fuera una unidad local. La idea es que existe una "capa de software" que se encarga de "simular" las operaciones tradicionales y traducirlas en operaciones compatibles con una cuenta de correo web con mucho espacio disponible.

La gran ventaja de esta utilidad es que nos permite usar una cuenta Gmail para hacer respaldos de forma sencilla y como si tuviéramos un "pendrive local" (permítanme la licencia poética ;-).

Ejemplo práctico: estás en una empresa que filtran exageradamente el tráfico de Internet, lo cual te impide bajar algunos archivos de importancia (si, según tu criterio personal, no el del administrador ;-). Lo malo, es que el tamaño excede el de un simple diskette, y no cuentas con un pendrive como para transportarlo desde un equipo que no tenga esa restricción (que perfectamente puede ser tu propio equipo hogareño con una conexión a Internet privilegiada). Te conectas con tu unidad virtual, copias el archivo, te desconectas, visitas tu equipo "restringido", te conectas a tu unidad virtual, bajas el archivo.

Nota: mis respetos al administrador de la seguridad de la red ;-) El concepto de "seguridad informática" supera el solo hecho de restringir determinadas extensiones de archivos desde Internet.

Muchos podrán decir: "eso ya lo hago hoy día, me envío correos con documentos adjuntos", pero esta utilidad nos simplifica y nos da más flexibilidad en el proceso de respaldo. Si borramos un archivo, este se elimina de la cuenta de Gmail, podremos crear estructuras de directorios, ordenar jerárquicamente, etc, como si fuera un "sistema de archivos" completo ("filesystems").

El proyecto original se llama Gmail Filesystem y corre en GNU/Linux. Luego, usuarios inquietos y envidiosos ;-) decidieron hacer una utilidad similar para Windows que se llamó GMail Drive shell extension.

Nota: como no pude hacer una instalación "sencilla" del proyecto original en su sistema original, opté por comentar el proyecto "hermano", que sí se instaló sencillamente y sin mayores problemas (prometo armar un artículo que trate el tema de instalarlo en GNU/Linux).

Al instalar este pequeño cliente obtendremos un disco virtual que aparecerá en nuestro sistema Windows con el nombre de GMail Drive.

¿Cómo funciona?

Si presionamos sobre él, nos solicitará una cuenta de Gmail y nuestra clave. Si logramos conectarnos con éxito (y nuestra conexión a Internet es minimamente decente) ya podremos utilizarlo.

La operación es similar a lo que ya estamos acostumbrados a hacer en el explorador de Windows, nos posicionamos en cualquier archivo de nuestro disco, botón derecho -> copiar, luego nos posicionamos en el "disco virtual" y le damos botón derecho -> pegar.

Tips

El primer error de novato (el que yo hice al principio) es copiar todo deliberadamente en la unidad, sin ningún tipo de orden. Si nos posicionamos sobre el espacio donde están nuestros archivos, al presionar el botón derecho, nuestro menú contextual nos mostrará la opción "folder", lo que nos permite crear las carpetas dentro de nuestra unidad virtual.

Podemos seguir usando la cuenta, aunque yo recomiendo crear una nueva para uso exclusivo de este sistema (un simple tema de orden). La gran ventaja de este sistema es que si ingresamos a Gmail como si fuéramos a leer nuestro correo (que es lo que estamos haciendo, al final de cuentas ;-) veremos los correos que representan los archivos copiados a nuestro disco virtual como un "correo con un archivo adjunto". Lo bueno de esto es que también podemos acceder a nuestros archivos y bajarlos sin tener que estar en un sistema con el GMail Drive instalado.

Bugs

Si, ya encontré uno. O por lo menos, se parece. Si intentamos copiar un archivo con "nombre largo", nos dará un mensaje de error. Aparentemente existe una limitante o simplemente un error cuando el nombre es *muy* largo (largos normales, nada disparatado). Sí se pueden superar los mágicos 8 caracteres ;-).

En la captura de pantalla pueden ver algunos archivos con nombre largos que subí. Todavía tengo que determinar (o encontrar en la documentación) cual es el verdadero límite y como se origina (porque supuestamente no existe ese límite en la cuenta de Gmail).

Por último, no olvidar que el tamaño máximo de los archivos a subir a nuestra unidad virtual no puede superar los 10 Megas, pues es el límite por correo que soporta Gmail. De todas formas, esto no es impedimento para marcar varios archivos de 10 megas cada uno, copiarlos y pegarlos en la unidad (los sube uno a uno, de a 10 Megas).

Pedido: no tuve tiempo de investigar, pero si alguien conoce o recomienda un procedimiento "cómodo" y "simple" desde GNU/Linux para armar un respaldo partiendo de uno o varios archivos grandes y armar varios paquetes comprimidos de 10 Megas (ya saben hacia donde voy ;-), que me lo cuente ;-)

Hasta ahora no sé si se puede hacer con el TAR respaldos multivolumen acotándolos a 10 Megas por parte ;-)

¡Saludos!

"Cómo Ser Un Programador: Un Resumen Corto, Comprensivo y Personal"

En muchos sitios recomiendan la lectura de este ensayo, y debo ser sincero, todavía no terminé de leerlo como para poder dar una opinión formada del mismo.

Lo que sí estoy seguro, es que de "corto" no tiene nada ;-)

Les dejo una breve introducción y el enlace a la traducción al castellano (también está la versión original en inglés, pero si la traducción es buena, fomentemos nuestro idioma ;-).

"Ser un buen programador es difícil y noble. La parte más difícil de hacer real una visión colectiva de un proyecto de software es lidiar con los compañeros de trabajo y con los clientes de uno. Escribir programas de computadora es importante y requiere gran inteligencia y habilidad. Pero realmente es un juego de niños comparado con todo lo demás que un buen programador debe hacer para lograr que un sistema de software tenga éxito tanto para el cliente como para la miríada de colegas por quienes se es parcialmente responsable. En este ensayo intento resumir tan concisamente como sea posible esas cosas que desearía que alguien me hubiese explicado a mí cuando tenía veintiuno.

Esto es muy subjetivo y, por lo tanto, este ensayo está condenado a ser personal y algo testarudo. Me confino a mí mismo a los problemas que un programador muy probablemente tiene que enfrentar en su trabajo. Muchos de esos problemas y sus soluciones son tan generales a la condición humana que probablemente pareceré predicativo. A pesar de ello tengo fe de que este ensayo será útil."

Firefox: una extensión para manejar múltiples "pestañas" (tags)

Una de las características del navegador Firefox son sus famosas "pestañas" (tags) que nos permiten en una única ventana poder tener varias "pestañas" con sitios distintos cada una.

Introducción: ¿para qué sirven las pestañas?

Un uso práctico: si estamos en un sitio que tiene muchos enlaces a otras páginas (con contendidos que te interesan leer también), mientras vamos leyendo una página podemos ir presionando con el botón central del mouse sobre los enlaces y estos se irán abriendo en pestañas nuevas. Cuando terminamos de leer la primer página, tendremos ya cargadas en las siguientes pestañas las nuevas páginas.

Pestañas
Sirve para ahorrar tiempo de espera, o para no olvidarnos que queremos leer también esos enlaces.

Técnicas para mejorar el uso de las pestañas

Para fanáticos de la lectura y la navegación compulsiva (con mucho de "infoxicación") podremos llegar a tener en nuestro navegador una cantidad "exagerada" de pestañas, dificultando su manejo. Por ejemplo, si tenemos pocas pestañas es fácil encontrar lo que buscamos al leer el texto que resume el título de la página (generalmente el espacio no es suficiente). El problema empeora cuando tenemos 15 o más pestañas y no da el espacio para disponer de un texto con un largo suficiente, lo cual hace que ya no sepamos a qué se refiere.

Ejemplo de pestañas sin espacio para visualizar su título
Una solución es ir leyendo la primer pestaña a nuestra izquierda, e ir cerrando luego de leida (forma rápida: [Control]+[w]), lo que libera espacio para visualizar las demás descripciones de las pestañas.

Pero si estamos saltando de una pestaña a otra, sin orden, y sin poder cerrar las ya leidas (no queremos perderlas), la situación se complica aún más.

La extensión "Reveal"

Bueno, una solución es la siguiente "extensión" (una utilidad para extender la funcionalidad de nuestro navegador Firefox): Reveal

Esta extensión nos ofrece, presionando [F2], visualizar todas las pestañas abiertas como pequeñas capturas de pantalla (facilitando su reconocimiento), permitiendo seleccionar a cual queremos ir con un simple "click".

Es mucho más intuitivo ver una vista miniatura de la página que queremos seleccionar (nos damos cuenta por los colores, la estructura, las imágenes, o directamente con ver el texto del título completo) que ver el título en una pestaña en donde solo se perciben unas pocas letras por la falta de espacio.

¡Reveal en acción!
Otra de sus características es contar con un buscador, lo cual facilita aún más la selección de una pestaña particular: si colocamos "google" nos traerá todas las pestañas que tengan el texto "google" en su título (varias pestañas con consultas en google, una con nuestro gmail, etc). Y existen otros criterios de búsqueda: url, página, etc.


Muy recomendable, y la animación de las mini-ventanas apareciendo en nuestro navegador, muy disfrutable ;-)

Actualización(04/02/2005): luego de probarlo unas horas, les cuento dos detalles: cuando tienes muchas ventanas y la pantalla no permite mostrar todas las capturas de las pestañas, debes usar las teclas [Re Pág] y [Av Pág] (retroceder y avanzar página, en inglés "Page Up" y "Page Down") para "paginar" o "avanzar por páginas" y visualizar el restante grupo de páginas.

Pero el verdadero "tips" es que puedes usar el menú contextual sobre la captura de la pestaña como si estuvieras en la pestaña, lo que significa que puedes hacer: botón derecho sobre la imagen de la ventana, opción "cerrar", e ir cerrando las pestañas que quieras.


Si lo pruebas en combinación al buscador, es realmente rápido manejar múltiples pestañas.

(ando como "perro con dos colas" con esta nueva extensión ;-)

Si lo dijo Einstein ...


"Los grandes espíritus siempre han encontrado la violenta oposición de las mentes mediocres. Estos últimos no pueden entender que un hombre no se someta irreflexivamente a los prejuicios hereditarios sino que emplee honestamente y con coraje su inteligencia."

"La mente intuitiva es un regalo sagrado y la mente racional es un fiel sirviente. Hemos creado una sociedad que rinde honores al sirviente y ha olvidado al regalo. "

"No es que sea muy inteligente, es solo que llevo mucho tiempo entre problemas"

"Tengo lo bastante de artista como para dibujar libremente con mi imaginación. La imaginación es más importante que el conocimiento. El conocimiento es limitado, la imaginación da la vuelta al mundo"

"Lo más importante es no dejar de interrogarse. La curiosidad tiene su propia razón de existir. Uno no puede evitar asombrarse cuando contempla los misterios de la eternidad, de la vida, de la maravillosa estructura de la realidad. Es suficiente si uno trata simplemente de comprender un poco de este misterio cada día. No hay que perder jamás la sagrada curiosidad"

"Leer, después de cierta edad, desvía demasiado a la mente de su búsqueda creativa. Cualquier hombre que lee mucho y emplea poco su propio cerebro cae en hábitos perezosos de pensamiento"

"No sé cómo será la III Guerra Mundial, pero sí la IV... con piedras y palos"

"El sentido común es esa colección de prejuicios que se adquieren cuando cumples 18"

"Todo aquel que nunca cometió un error, jamás ha intentado nada nuevo"

"Si buscas resultados distintos, no hagas siempre lo mismo"

"Si A igual a éxito, entonces la fórmula es: A=X+Y+Z, donde X es trabajo, Y es juego y Z es mantener la boca cerrada"

"El telégrafo sin hilos no es difícil de entender. El telégrafo ordinario es como un gato muy largo. Pones la cola en Nueva York y el gato maúlla en Los Ángeles. El telégrafo sin hilos es lo mismo pero sin el gato"

"¡Triste época la nuestra! Es más fácil desintegrar un átomo que un prejuicio."

"Solo hay dos cosas infinitas: el universo y la estupidez humana, y no estoy muy seguro de lo primero"

Fuente: Astroseti

Entradas populares