Резервное копирование (бэкап) контейнеров 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; |
Готово