Pull to refresh

А ты сделал бэкап?

Reading time4 min
Views16K
Доброго времени суток %habrauser%!

Как известно backup — must be! Но просто сделать архив данных — это еще не значит грамотный бэкап. Когда у наших клиентов начали появляться сервера на базе Calculate directory server встал вопрос о выборе средств для создания резервных копий данных. Поиск готовых решений ничего толкового не дал, поэтому пришлось писать самим.

Для начала скажу что нам прежде всего нужно от программы:
  1. Инкреметальность архивов
  2. Уверенность в наличии архивов
  3. Гибкость настройки
  4. Отчет о работе

К п.1 у нас особые требования. Не все архиваторы умеют делать инкременты от уже инкрементального архива, а именно это нам и необходимо.

Программа написана на баше. Сам текст скрипта я здесь приводить не буду ибо он достаточно большой. Лучше прокомментирую дефолтный конфиг, так, по-моему, луше будет видно возможности программы.

Файл конфигурации содержит в себе блоки параметров: один обязательный «main» и дополнительные. Обязательный блок имеет строго определенное название «main» и описывает основные параметры архивации, здесь же можно задавать единые параметры архивации которые будут использованны для всех дополнительных блоков. Дополнительные блоки могут иметь произвольные имена. В них происходит описание параметров конкретных архивов. Порядок описания блоков не имеет значения, главное указать какой блок будет обработан следующим.

Приведеный ниже конфиг описывает следующую логику архивирования:
  • Первого числа каждого месяца делать полный архив данных (ежемесячный архив). Он будет помещен в папку "/backup/ARCH/Monthly/" с именем «fullsystem.tar». При удачном завершении старые архивы, старше 3х месяцев, будут удалены.
  • Каждое воскресенье делать инкрементальный архив от ежемесячного (еженедельный архив). Будет помещен в папку "/backup/ARCH/Weekly/" с тем же именем. При удачном завершении старые архивы, старше 4х недель, будут удалены.
  • Каждый день делать инкрементальный архив от еженедельного (ежедневный архив). Будет помещен в папку "/backup/ARCH/Dayly/" с тем же именем. При удачном завершении старые архивы, старше 8ми дней, будут удалены.
  • Список файлов которые будут заархивированны указаны в файле «monthly.include», файлы которые следует исключить заданны в «monthly.exclude»

$ cat /etc/defconf/main.conf
# Блок основных параметров
# Здесь задаются основные настройки бекапирования, для более точной настройки могут
# быть определенны в разделах описания архива. Исключением являються параметры с меткой (m)

main {

# В конфигурационном файле допускается использование
# своих переменных.
DEF_ARCHIVE_PATH="/backup/ARCH"

# Путь к папке с бэкапами
ARCHIVE_PATH=$DEF_ARCHIVE_PATH

# Имя архива
ARCHIVE_NAME="fullsystem.tar"

# Количество последних архивов которые не будут удалены
REMOVE_DEPTH=3

# Дополнительные параметры tar (m)
TAR_ADD_PARAMS="-vR"

# Ошибки которые не будут прерывать выполнение скрипта
# (в конце обязателен пробел) (m)
TAR_ERR_EXCLUDE="0 "

# Настройки почты (не забудте настроить "/etc/ssmtp/ssmtp.conf",
# а так же установить почтовый клиент "mutt")

# Тема письма
SUBJECT="ITEq Error level: $ERROR_CODE"

# Получатель
MAILTO="logger@site.ru"

# Посылать ли лог по почте (all - отправлять всегда, error - только при ошибках,
# при любом другом значении письмо отправлено не будет)
SENDMAIL='all'

# Первый блок конфига бекапа который будет обработан
NEXT=montly
}

# Месячный бэкап
# Первый блок всегда описывает полый архив
# все последующие будут выполняться инкрементным
# архивом от предыдущего

montly {

ARCHIVE_PATH="$DEF_ARCHIVE_PATH/Monthly/"

# Задает номер месяца когда разрешено делать архивацию
# Возможные значения от 1 до 12; 0 - любой месяц (равносильно 1-12 и 0/1)
# Так же можно задавать значения в виде интервала (1-3) или
# кратного числа (0/3). Далее идут три эквивалентные записи
MONTH=0
#MONTH=1-12
#MONTH=0/1

# Задает день месяца когда разрешено делать архивацию
# Возможные значения от 1 до 31
# Варианты записи аналогичны заданию месяца
DAY=1

# Задает день недели когда разрешено делать архивацию
# Возможные значения от 1 до 7 (1 - понедельник)
# Варианты записи аналогичны заданию месяца и дня месяца
DAY_OF_WEEK=0

# Задает имя файла в котором перечисляються объекты подлежащие архивации
TO_ARCHIVE_FILE_LIST="monthly.include"

# Задает имя файла с объектами исключенными из архива
EXCLUDE_FROM_ARCHIVE="monthly.exclude"

# Указываеться количество хранимых архивов
REMOVE_DEPTH=3

# Задает секцию с описанием следующего архива
NEXT=weekly
}

# Недельный бэкап
weekly {
ARCHIVE_PATH="$DEF_ARCHIVE_PATH/Weekly/"
MONTH=0
DAY=0
DAY_OF_WEEK=7
TO_ARCHIVE_FILE_LIST="monthly.include"
EXCLUDE_FROM_ARCHIVE="monthly.exclude"
REMOVE_DEPTH=4
NEXT=dayly
}

#Ежедневный бэкап
dayly {
ARCHIVE_PATH="$DEF_ARCHIVE_PATH/Dayly/"
MONTH=0/1
DAY=0
DAY_OF_WEEK=0
TO_ARCHIVE_FILE_LIST="monthly.include"
EXCLUDE_FROM_ARCHIVE="monthly.exclude"
REMOVE_DEPTH=8
NEXT=none
}


Для задания объектов подлежащих архивации, а так же исключенных из нее, используются обычные файлы списки, которые воспринимает tar. Эти два файла должны находиться в папке с конфигом. Так же в папке с конфигом находится папка «services». В эту папку можно кидать линки на службы, которые непосредственно перед архивацией будут останавливаться, а после снова запускаться. Так же туда можно кидать и исполняемые файлы, в которых можно описать дополнительные действия до и после архивации. Все эти файлы запускаются с параметром «stop» перед архивацией и «start» после архивации.

Для установки скачайте архив bbackup.tar и распакуйте его куда не жалко и запустите «setup.sh».

Сам запуск программы до безобразия прост:
bbackup.sh <файл конфига>

Например:
$ bbackup.sh /etc/defconf/main.conf

Но скрипт создавался для автоматизации, поэтому запихнем его в крон на ежедневное исполнение.

echo -e "#!/bin/sh\n/sbin/bbackup.sh /etc/bbackup/defconf/main.conf">/etc/cron.daily/bbackup.sh

На этом пожалуй я и закончу. Всем удачных бэкапов и пусть они вам никогда не пригодятся!

P.S. Сразу приношу свои извенения за некоторую сумбурность и неструктурированность данного поста. Я уже давно хотел его написать, но все никак руки не доходили, посему это писалось в порыве энтузиазизма в ущерб сна %)

Tags:
Hubs:
+22
Comments73

Articles