rsync. Проблема зеркалирования данных одного каталога с нескольких серверов

При создании бэкапов при помощи программы rsync выполняется зеркалирование некоторого каталога. При этом на сервере-приемнике удаляются файлы и каталоги отсутствующие на сервере-источнике.

Если выполняются бэкапы нескольких серверов и данные сливаются в один каталог, например с нескольких рабочих серверов бэкапятся каталоги /var/servers/ и на бэкап-сервере они тоже складываются в каталог /var/servers/, то на бэкап-сервере в результате окажутся только данные с сервера, который зеркалировался последним. Причина такого неожиданного результата проста – удаление устаревших файлов и каталогов.

Идет зеркалирование с первого сервера и с него скачиваются все данные. Потом запускается бэкап второго сервера и процесс видит что в каталоге лежат какие-то данные, которых нет на том сервере с которого он должен сделать бэкап. Значит устарели! И удаляет! Затем выполняет зеркалирование второго сервера. И переходит к третьему. В результате остаются данные только с последнего сервера.

Решить проблему можно при помощи такого скрипта:

#!/usr/local/bin/bash

repo=rsync://backup@server1.net/servers/

cd /var

# чтобы в ручном режиме с отладкой, а из крона без :)
if [[ -z "$1" ]]; then
    VV=vv;
fi;

list=`/usr/local/bin/rsync --list-only $repo | awk '{ if (($1 ~ /^d/) && ($5 !~ /^\./)
) { $1=$2=$3=$4=""; print substr($0,5);} }'`

for dir in $list
do
    /usr/local/bin/rsync -a$VV --delete $repo$dir servers
done

Скрипт сначала запрашивает все подкаталоги содержащиеся в репозитории. А затем запускает процедуру зеркалирования для каждого из подкаталогов. В результате данные обновляются внутри подкаталогов, не затрагивая данные других серверов.

Недостаток этого способа в том, что не происходит зеркалирование файлов расположенных в самом каталоге /var/servers/, только подкаталоги.


Комментарии

Оставить комментарий

Ответ на rsync. Проблема зеркалирования данных одного каталога с нескольких серверов