Помощь с сценарием моментального / ежедневного / еженедельного резервного копирования снимков rsync - PullRequest
1 голос
/ 14 марта 2012

Я использовал модифицированную версию сценария моментального снимка rsync от Майка Рубеля , и у меня возникли некоторые проблемы с его настройкой, чтобы я делал то, что хотел. Его снимки делаются только раз в час; Я надеюсь на снимки каждый час, день, неделю и месяц через crontab.

Вот мой почасовой сценарий:

if [ -d $BUP/temp ] ; then
   rm -rf $BUP/temp ;
fi;

rsync -avzO  --delete --exclude-from=$CONFIG/rsync-excludes /home/jwhendy/ $DAT/jwhendy/ ;
rsync -avzO  --delete --exclude=vault* --link-dest=../vault.hourly.0 $DAT/ $BUP/temp ;

if [ -d $BUP/vault.hourly.2 ] ; then    
   rm -rf $BUP/vault.hourly.2 ;
fi;

if [ -d $BUP/vault.hourly.1 ] ; then
   mv $BUP/vault.hourly.1 $BUP/vault.hourly.2 ;
fi;

if [ -d $BUP/vault.hourly.0 ] ; then
   mv $BUP/vault.hourly.0 $BUP/vault.hourly.1 ;
fi;

mv $BUP/temp $BUP/vault.hourly.0 ;

Вот ежедневный сценарий (еженедельные / ежемесячные почти одинаковые):

if [ -d $BUP/vault.daily.2 ] ; then    
    rm -rf $BUP/vault.daily.2 ;
fi;

if [ -d $BUP/vault.daily.1 ] ; then
    mv $BUP/vault.daily.1 $BUP/vault.daily.2 ;
fi;

if [ -d $BUP/vault.daily.0 ] ; then
    mv $BUP/vault.daily.0 $BUP/vault.daily.1 ;
fi;

if [ -d $BUP/vault.hourly.2 ] ; then
    cp -al $BUP/vault.hourly.2 $BUP/vault.daily.0 ;
fi;

Почасовой скрипт отлично работает. Я борюсь с тем, чтобы переходить с часового на ежедневный (и на ежедневный, еженедельный и т. Д.).

В настоящее время скрипт будет работать следующим образом, скажем, если почасовой скрипт выполняется 6 раз в день, а ежедневный скрипт запускается после этого («hourly.n» сокращенно обозначается как «hr.n», а «b_m» обозначает индивидуальный снимок):

| hour 1     | hour 2     | hour 3     | hour 4     | hour 5     | end of day    |
|------------+------------+------------+------------+------------+---------------|
| hr.0 (b_0) | hr.0 (b_1) | hr.0 (b_2) | hr.0 (b_3) | hr.0 (b_4) | hr.0 (b_5)    |
|            | hr.1 (b_0) | hr.1 (b_1) | hr.1 (b_2) | hr.1 (b_3) | hr.1 (b_4)    |
|            |            | hr.2 (b_0) | hr.2 (b_1) | hr.2 (b_2) | hr.2 (b_3)    |
|            |            |            |            |            | daily.0 (b_3) |

Так как hourly.sh заменяет hourly.2, если он существует, мы видим, что daily.0 впервые создается с b_3, и я потерял b_0, b_1 и b_2. Я бы предпочел делать инкрементный дамп hourly.2 в daily.0 каждый час, прежде чем удалять его. Таким образом, в любой момент времени у меня будут hourly.0, 1 и 2, и daily.0 будет содержать последнюю версию hourly.2 до того, как она будет удалена.

Надеюсь, это имеет смысл.

Я пытался взять строку cp -al $BUP/hourly.2 $BUP/daily.0 ; и поместить ее в почасовой скрипт. С этим я столкнулся с тремя проблемами:

  • кажется, что это занимает намного больше времени, чем один скрипт rsync, хотя технически просто копирует некоторые жесткие ссылки
  • , поскольку это жесткие ссылки, в моем случае первая резервная копия будет иметь полный размер (~ 20 ГБ); последующие запуски должны создавать снимки размера обновленных файлов (что он делает). Я ожидаю, что самый большой снимок будет постепенно перемещаться дальше и дальше назад в дереве (в конце концов, в месяц.2). Эта линия cp -al, кажется, удерживает ее на отметке daily.0 и никогда не возвращается к daily.1 и т. Д. (Это может быть неправильным пониманием того, как работает du.
  • Я не могу понять, как не разорвать цепочку резервных копий, что заставляет создавать новый снимок (полные 20 ГБ), который необходимо воссоздать. Другими словами, hourly.2 продолжает сбрасывать в daily.0 ... но в конечном итоге mv $BUP/daily.0 $BUP/daily.1 сделает daily.0 более не существующей. Таким образом, он должен быть воссоздан с нуля при следующем запуске hourly.sh.

В любом случае, надеюсь, понятно, чего я пытаюсь достичь. Мне нужна помощь для перевода каждого сценария (ежечасно, ежедневно, еженедельно) в следующее «ведро» (ежедневно, еженедельно, ежемесячно) без необходимости разрывать цепочку жестких ссылок.

Я также не хотел бы терять значимые снимки по пути, как показано в таблице выше.

Большое спасибо за любые предложения.

1 Ответ

2 голосов
/ 17 марта 2012

ОК, я проверил жесткие ссылки, вот что происходит со мной:

➜  rsync -az0 /home/jan/tmp/Source /home/jan/tmp/Dir1
➜  rsync -az0 /home/jan/tmp/Source /home/jan/tmp/Dir2 --link-dest=/home/jan/tmp/Dir1
➜  du -hs /home/jan/tmp/Source
124M    /home/jan/tmp/Source
➜  du -hs /home/jan/tmp/Dir1
124M    /home/jan/tmp/Dir1
➜  du -hs /home/jan/tmp/Dir2
124M    /home/jan/tmp/Dir2

Вы можете видеть, что все жесткие ссылки на файлы действительно эквивалентны. Это означает, что сама по себе каждая из резервных копий является «полной» резервной копией, которая дает вам полный размер файла, если вы делаете «du» только для этого.

➜  du -hs /home/jan/tmp/Dir1 /home/jan/tmp/Dir2
124M    /home/jan/tmp/Dir1
0   /home/jan/tmp/Dir2

Однако, если вы сделаете «du» для всех из них (как в 6-й команде выше), он распознает жесткие ссылки и покажет вам «нулевой» размер для всех жестких ссылок, с которыми он встречался ранее. Однако это зависит только от порядка аргументов, а не от того, какая ссылка была «первой»:

➜  du -hs /home/jan/tmp/Dir2 /home/jan/tmp/Dir1
124M    /home/jan/tmp/Dir2
0   /home/jan/tmp/Dir1

К вашей актуальной проблеме:

Вместо того, чтобы делать cp -al $BUP/hourly.2 $BUP/daily.0 и затем ежечасно удалять.2, не могли бы вы просто сделать mv $BUP/hourly.2 $BUP/daily.0, что будет намного быстрее?

...