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 ежедневно и наслаждаемся.
Комментов пока нет