Резервная копия — это образ диска виртуальной машины (ВМ), который используется для её восстановления. В отличие от пользовательских образов, резервные копии содержат все настройки ВМ. Например, сетевые настройки, пароли и т.д.

Резервная копия не гарантирует консистентность баз данных, используемых на ВМ.

Вы можете создать резервную копию:

  • на узле кластера, где находится исходная ВМ — резервные копии создаются в директории хранения образов. При миграции ВМ резервные копии перемещаются вместе с ней на другой узел кластера. 

    При удалении ВМ её резервные копии удаляются. Чтобы получить копию ВМ, которая будет сохранена после удаления оригинальной ВМ, создайте пользовательский образ.

  • на внешнем хранилище — резервная копия сначала создаётся на узле кластера, а затем копируется в хранилище. По завершении копирования резервная копия удаляется с узла кластера. Подробнее о настройке хранилища см. Хранилища резервных копий.

Резервные копии можно создавать автоматически по заданному расписанию. Подробнее см. в статье Автоматическое создание резервных копий.

Ограничения резервных копий


При создании резервной копии запущенной ВМ целостность данных ПО не гарантируется. Это происходит из-за того, что резервная копия сохраняет образ файловой системы. Если при создании копии какие-либо процессы операционной системы выполняют операции чтения или записи, последнее состояние невозможно будет восстановить из резервной копии. Например, если создать копию ВМ с работающей базой данных, восстановление базы данных будет невозможно. В таких случаях рекомендуется остановить ВМ перед созданием резервной копии.

Алгоритм создания резервной копии


KVM-кластер

Чтобы выполнить резервное копирование, VMmanager:

  1. Cоздаёт снапшот ВМ. В файловом хранилище снапшот создаётся в директории хранения ВМ (по умолчанию — /vm), в LVM-хранилище — в LV, где хранится исходная ВМ, в Ceph-хранилище — на узле кластера Ceph.
  2. Перемещает информацию из снапшота в директорию хранения образов на узле кластера (по умолчанию — /image). Для создания архива платформа использует утилиту zstd. Уровень сжатия определяется алгоритмами утилиты и не гарантируется платформой.
  3. Удаляет исходный файл снапшота.
  4. Если копия должна быть создана на внешнем хранилище:
    1. Оптимизирует архив снапшота с помощью утилиты virt-sparsify
    2. Перемещает архив снапшота на внешнее хранилище.

Если вы используете файловое хранилище, для создания резервной копии на узле кластера должно быть свободное место, в два раза превышающее объём диска ВМ. Например, для создания копии ВМ с диском 20 Гб на узле кластера должно быть свободно не менее 40 Гб. 

LXD-кластер

Чтобы выполнить резервное копирование, VMmanager:

  1. Создаёт резервную копию ВМ в директории /var/snap/lxd/common/lxd/backups/ на узле кластера.
  2. Создаёт архив резервной копии в директории /var/snap/lxd/common/lxd/backups/instances/ на узле кластера. Для создания архива платформа использует утилиту zstd. Уровень сжатия определяется алгоритмами утилиты и не гарантируется платформой.
  3. Переносит архив резервной копии в директорию хранения образов на узле кластера (по умолчанию — /image).
  4. Удаляет резервную копию ВМ.
  5. Если копия должна быть создана на внешнем хранилище, перемещает архив на внешнее хранилище.

Для создания резервной копии на узле кластера должно быть свободное место, примерно в 1,5 раза превышающее объём диска ВМ. Например, для создания копии ВМ с диском 20 Гб на узле кластера должно быть свободно не менее 30 Гб.

Ограничения

Одновременно на узле кластера может выполняться не более одной операции:

  • создания резервной копии;
  • копирования на внешнее хранилище.

Внешнее хранилище единовременно может принимать только одну резервную копию. Таким образом, если хранилище используется несколькими узлами кластера, одновременное сохранение на нём копий ВМ с нескольких узлов невозможно.

Создание резервных копий в LVM-хранилище

Чтобы создать резервную копию в LVM-хранилище, платформа:

  1. Создаёт снапшот ВМ командой:

    lvcreate --size {self.size_mib} --snapshot --name '{self.snapshot_name}' '{self.disk}'
    BASH
  2. Проверяет свободное место на узле и сжимает диск утилитой zstd с помощью команды: 

    set -o pipefail; nice -n 5 dd bs=4M if=/vm/{vm_name} | zstd --no-progress --rm -1 -T1 -c | dd bs=4M of=/image/1_{vm_name}_backup.qcow2.zst
    BASH
  3. Перемещает архив снапшота на внешнее хранилище.

Особенности создания резервных копий по расписанию


При работе по расписанию перед копированием ВМ на внешнее хранилище VMmanager проверяет возможность этой операции. Для этого платформа последовательно рассчитывает хватит ли места на внешнем хранилище для каждой ВМ. Если места для ВМ в хранилище достаточно, VMmanager создаст задачу на резервное копирование.

Например, нужно создать копии для виртуальных машин VM1 (объём диска 40 Гб), VM2 (объём диска 20 Гб) и VM3 (объём диска 10 Гб). На внешнем хранилище свободно 55 Гб. Для этого VMmanager:

  1. Проверяет хватит ли в хранилище места для VM1.
  2. Так как места достаточно, создаёт задачу на копирование VM1.
  3. Вычисляет сколько останется места после копирования VM1: 55 Гб - 40 Гб = 15 Гб
  4. Проверяет хватит ли в хранилище места для VM2.
  5. Так как места недостаточно, не создаёт задачу на копирование.
  6. Проверяет хватит ли в хранилище места для VM3.
  7. Так как места достаточно, создаёт задачу на копирование VM3.
  8. Последовательно копирует VM1 и VM3 во внешнее хранилище.