Go to content Go to menu Go to search

Резервное копирование (бэкап) контейнеров OpenVZ и LXC

Постановка задачи и проблематика вопроса

Есть несколько методов решения задачи резервного копирования контейнеров OpenVZ. Как вариант можно использовать vzdump.
Недостаток vzdump заключается в том, что если делать дамп в режиме снапшота то могут потеряться данные (например попортиться БД). Если делать в режиме с остановкой контейнера, то получается большой даунтайм (даунтайм будет продолжаться все время, пока работает tar, а это может быть несколько часов).

Предлагаю следующее решение:

  • Останавливаем контейнер
  • Делаем rsync содержимого контейнера в отдельную папку
  • Запускаем контейнер
  • Создаем tar-архив папки в которую делали rsync
  • Таким образом, получаем даунтайм только на время работы rsync.

Маленький нюанс – для того, что бы остановить контейнер в папке не должно быть заблокированных файлов. Например, если кто-то заходил на хост, ходил по ФС и остался залогиненым в папке с контейнером, то контейнер не сможет отмонтировать roofs и не остановится. Для решения – просто перед началом резервного копирования будем выкидывать всех юзеров с хоста через скрипт kickusers .

Еще нюанс – в примере ниже БД postgres бэкапится каждый раз полностью (для этого она каждый раз удаляется из целевой папки до запуска rsync)

В скрипте для сжатия архива tar использована утилита pigz (см. Сжатие файлов архиватором под linux в много потоков)

Реализация

Собственно пример скрипта backupvz.sh, запускаем по крону. Прошу пардона за хардкод, писалось на коленке.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
echo "`date` backup of vz101 started" >> /etc/bacula/scripts/run.log

# выбрасываем пользователей
kickusers

# удаляем старую копию БД из целевой папки
rm -rf /datafiles/backup/101/var/lib/pgsql

# стопаем контейнер, делаем rsync, стартуем контейнер
vzctl stop 101
rsync -aulrzvO --delete /vz/private/101 /datafiles/backup
vzctl start 101

echo "`date` backup of vz101 - rsync done" >> /etc/bacula/scripts/run.log

# создаем архив контейнера
tar --use-compress-program=pigz -cf /mnt/pve/nfs_bacula_1000M/w-j/101.tar.gz /datafiles/backup/101

# создаем архив настроек контейнера
tar --use-compress-program=pigz -cf /mnt/pve/nfs_bacula_1000M/w-j/101_conf.tar.gz /etc/vz/conf/101.conf
sleep 1;

echo "`date` backup of vz101 ended" >> /etc/bacula/scripts/run.log

exit 0;

Готово


при публикации материалов с данного сайта обратная ссылка на сайт обязательна.
valynkin.ru © no rights reserved