Текст:
Иногда приходится отрываться от привычного Enterprise в сторону малого бизнеса и засучив рукава пилить нечто на коленке. Но ничего - это тоже нужное.
Попытаемся по-быстренькому написать файловый бекап на Linux. Пардон, написать систему резервного копирования (СРК) на файловом уровне, с возможностью создания полных и дифференциальных копий.
Использовать будем известную утилиту RSYNC, она бесплатна и включена во все Linux-дистрибутивы.
Система будет состоять из двух скриптов: full_rsync и diff_rsync
Используются следующие переменные:
source_dir - исходный каталог, для которого необходимо создавать резервные копии
backup_dir - каталог в котором будут храниться резервные копии в виде .tar.gz
backup_full_dir - неархивированная копия source_dir, она понадобиться нам для получения дифференциальных копий
backup_diff_dir - собственно дифференциальная копия, разница между текущим состоянием source_dir и backup_full_dir
Имя копии состоит из признака FULL_ или DIFF, даты, времени создания и уникального GUID например:
FULL_20201004_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27 DIFF_20201005_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27
Для FULL_ каждый раз генерируется новый GUID, а для DIFF_ берется GUID соответствующей FULL_ копии. Таким образом, можно отследить цепочку FULL - DIFF.
Алгоритм работы full_rsync:
1. Скрипт удаляет каталоги по маске FULL_* найденные в backup_dir
2. Создает в backup_dir новый каталог по правилам именования -> backup_full_dir
3. Копирует с помощью RSYNC в backup_full_dir содержимое source_dir (с подкаталогами)
4. Создает FULL_~.tar.gz из содержимого backup_full_dir (каталог с полной копией при этом не удаляется)
Алгоритм работы diff_rsync:
1. Скрипт ищет в backup_dir каталоги по маске FULL_* если таковые имеются - выбирает последний в переменную backup_full_dir, если ни одного не найдено завершает работу.
2. Создает в backup_dir новый DIFF_ каталог поправилам именования -> backup_diff_dir
3. Копирует RSYNC в backup_diff_dir разницу между source_dir и backup_full_dir
4. Создает DIFF_~.tar.gz из содержимого backup_diff_dir (каталог с дифференциальной копии после этого удаляется)
Объединим работу обоих скриптов через планировщик. Создадим, например, задание №1 стартующее каждое воскресенье скрипт full_rsync. И задание №2 стартующее diff_rsync каждые ПН, ВТ, СР, ЧТ, ПТ, СБ. В результате получим создание полной копии в ВС и создание дифференциальных копий в остальные дни. Заметим, что каждая следующая дифференциальная копия представляет собой разницу между текущим состоянием source_dir и полной копией (а не с последней дифференциальной).
После отработки full_rsync в первое воскресенье у нас будет полная копия в виде каталога и она же в виде .tar.gz:
FULL_20201001_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27 FULL_20201004_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27.tar.gz
После отработки diff_rsync в ПН, ВТ, СР, ЧТ, ПТ, СБ создадутся дифференциальные копии на основе FULL_20201001_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27:
DIFF_20201005_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27.tar.gz DIFF_20201006_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27.tar.gz DIFF_20201007_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27.tar.gz DIFF_20201008_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27.tar.gz DIFF_20201009_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27.tar.gz DIFF_20201010_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27.tar.gz
Запуск full_rsync в следующее ВС удалит каталог FULL_20201001_030001_b858e5d9-9c55-4e69-aa64-876b6d1abd27 и создаст новый FULL_ - начнется новая цепочка копий.
Эта самодельная СРК может стать достаточно гибким инструментом. Например, можно выделить единый сервер резервного копирования и подключаться с него RSYNC к удаленным машинам, создавая для каждой отдельный каталог. Можно написать несложный скрипт по удалению устаревших копий.
P.S. Не забудьте поменять переменные source_dir и backup_dir в разделе #INIT обоих скриптов )
Добавить комментарий.