ZODB BLOBをバックアップする正しい方法は何ですか?
-
19-08-2019 - |
質問
plone.app.blobを使用して、blobstorageディレクトリに大きなZODBオブジェクトを格納しています。これにより、Data.fsに対するサイズのプレッシャーは軽減されますが、このデータのバックアップに関するアドバイスは見つかりませんでした。
Repozoバックアップのディレクトリでネットワークバックアップツールを指定することで、すでにData.fsをバックアップしています。ブロブをバックアップするために、そのツールをblobstorageディレクトリに向けるだけですか?
コピーの実行中にデータベースが再パックされたり、BLOBが追加および削除されたりするとどうなりますか? blobstorageディレクトリに、特定の順序でコピーする必要があるファイルがありますか?
解決
<!> quot; blobstorage <!> quot;のバックアップ。それを行います。特別な注文などは必要ありません。非常に簡単です。
Ploneのすべての操作は完全にトランザクションであるため、トランザクションの途中でバックアップをヒットしても問題なく動作するはずです。これが、ZODBのライブバックアップを実行できる理由です。使用しているファイルシステムがわからなくても、意図したとおりに動作するはずです。
他のヒント
Data.fsのrepozoバックアップを実行した後、blobstorageディレクトリのrsyncを実行しても、これらの2つの操作の実行中にデータベースがパックされない限り安全です。
これは、少なくともFileStorageでBLOBを使用する場合、BLOBを変更すると、常にオブジェクトIDとトランザクションIDに基づいて名前が付けられた新しいファイルが作成されるためです。したがって、Data.fsのバックアップ後に新しいまたは更新されたBLOBが書き込まれても、Data.fsによって参照されるファイルはまだ存在しているはずなので、問題にはなりません。 blobを削除しても、データベースが圧縮されるまでファイルは削除されません。したがって、これでも問題ありません。
異なる順序でバックアップを実行するか、バックアップ中にパッキングを行うと、バックアップに含まれないblobを参照するData.fsがバックアップされる可能性があります。
ハードリンクを使用してブロブを1か月間コピーするスクリプトがあります(したがって、ブロブを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)
FileStorageのバックアップ戦略は問題ありません。ただし、複数のファイルにデータを保存するデータベースのバックアップを作成することは、さまざまなファイルへの書き込みなしでコピーを行う必要があるため、決して簡単ではありません。 FileStorageの場合、盲目的な愚かなコピーは単一のファイルであるため問題ありません。 (repozoの使用はさらに良いです。)
この場合(FileStorageとBlobStorageを組み合わせた場合)、通常のバックアップのアドバイスを示す必要があります:
- ファイルシステムのコピーを作成中にデータベースをオフラインにします
- LVMなどのスナップショットツールを使用して、特定の時点でディスクをフリーズします
- トランザクションエクスポートを実行します(実際には実行できません)