Categories
Database Backup

> Discover why standard VM snapshots cause data corruption in transactional databases like PostgreSQL and SQL Server. Learn DBA best practices for application-consistent backups, avoiding VM stun, and ensuring data integrity with CloudSave.

Для DevOps-инженеров и системных администраторов снимки (снапшоты) виртуальных машин (ВМ) являются фундаментальным инструментом. Они предоставляют быстрый и удобный способ зафиксировать состояние сервера перед установкой рискованного патча, внесением серьезных изменений в конфигурацию или развертыванием приложения. Если что-то пойдет не так, откат займет считанные секунды.

Однако, когда эта же методология применяется к транзакционным базам данных — таким как PostgreSQL, MySQL, Oracle или Microsoft SQL Server, — снимки ВМ превращаются из «страховочной сетки» в «бомбу замедленного действия».

Использование стандартных снимков гипервизора для резервного копирования баз данных является одной из самых частых причин повреждения данных, появления «разорванных» страниц (torn pages) и невосстановимых сбоев в работе продакшена. В этой статье мы рассмотрим архитектурный конфликт между гипервизорами и движками баз данных, механику повреждения данных во время создания снимков, а также лучшие инженерные практики, необходимые для безопасного резервного копирования виртуализированных баз данных.

Архитектурный конфликт: гипервизоры против движков баз данных

Чтобы понять, почему снимки ВМ опасны для баз данных, нужно сначала рассмотреть, как обе системы управляют состоянием и операциями ввода-вывода (I/O).

Как гипервизоры выполняют снимки

Когда гипервизор (например, VMware ESXi, Microsoft Hyper-V или KVM) делает снимок, он не копирует диск целиком. Вместо этого он переводит текущий файл виртуального диска (например, .vmdk или .vhdx) в состояние «только для чтения» и создает новый дельта-диск (диск разницы). Все последующие операции записи направляются на этот дельта-диск.

Когда снимок удаляется, гипервизор должен объединить (консолидировать) данные из дельта-диска обратно в базовый диск. Стандартные снимки ничего не знают о приложениях, работающих внутри гостевой операционной системы. Они фиксируют состояние диска именно таким, каким оно было в ту микросекунду.

Как транзакционные базы данных управляют состоянием

Транзакционные базы данных спроектированы с учетом свойств ACID (атомарность, согласованность, изолированность, долговечность). Чтобы достичь высокой производительности при соблюдении ACID, базы данных не записывают каждую транзакцию напрямую в основные файлы данных на диске немедленно. Вместо этого они используют сложную многоуровневую архитектуру:

  1. Пул буферов / Shared Buffers: Данные считываются и изменяются в оперативной памяти системы.
  2. Журнал предзаписи (WAL) / Redo Logs: Изменения последовательно записываются в высокооптимизированный файл журнала на диске для обеспечения долговечности.
  3. Контрольные точки (Checkpoints) / Lazy Writers: Периодически база данных сбрасывает измененные («грязные») страницы из памяти в основные файлы данных на диске.

Из-за такой архитектуры физические файлы данных на диске почти всегда не синхронизированы с реальным состоянием базы данных. Истинное состояние базы данных существует только как комбинация файлов данных на диске, журналов WAL/Redo и данных, находящихся в данный момент в памяти.

Зона опасности: что происходит во время снимка ВМ

Когда вы делаете стандартный снимок ВМ сервера базы данных, вы фиксируете состояние crash-consistent (согласованное на момент сбоя).

Согласованность при сбое (Crash Consistency) против согласованности приложения (Application Consistency)

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

Хотя современные базы данных спроектированы для восстановления после неожиданного отключения питания путем повторного воспроизведения журнала предзаписи (WAL), полагаться на восстановление после сбоя как на основную стратегию резервного копирования крайне опасно. Если ваша база данных распределена по нескольким виртуальным дискам (например, файлы данных на диске D:, а WAL на диске E:), гипервизор может не сделать снимок обоих дисков в одну и ту же микросекунду. Если снимок диска с WAL будет сделан хотя бы на долю секунды позже снимка диска с данными, база данных не сможет согласовать порядковые номера при восстановлении, что приведет к фатальному повреждению.

Эффект «VM Stun» в высоконагруженных системах

Процесс создания снимка — и, что более важно, процесс консолидации снимка — вызывает явление, известное как «VM Stun» (замирание ВМ).

Чтобы безопасно переключить ввод-вывод с базового диска на дельта-диск, гипервизор должен на короткое время приостановить (заморозить) виртуальную машину. Для слабонагруженного веб-сервера это замирание может длиться 10–50 миллисекунд и остаться незамеченным. Однако для базы данных с высокой пропускной способностью и интенсивным вводом-выводом консолидация большого дельта-диска может «заморозить» ВМ на несколько секунд.

Во время замирания ВМ:
* Сетевые соединения разрываются, вызывая тайм-ауты приложений.
* Кластеры высокой доступности (такие как SQL Server Always On, PostgreSQL Patroni или MySQL Galera) пропускают проверки работоспособности (heartbeat).
* Кластер может решить, что «замерший» узел мертв, и инициировать ненужное и деструктивное переключение (сценарий split-brain).

«Разорванные» страницы и рассинхронизация ввода-вывода

Движки баз данных обычно записывают данные страницами определенного размера (например, 8 КБ для PostgreSQL и SQL Server, 16 КБ для InnoDB). Однако операционная система и дисковые массивы обрабатывают ввод-вывод меньшими блоками (например, 4 КБ или 512 байт).

Если гипервизор делает снимок в тот момент, когда база данных записывает 8-килобайтную страницу, снимок может захватить первые 4 КБ новых данных и последние 4 КБ старых. Это создает «разорванную» страницу (torn page). При попытке восстановить такой снимок база данных прочитает страницу, не пройдет проверку контрольной суммы и пометит базу данных как поврежденную.

Реальные последствия для конкретных движков баз данных

Разные движки баз данных реагируют на снимки, согласованные на момент сбоя, по-разному, но ни один из них не справляется с этим корректно в продакшн-среде.

  • PostgreSQL: PostgreSQL сильно зависит от каталога pg_wal. Если снимок захватывает каталог данных ($PGDATA) и WAL несинхронно, PostgreSQL не запустится, выдавая ошибку PANIC: could not locate a valid checkpoint record.
  • MySQL/InnoDB: InnoDB использует буфер двойной записи (doublewrite buffer) для предотвращения «разорванных» страниц, что дает некоторую защиту от состояний, согласованных на момент сбоя. Однако, если файл ibdata1 и ib_logfile будут захвачены несинхронно, движок InnoDB выйдет из строя при восстановлении.
  • Microsoft SQL Server: SQL Server крайне чувствителен к заморозке ввода-вывода. Без надлежащей интеграции с VSS (Volume Shadow Copy Service) восстановление SQL Server из стандартного снимка ВМ часто приводит к тому, что базы данных помечаются как «подозрительные» (suspect), а цепочки журналов разрываются, что делает невозможным восстановление на момент времени (PITR).

Лучшие практики безопасного резервного копирования виртуализированных баз данных

Чтобы защитить транзакционные базы данных, необходимо перейти от резервных копий, согласованных на момент сбоя, к резервным копиям, согласованным на уровне приложения (application-consistent). Это требует, чтобы механизм резервного копирования взаимодействовал с движком базы данных, заставляя его сбросить данные из памяти на диск и временно приостановить операции ввода-вывода на время создания снимка.

1. Используйте Application-Aware Quiescing (VSS и fsfreeze)

Для Windows (SQL Server):
Всегда следите за тем, чтобы ваше решение для резервного копирования использовало службу теневого копирования томов Microsoft (VSS). Когда запускается VSS-совместимое резервное копирование, VSS Writer для SQL Server замораживает ввод-вывод базы данных, сбрасывает ожидающие транзакции на диск и гарантирует, что снимок будет идеально согласован на уровне приложения.

Для Linux (PostgreSQL / MySQL):
В Linux нет прямого аналога VSS. Для достижения согласованности на уровне приложения необходимо использовать скрипты pre-freeze и post-thaw в сочетании с гостевыми инструментами гипервизора (например, VMware Tools).

Вот пример pre-freeze-script для VMware для PostgreSQL 15+, который безопасно подготавливает базу данных к снимку:

#!/bin/bash
# /usr/sbin/pre-freeze-script
# Убедитесь, что скрипт исполняемый (chmod +x)

# 1. Дать команду PostgreSQL подготовиться к бэкапу
su - postgres -c "psql -c "SELECT pg_backup_start('vm_snapshot', true);""

# 2. Сбросить буферы файловой системы на диск
sync

# 3. Заморозить файловую систему (предполагая, что данные находятся в /var/lib/pgsql)
fsfreeze -f /var/lib/pgsql

И соответствующий post-thaw-script для возобновления операций:

#!/bin/bash
# /usr/sbin/post-thaw-script

# 1. Разморозить файловую систему
fsfreeze -u /var/lib/pgsql

# 2. Сообщить PostgreSQL, что бэкап завершен
su - postgres -c "psql -c "SELECT pg_backup_stop();""

2. Используйте нативные утилиты резервного копирования баз данных

Хотя снимки, согласованные на уровне приложения, лучше стандартных, они все равно несут риск «замирания» ВМ. Самый безопасный подход для резервного копирования баз данных — использование нативных потоковых утилит, которые работают независимо от гипервизора.

PostgreSQL (pg_basebackup):

pg_basebackup -h localhost -U replication_user -D /mnt/backups/pg_backup -Ft -z -P

MySQL/MariaDB (Percona XtraBackup / Mariabackup):
Эти инструменты создают «горячие» неблокирующие бэкапы путем копирования файлов данных с одновременным отслеживанием изменений в журнале redo.

mariabackup --backup --target-dir=/mnt/backups/mysql_backup --user=root --password=SecurePass

SQL Server (T-SQL):

BACKUP DATABASE [ProductionDB] 
TO DISK = N'Z:BackupsProductionDB.bak' 
WITH NOFORMAT, NOINIT, NAME = N'ProductionDB-Full Backup', 
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;
GO

3. Внедрите восстановление на момент времени (PITR) через архивацию журналов

Ежедневный снимок или полный бэкап защищает вас только до того момента, когда он был сделан. Если ваша база данных выходит из строя в 16:00, а последний снимок был в 02:00, вы теряете 14 часов транзакционных данных.

Для достижения настоящей корпоративной устойчивости необходимо сочетать полные бэкапы, согласованные на уровне приложения, с непрерывной архивацией журналов (резервным копированием WAL, Redo Logs или Transaction Logs каждые несколько минут). Это позволяет администраторам баз данных восстановить базу данных на конкретную минуту или даже на конкретный ID транзакции перед аварией.

Корпоративные стратегии резервного копирования с CloudSave

Управление пользовательскими скриптами pre-freeze, заданиями cron для нативных дампов и отправкой журналов для десятков серверов баз данных — это операционный кошмар для команд DevOps. Именно здесь критически важной становится платформа корпоративного уровня, такая как CloudSave.

CloudSave устраняет разрыв между виртуализацией и архитектурой баз данных. Вместо того чтобы полагаться на «слепые» снимки гипервизора, CloudSave использует агенты, учитывающие специфику приложений, которые нативно интегрируются с SQL Server, PostgreSQL, MySQL и Oracle.

Когда CloudSave инициирует резервное копирование:
1. Он взаимодействует напрямую с движком базы данных через нативные API (например, VSS для Windows или нативный потоковый WAL для Linux).
2. Он организует сброс буферов памяти на диск без вызова деструктивных замираний ВМ.
3. Он безопасно захватывает файлы данных и автоматически управляет усечением журналов транзакций.
4. Он непрерывно архивирует журналы транзакций, обеспечивая гранулярное восстановление на момент времени (PITR) в несколько кликов.

Переложив сложность обеспечения согласованности приложений на CloudSave, администраторы баз данных и системные администраторы могут гарантировать целостность данных, не жертвуя производительностью или доступностью своих продакшн-кластеров.

Заключение

Снимки виртуальных машин — это невероятный инструмент для управления инфраструктурой, но они фундаментально несовместимы с требованиями ACID для транзакционных баз данных. Полагаясь на снимки гипервизора, согласованные на момент сбоя, вы подвергаете свою организацию риску появления «разорванных» страниц, разрыва цепочек репликации и катастрофической потери данных.

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