Pregunta

Estoy usando plone.app.blob para almacenar grandes objetos ZODB en un directorio de blobstorage. Esto reduce la presión de tamaño en Data.fs, pero no he podido encontrar ningún consejo sobre cómo hacer una copia de seguridad de estos datos.

Ya estoy haciendo una copia de seguridad de Data.fs apuntando una herramienta de copia de seguridad de red a un directorio de copias de seguridad de repozo. ¿Debo simplemente apuntar esa herramienta al directorio de blobstorage para hacer una copia de seguridad de mis blobs?

¿Qué sucede si la base de datos se vuelve a empaquetar o se agregan y eliminan blobs mientras se realiza la copia? ¿Hay archivos en el directorio de blobstorage que se deben copiar en un cierto orden?

¿Fue útil?

Solución

Copia de seguridad de " blobstorage " lo haré. No necesita un pedido especial ni nada más, es muy simple.

Todas las operaciones en Plone son completamente transaccionales, por lo que golpear la copia de seguridad en el medio de una transacción debería funcionar bien. Es por eso que puede hacer copias de seguridad en vivo del ZODB. Sin saber en qué sistema de archivos se encuentra, supongo que debería funcionar según lo previsto.

Otros consejos

Debería ser seguro hacer una copia de seguridad de repozo de Data.fs seguido de una rsync del directorio blobstorage, siempre y cuando la base de datos no se empaque mientras se realizan esas dos operaciones.

Esto se debe a que, al menos cuando se usan blobs con FileStorage, las modificaciones a un blob siempre dan como resultado la creación de un nuevo archivo denominado basado en la identificación del objeto y la identificación de la transacción. Por lo tanto, si los blobs nuevos o actualizados se escriben después de que se realiza una copia de seguridad de Data.fs, no debería ser un problema, ya que los archivos a los que hace referencia DataFs aún deberían estar disponibles. La eliminación de un blob no hace que el archivo se elimine hasta que la base de datos esté empaquetada, por lo que también debería estar bien.

Realizar una copia de seguridad en un orden diferente, o con el empaquetado durante la copia de seguridad, puede dar como resultado una copia de seguridad Data.fs que hace referencia a blobs que no están incluidos en la copia de seguridad.

Tengo un script que copia durante un mes los blobs usando enlaces duros (para que tenga un historial de los blobs como Data.fs):

backup.sh

#!/bin/sh

# per a fer un full : ./cron_nocturn.sh full

ZEO_FOLDER=/var/plone/ZEO

# Zeo port
ZEO_PORT = 8023

# Name of the DB
ZEO_DB = zodb1

BACKUP_FOLDER=/backup/plone

LOGBACKUP=/var/plone/ZEO/backup.log

BACKUPDIR=`date +%d`

echo "INICI BACKUP" >> $LOGBACKUP
echo `date` >> $LOGBACKUP

# Fem el packing

if [ "$1" = "full" ]; then
  $ZEO_FOLDER/bin/zeopack -S $ZEO_DB -p $ZEO_PORT -h 127.0.0.1


echo "   Comprovant folders"
#mirem si existeix el folder de backup
if ! [ -x $BACKUP_FOLDER/$ZEO_DB ]; then
   mkdir $BACKUP_FOLDER/$ZEO_DB
fi

#mirem si existeix el backup folder del dia
if ! [ -x $BACKUP_FOLDER/blobs/$BACKUPDIR/ ] ; then
   mkdir $BACKUP_FOLDER/blobs/$BACKUPDIR/
fi

echo "   Backup Data.fs"
# backup de Data.fs
if  [ "$1" = "full" ]; then
   echo "   Copiant Data.fs"
   $ZEO_FOLDER/bin/repozo -B -F -r $BACKUP_FOLDER/$ZEO_DB/ -f $ZEO_FOLDER/var/filestorage/Data_$ZEO_DB.fs
   echo "   Purgant backups antics"
   $ZEO_FOLDER/neteja.py -l $BACKUP_FOLDER/$ZEO_DB -k 2
else
   $ZEO_FOLDER/bin/repozo -B -r $BACKUP_FOLDER/$ZEO_DB/ -f $ZEO_FOLDER/var/filestorage/Data_$ZEO_DB.fs
fi

echo "   Copiant blobs"
# backup blobs
rm -rf $BACKUP_FOLDER/blobs/$BACKUPDIR
cd $BACKUP_FOLDER/current-blobs && find . -print | cpio -dplm $BACKUP_FOLDER/blobs/$BACKUPDIR
rsync --force --ignore-errors --delete --update -a $ZEO_FOLDER/var/blobs/ $BACKUP_FOLDER/current-blobs/


echo "FI BACKUP" >> $LOGBACKUP
echo `date` >> $LOGBACKUP

neteja.py

#!/usr/bin/python2.4

# neteja.py -l [directori_desti] -k [numero_fulls_a_mantenir]
# Script que neteja un directori amb backups i guarda nomes els ultims fulls que li especifiquis
# Es basa en la utilitzacio de collective.recipe.backup
# Author: Victor Fernandez de Alba <sneridagh@gmail.com>

import sys, getopt

sys.path[0:0] = [
  '/var/plone/genwebupcZEO/produccio/eggs/collective.recipe.backup-1.3-py2.4.egg',
  '/var/plone/genwebupcZEO/produccio/eggs/zc.buildout-1.4.2-py2.4.egg',
  '/var/plone/genwebupcZEO/produccio/eggs/zc.recipe.egg-1.2.2-py2.4.egg',
  '/var/plone/genwebupcZEO/produccio/eggs/setuptools-0.6c11-py2.4.egg',
  ]

import collective.recipe.backup.repozorunner

argv = sys.argv[1:]
try:
    opts, args = getopt.getopt(argv, "l:k:", ["location=", "keep="])
except getopt.GetoptError:
    print "neteja.py -l [directori_desti] -k [numero_fulls_a_mantenir]"
    sys.exit(2)

for opt, arg in opts:
    if opt in ("-l", "--location"):
        location = arg
    elif opt in ("-k", "--keep"):
        keep = arg

if len(opts)<2:
    print "neteja.py -l [directori_desti] -k [numero_fulls_a_mantenir]"
    sys.exit(2)

collective.recipe.backup.repozorunner.cleanup(location, keep)

Su estrategia de copia de seguridad para FileStorage está bien. Sin embargo, hacer una copia de seguridad de cualquier base de datos que almacene datos en múltiples archivos nunca es fácil ya que su copia tiene que suceder sin escrituras en los diversos archivos. Para FileStorage, una copia estúpida ciega está bien, ya que es solo un archivo. (Usar repozo es aún mejor).

En este caso (con BlobStorage combinado con FileStorage) tengo que señalar el consejo de copia de seguridad habitual:

  • desconecte db mientras realiza una copia del sistema de archivos
  • use herramientas de instantáneas como LVM para congelar el disco en un punto dado
  • hacer una exportación transaccional (no factible en la práctica)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top