Question

J'utilise plone.app.blob pour stocker de gros objets ZODB dans un répertoire blobstorage. Cela réduit la pression de la taille sur Data.fs, mais je n'ai trouvé aucun conseil sur la sauvegarde de ces données.

Je sauvegarde déjà Data.fs en pointant un outil de sauvegarde réseau sur un répertoire de sauvegardes repozo. Dois-je simplement pointer cet outil sur le répertoire blobstorage pour sauvegarder mes blobs?

Que se passe-t-il si la base de données est en cours de reconditionnement ou si des blobs sont ajoutés et supprimés pendant la copie? Le répertoire blobstorage contient-il des fichiers qui doivent être copiés dans un certain ordre?

Était-ce utile?

La solution

Sauvegarde "blobstorage" le fera. Pas besoin d'une commande spéciale ou quoi que ce soit d'autre, c'est très simple.

Toutes les opérations dans Plone sont entièrement transactionnelles. Par conséquent, une sauvegarde au milieu d'une transaction devrait fonctionner correctement. C'est pourquoi vous pouvez effectuer des sauvegardes en direct du ZODB. Sans savoir sur quel système de fichiers vous vous trouvez, je suppose que cela devrait fonctionner comme prévu.

Autres conseils

Une sauvegarde repozo du fichier Data.fs, suivie d'un rsync du répertoire blobstorage, devrait être effectuée en toute sécurité, tant que la base de données n'est pas compactée pendant l'exécution de ces deux opérations.

En effet, du moins lorsque vous utilisez des objets blob avec FileStorage, les modifications apportées à un objet blob entraînent toujours la création d'un nouveau fichier nommé en fonction de l'ID d'objet et de l'ID de transaction. Ainsi, si des blobs nouveaux ou mis à jour sont écrits après la sauvegarde de Data.fs, cela ne devrait pas poser de problème, car les fichiers référencés par Data.fs devraient toujours être présents. La suppression d'un blob n'entraîne pas la suppression du fichier tant que la base de données n'est pas compressée. Cela devrait donc également convenir.

Effectuer une sauvegarde dans un ordre différent ou effectuer un empaquetage lors de la sauvegarde peut donner lieu à un fichier de sauvegarde Data.fs qui fait référence à des blobs qui ne sont pas inclus dans la sauvegarde.

J'ai un script qui copie pendant un mois les blobs en utilisant des liens physiques (vous avez donc un historique des blobs en tant que 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)

Votre stratégie de sauvegarde pour FileStorage est satisfaisante. Toutefois, il n'est jamais facile de sauvegarder une base de données contenant des données dans plusieurs fichiers, car votre copie doit avoir lieu sans aucune écriture dans les différents fichiers. Pour FileStorage, une copie aveugle et stupide convient, car il ne s'agit que d'un fichier. (Utiliser repozo, c'est encore mieux.)

Dans ce cas (avec BlobStorage combiné à FileStorage), je dois indiquer le conseil de sauvegarde habituel:

  • mettre la base de données hors connexion lors de la copie du système de fichiers
  • utilisez des outils de capture instantanée tels que LVM pour geler le disque à un moment donné
  • effectuer une exportation transactionnelle (non réalisable dans la pratique)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top