Compactar la ZODB de sitio Plone

Tamaño de base de datos

Sólo la naturaleza de la agregación de la ZODB hace que la base de datos crezca continuamente, incluso si sólo editar la información existente y no añade ningún nuevo contenido. Para asegurarse de que el disco duro de su servidor no se llene rápidamente, usted necesita compactar la ZODB automática y regularmente.

La ZODB almacena cada copia de todos los objetos modificados en una transacción. Esto puede causar que la base de datos crezca bastante grande. En realidad no hay ninguna reducción al tamaño de una base de datos grande aparte de tener un archivo grande de manejar. Tiene poca o ninguna influencia en el rendimiento del sitio. No hay límite para el tamaño de este archivo, sólo lo que el sistema de archivos puede manejar. Los tamaños aproximados a 10gb no son infrecuentes.

Como administrador del sistema tendrá que gestionar que un archivo para asegurarse de que cosas como las copias de seguridad o copias del sistema no se vuelvan difíciles de manejar como el archivo creciente.

Por esta razón se recomienda hacer una compactar (pack) de la base de datos normalmente. Esto elimina todas las copias antiguas en la base de datos. Si está ejecutando una copia de seguridad de forma regularmente (ver copias de seguridad), entonces usted debe tener todos los registros de cada cambio.

¿En que consta compactar la ZODB?

Los beneficios son los siguientes:

  • Compactando la ZODB remueve las versiones de objetos viejos, así que una vez que se hace, ya no se puede deshacer.
  • Puede haber un poco de ventaja en el rendimiento.
  • Hay beneficios en el tamaño de la base de datos con respecto al espacio de almacenamiento físico del disco duro.
  • Compactar la ZODB es similar a un VACUUM en PostgreSQL.

Compactar con tareas crontab

Las tareas programadas de compactar (pack) la base de datos se pueden configurar de forma predeterminada, eliminando de los datos históricos no versionados en el sistema. Si usted está usando la función de control de versiones de Plone (nuevo en Plone 3.x), a continuación, el compactar (pack) será sin eliminar el contenido versionado.

Para esto utilizaremos configuraciones para programar tareas con crontab para el compactación de la ZODB.

A continuación se describen dos ejemplos útiles:

Usando Zope standalone y buildout

Si tu instalación es una Zope standalone y estas usando zc.buildout debes crearte un script que cada cierto tiempo realice tareas de compactar la ZODB, a continuación un ejemplo de configuración:

# Pack once a month
[zodbpack]
recipe = collective.recipe.template
output = ${buildout:bin-directory}/zodbpack
mode = 600
input = inline:
    wget -O/dev/null -q --post-data='days:float=10' --user=admin --password=admin \
    http://localhost:8080/Control_Panel/Database/main/manage_pack

# Pack once a month
[packups]
recipe = z3c.recipe.usercrontab
times = 0 0 1 * *
command = ${buildout:bin-directory}/zodbpack

Truco

En el comando wget contiene dos parámetros --user y --password deben tener asignado el nombre del usuario y contraseña Administrador Zope de su instalación.

El parámetro --post-data define los días para el cual compactara la ZODB.

En el caso de que use puntos de montajes debe indicar la ruta en la dirección URL del comando wget.

Usando servidor ZEO y buildout

Si tu instalación es un ZEO Cluster y usando zc.buildout puede usar el script llamado zeopack que ofrece esta instalación para que cada cierto tiempo realice tareas de compactar la ZODB, a continuación un ejemplo de configuración:

Para instalaciones Plone 4.3 usando configuraciones buildout bajo Linux se encuentra el programa zeopack.py en el directorio:

  • eggs/ZODB3-3.10.5-py2.7-linux-i686.egg/ZEO/scripts/zeopack.py.

Nota

Esto puede variar entre versiones de Plone y Zope.

Truco

Un script zeopack sera generado para usted en el directorio bin del proyecto buildout, a menos que usted cambien eso con la opción zeopack-script-name, en este caso el script sera llamado como el nombre que usted especifique en este parámetro.

[backup]
recipe = collective.recipe.backup

# Backup daily
[backups]
recipe = z3c.recipe.usercrontab
times = 0 0 * * *
command = ${buildout:bin-directory}/backup

# Pack once a month
[packups]
recipe = z3c.recipe.usercrontab
times = 0 0 1 * *
command = ${buildout:bin-directory}/zeopack

Truco

Si le gustaría usar este script para compactar un punto de montaje diferente, usted necesitara especificar el parámetro -S nombre_punto_montaje. Usted puede especificar la opción -B para no usar el directorio por defecto blob.

Compactando sin crontab

Existe otra forma de realizar tareas de compactar la ZODB automáticamente sin usar tareas crontab.

Para esto agregue el producto Products.ClockServer en su sección eggs en su archivo buildout.cfg.

Además agregue la siguiente configuración en la sección instance en su archivo buildout.cfg como se muestra a continuación:

zope-conf-additional =
    <clock-server>
      method /pack_it_all
      period 86400
      user admin
      password SU-CONTRASEÑA
      host localhost
   </clock-server>

Ejecute de nuevo el buildout y luego inicie el servidor Zope, entonces diríjase al raíz de Zope desde la ZMI, del lado derecha elija de la lista de selección la opción Script (Python) y haga clic en el botón Add, como se ilustra a continuación:

Agregar "Script (Python)" desde la ZMI

Agregar “Script (Python)” desde la ZMI.

Entonces en el campo Id coloque pack_it_all, luego haga clic en el botón Add and Edit, como se ilustra a continuación:

Detalle del "Script (Python)" desde la ZMI

Detalle del “Script (Python)” desde la ZMI.

Seguidamente agregue el siguiente contenido al script:

dbs = context.Control_Panel.Database
names = dbs.getDatabaseNames()

for name in names:
  if name != 'temporary':
    dbs[name].manage_pack(days=3)
    print "packed database %s" % name

return printed

Para guardar esta modificación haga clic al botón Save Changes, para probar el funcionamiento del script puede hacer clic en la pestaña Test para verificar su funcionamiento, de igual forma con las configuraciones del producto Products.ClockServer descrita en la declarativa zope-conf-additional dentro de su sección instance se programa la tarea la cual compactara la ZODB cada tres (3) días.

Descarga código fuente

Para descargar el código fuente de este ejemplo ejecute el siguiente comando:

$ git clone https://github.com/Covantec/buildout.zodb.plone4.git
los comentarios son proporcionados por Disqus

Editar este documento

El código fuente de este archivo esta hospedado en GitHub. Todos pueden actualizar y corregir errores en este documento con unos clic - sin necesidad de descargar.

  1. Vaya hacia el articulo Compactar la ZODB de sitio Plone en GitHub.
  2. Presione el botón Fork. Este creara su propia copia personal de la documentación.
  3. Edite los archivos usando el editor de texto de GitHub desde su navegador Web
  4. Rellene en la caja de texto Commit message al final de la pagina indicando por que usted realizo estos cambios. Presione el botón Propose file change próximo a ese cuando haya finalizado.
  5. Luego diríjase a la página Send a pull request (no será necesario rellenar ningún texto adicional). Sólo tiene que pulsar el botón Send pull request.
  6. Sus cambios serán consultados por un revisor dentro de la pestaña Pull requests del proyecto en Github.

Para mas información básica acerca de como actualizar este manual y referencia a sintaxis Sphinx, por favor consulte la guía Escribiendo y actualizando el manual.