Snapshot: что такое снапшот и чем отличается от бэкапа | Глоссарий FREEHOSTING

Snapshot

Снапшот
Snapshot — Мгновенный снимок состояния диска, тома или базы данных в конкретный момент времени. Создаётся через copy-on-write и не дублирует данные физически, поэтому требует минимум места при создании и используется как точка отката.

Определение простыми словами

Снапшот — это «фотография» состояния тома или виртуальной машины на конкретный момент времени. Современные снапшоты не копируют данные физически: пока исходные блоки не меняются, снимок и оригинал ссылаются на одни и те же сектора через механизм copy-on-write. Запись новых данных приводит к копированию только изменённых блоков, поэтому снимок занимает минимум места и создаётся за секунды.

Главное правило: снапшот — это не бэкап. Если умирает диск или том, на котором лежат и данные, и снимок, то теряется всё разом. Снимки полезны для быстрых откатов после миграций, обновлений и тестов, но для долговременной защиты данные нужно копировать на отдельное хранилище через rsync, restic или промышленные системы.

Сравнение с альтернативами

Тип защиты Скорость создания Защита от отказа диска Где живёт
Snapshot Секунды Нет На том же томе
Backup Минуты — часы Да Отдельное хранилище
Replication Минуты задержки Да Другая площадка
Clone Минуты Зависит от носителя Полная копия тома

Кейсы использования

  • Точка отката перед обновлением ядра, мажорной версией PostgreSQL или ноды Kubernetes.
  • Быстрая выдача песочниц разработчикам — клонирование тома без копирования.
  • Тестирование миграций базы данных на реальных данных без риска для прода.
  • Снимок виртуальной машины в облаке перед экспериментом с прошивкой.
  • Согласованный по времени источник для резервного копирования с последующей выгрузкой через rsync.

Негативный сценарий: на хосте с базой данных ZFS-снапшот висит две недели и съедает 80% свободного места, потому что DBA забыл про него. Запись на том упирается в нехватку места, база уходит в read-only, сервис падает. Снимки нужно держать под мониторингом и удалять по политике.

Технические детали

# LVM snapshot для бэкапа базы
sudo lvcreate -L 10G -s -n db_snap /dev/vg0/db
sudo mount -o ro /dev/vg0/db_snap /mnt/snap
sudo lvremove -f /dev/vg0/db_snap

# ZFS — мгновенный снимок и откат
sudo zfs snapshot tank/data@before-upgrade
sudo zfs rollback tank/data@before-upgrade
sudo zfs destroy tank/data@before-upgrade

# Btrfs subvolume snapshot
sudo btrfs subvolume snapshot /mnt/data /mnt/data-snap

# Облачный VPS API (пример Hetzner)
curl -X POST -H "Authorization: Bearer $TOKEN" 
  https://api.hetzner.cloud/v1/servers/123/actions/create_image

Снимки в LVM, ZFS и Btrfs работают на уровне блочного устройства и не понимают, что внутри живёт. Чтобы получить consistent-снимок СУБД, перед созданием делают FLUSH TABLES WITH READ LOCK, pg_start_backup или используют файловые системы с поддержкой fsfreeze. Иначе в снимке окажется набор «полузаписанных» страниц, и восстановление затянется надолго.

Частые вопросы

Чем snapshot отличается от backup?

Снапшот хранится на том же томе и не защищает от его отказа. Бэкап — это полноценная копия на отдельном хранилище. Снимки удобны для быстрых откатов и source for backup, но не заменяют резервное копирование.

Сколько места занимает снапшот?

В момент создания почти ничего. Размер растёт пропорционально объёму изменённых блоков с момента снимка. Если активная база переписывает много данных, снимок может разрастись до объёма исходного тома за сутки.

Можно ли откатить только часть данных?

Полный rollback возвращает том к состоянию снимка целиком. Чтобы достать отдельные файлы, снимок монтируют read-only и копируют нужное наружу через cp или rsync. Для СУБД восстанавливают конкретные таблицы из дампа.