Как сделать бекап OpenVZ контейнера без даунтаймов

Виртуальные сервера — это очень удобно. Можно разделять проект на задачи и для каждой выделять VPS, и по мере роста проекта разносить эти виртуалки по разным физическим серверам.

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

Прежде всего нам потребуется удаленный хост с поддержкой sshпротокола и наличием rsync. Сам бекап состоит из трех этапов:

  1. Первоначальная копия всех файлов (можно запускать только для первого бекапа)
  2. Копия дельты измененных файлов от первоначальной копии до текущего состояния контейнера
  3. Финальная копия остатка измененных файлов с заморозкой контейнера

Допустим нам нужно сделать копию контейнера 110 на сервер с именем host от пользователя user.
Первоначальный этап выполняется командой:

RSYNC_RSH="ssh Compression=no"  rsync -aHz \
--numeric-ids --bwlimit=1024 /vz/private/110 [email protected]:/backup/110

Рассмотрим опции более детально.

  • -o Compression=no — Отключаем сжатие средством ssh
  • -a — Сохранение прав доступа к файлам
  • -z — Использовать сжатие средством rync
  • —numeric-ids — Сохранять информацию о владельцах и группах в числовом формате
  • —bwlimit=1024 — Использовать 1Mb пропускной способности канала

Итак, первая часть бекапа проходит медленно и незаметно для работы VPS. Вторую часть следует выполнить в точности как и первую, добавив только опцию —delete, для удаления ненужных файлов и отключив лимитирование канала:

RSYNC_RSH="ssh Compression=no"  rsync -aHz --delete \
--numeric-ids /vz/private/110 [email protected]:/backup/110

Вторая часть бекапа пройдет быстрее, а пользователи VPS почувствуют только небольшие сетевые тормоза на короткое время.

А вот для третьего этапа мы сначала заморозим контейнер, потом быстро скинем изменившиеся файлы и вернем контейнер обратно в рабочее состояние.

vzctl chkpnt 110 --suspend
RSYNC_RSH="ssh Compression=no"  rsync -aHz --delete \
--numeric-ids /vz/private/110 [email protected]:/backup/110
vzctl chkpnt 110 --resume

Для пользователей VPS это будет выглядеть как небольшая задержка в сети на несколько десятков секунд, после чего работа будет продолжена, в том числе с сохранением всех сессий.