zfs. Резервное копирование снимками.

Раз уж заговорил о zfs — приведу пример простого, не самого изящного, но вполне работающего скрипта резервного копирования содержимого хранилки снапшотами.

Итак. Дано — хранилка на open indiana и ещё одна хранилка не суть на чём (хотя, конечно же на той же индиане :). На второй хранилке нарезан раздел 2ТБ и отдаётся на первую nfs. На первой, соответственно монтируется в /mnt/nfs. Далее — сам скрипт.

#!/bin/sh

### Define paths
DTE='/usr/gnu/bin'

### Define calendar vars
MON=$DTE/date --date 'last monday' +%Y-%m-%d
DATE=$DTE/date +%Y-%m-%d
DW=$DTE/date +%u

### Define LU names
LU=main/storage0
LUS="1 2 3"

### Monday ###
# Full Backup all LU
if [ $DW -eq 1 ]; then
# Previous and two weeks ago Mondays
PR_DATE7=$DTE/date --date='7 days ago' +%Y-%m-%d
TW_DATE7=$DTE/date --date='14 days ago' +%Y-%m-%d

# Tuesday
PR_DATE6=$DTE/date --date='6 days ago' +%Y-%m-%d
TW_DATE6=$DTE/date --date='13 days ago' +%Y-%m-%d

# Wednesday
PR_DATE5=$DTE/date --date='5 days ago' +%Y-%m-%d
TW_DATE5=$DTE/date --date='12 days ago' +%Y-%m-%d

# Thursday
PR_DATE4=$DTE/date --date='4 days ago' +%Y-%m-%d
TW_DATE4=$DTE/date --date='11 days ago' +%Y-%m-%d

# Friday
PR_DATE3=$DTE/date --date='3 days ago' +%Y-%m-%d
TW_DATE3=$DTE/date --date='10 days ago' +%Y-%m-%d

# Saturday
PR_DATE2=$DTE/date --date='2 days ago' +%Y-%m-%d
TW_DATE2=$DTE/date --date='9 days ago' +%Y-%m-%d

# Sunday
PR_DATE=$DTE/date --date='1 days ago' +%Y-%m-%d
TW_DATE=$DTE/date --date='8 days ago' +%Y-%m-%d

for i in $LUS
do
zfs snapshot $LU$i@$DATE
zfs send $LU$i@$DATE | gzip > /mnt/nfs/$LU$i.$DATE.gz
done

# Remove previous week snapshots and two weeks ago backups
for i in $LUS
do
zfs destroy $LU$i@$PR_DATE7
zfs destroy $LU$i@$PR_DATE6
zfs destroy $LU$i@$PR_DATE5
zfs destroy $LU$i@$PR_DATE4
zfs destroy $LU$i@$PR_DATE3
zfs destroy $LU$i@$PR_DATE2
zfs destroy $LU$i@$PR_DATE

rm /mnt/nfs/$LU$i.$TW_DATE7.gz
rm /mnt/nfs/$LU$i.$TW_DATE6.diff.gz
rm /mnt/nfs/$LU$i.$TW_DATE5.diff.gz
rm /mnt/nfs/$LU$i.$TW_DATE4.diff.gz
rm /mnt/nfs/$LU$i.$TW_DATE3.diff.gz
rm /mnt/nfs/$LU$i.$TW_DATE2.diff.gz
rm /mnt/nfs/$LU$i.$TW_DATE.diff.gz
done

exit
fi

for i in $LUS
do
zfs snapshot $LU$i@$DATE
zfs send -i $LU$i@$MON $LU$i@$DATE | gzip > /mnt/nfs/$LU$i.$DATE.diff.gz
done

Из нюансов. Встроенная в solaris (open indiana) команда date не понимает таких аргументов, поэтому скачиваем с gnu.org последнюю версию coreutils и собираем. Или скачиваем здесь отдельно скомпилёный для solaris x86 date и распаковываем.

Логика работы скрипта такова. Ежедневно делается снапшот файловой системы, точнее выбранных томов (переменная $LUS, строка 13). В понедельник делается полный снимок, в остальные дни недели — разностные. Всё это добро обрабатывается gzip и шлётся на nfs шару. Каждый понедельник удаляются локальные снимки за предыдущую неделю и духнедельной давности снапшоты на nfs шаре.

Теперь о переменных, используемых в скрипте:

стр. 4, $DTE — путь, куда мы распаковали (собрали из сырцов GNU date). Особенно важно в случае, если мы её просто копировали не замещая оригинальный файл.

стр.9, $DW — день недели, выделяется из вывода команды date и определяет поведение скрипта.

стр.12, $LU — общая часть имени для zfs томов. (например, у нас есть 3 тома : main/storage01, main/storage02 и main/storage03. общей частью будет являться main/storage0)

стр.13, $LUS — массив из изменяемых частей названий zfs томов (в предыдущем примере — «1 2 3». можно, естественно, указывать не все тома, а только те, которые нам нужно бэкапить)

Вот, вроде бы, и всё. ставим скрипт в cron на 00.01 ежедневно и наслаждаемся.

Помогла заметка - поделись с другом:
  1. Комментов пока нет

  1. Трэкбэков пока нет.

Оставьте эти два поля как есть:

 
Яндекс.Метрика