Domanda

Sto usando plone.app.blob per archiviare oggetti ZODB di grandi dimensioni in una directory di blobstorage. Ciò riduce la pressione sulle dimensioni di Data.fs ma non sono stato in grado di trovare alcun consiglio sul backup di questi dati.

Sto già eseguendo il backup di Data.fs puntando uno strumento di backup di rete in una directory di backup repozo. Devo semplicemente puntare quello strumento nella directory blobstorage per eseguire il backup dei miei BLOB?

Che cosa succede se il database viene riconfezionato o vengono aggiunti ed eliminati BLOB mentre è in corso la copia? Esistono file nella directory blobstorage che devono essere copiati in un determinato ordine?

È stato utile?

Soluzione

Backup " blobstorage " lo farà. Non è necessario un ordine speciale o altro, è molto semplice.

Tutte le operazioni in Plone sono completamente transazionali, quindi colpire il backup nel mezzo di una transazione dovrebbe funzionare bene. Ecco perché è possibile eseguire backup live di ZODB. Senza sapere su quale file system sei, immagino che dovrebbe funzionare come previsto.

Altri suggerimenti

Dovrebbe essere sicuro eseguire un backup repozo di Data.fs seguito da una risincronizzazione della directory di blobstorage, purché il database non sia impacchettato mentre si stanno verificando queste due operazioni.

Questo perché, almeno quando si utilizzano BLOB con FileStorage, le modifiche a un BLOB comportano sempre la creazione di un nuovo file denominato in base all'ID oggetto e all'ID transazione. Pertanto, se i BLOB nuovi o aggiornati vengono scritti dopo il backup di Data.fs, non dovrebbe essere un problema, poiché i file a cui fa riferimento Data.fs dovrebbero essere ancora presenti. L'eliminazione di un BLOB non comporta la rimozione del file fino a quando il database non viene compresso, quindi dovrebbe essere corretto.

L'esecuzione di un backup in un ordine diverso o con l'impacchettamento durante il backup può comportare un backup Data.fs che fa riferimento a BLOB che non sono inclusi nel backup.

Ho uno script che copia per un mese i BLOB usando collegamenti reali (quindi hai e storico dei BLOB come 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)

La tua strategia di backup per FileStorage va bene. Tuttavia, fare un backup di qualsiasi database che memorizza i dati in più file non è mai facile in quanto la tua copia deve avvenire senza scritture sui vari file. Per il FileStorage una stupida copia cieca va bene in quanto è solo un singolo file. (Usare repozo è ancora meglio.)

In questo caso (con BlobStorage combinato con FileStorage) devo indicare i normali consigli di backup:

  • porta offline il db mentre fa una copia del file system
  • usa strumenti di istantanea come LVM per bloccare il disco in un determinato punto
  • effettua un'esportazione transazionale (non realizzabile in pratica)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top