Снапшоты (снимки состояния) — гениальное изобретение. Делаешь рискованный апдейт, ставишь сомнительный или по просту не знакомый софт, ломаешь систему, а потом за секунды откатываешься назад, как будто ничего и не было. Из-за этого возникает соблазн оставить снапшот «на всякий случай» подольше ведь надо же и потестить решение… А потом еще один. И еще…
В итоге виртуальная машина начинает работать на снапшотах постоянно. Это совсем не хорошо и вот почему:
Как вообще работают снапшоты?
Чтобы понять корень зла, нужно заглянуть под капот гипервизора. Когда ты нажимаешь кнопку «Take Snapshot», система не делает полную копию твоего виртуального диска (это был бы бэкап, а снапшот — это не бэкап. Obviously huh?).
Происходит следующее:
Базовый виртуальный диск (VMDK, VHDX и т.п) переводится в режим «только чтение».
Рядом создается новый пустой файл — дельта-диск (разностный диск).
С этого момента все новые данные, которые операционная система пытается записать, летят именно в этот дельта-диск.
Чем дольше ВМ-ка живет на снапшоте, тем больше разрастается дельта-диск. В худшем сценарии он может вырасти до размеров оригинального диска, и твоя ВМ-ка займет на хранилище в два раза больше места.
Снапшот на снапшоте снапшотом погоняет: строим карточный домик
Самая большая ошибка — создавать цепочки снапшотов. Допустим, ты сделал снимок перед обновлением базы данных, через неделю — перед обновлением ОС, а потом еще один перед правкой конфигов.
Формируется дерево зависимости: Базовый диск -> Снапшот 1 -> Снапшот 2 -> Снапшот 3.
Почему это катастрофа:
Ужасающее падение производительности в долгой. Когда системе нужно прочитать файл, гипервизор сначала ищет блок данных в самом свежем снапшоте. Если его там нет, он спускается на уровень ниже, потом еще ниже, пока не дойдет до базового диска. Чем длиннее цепочка, тем сильнее задыхается дисковая подсистема. Нагрузка на чтение (IOPS) возрастает кратно.
Риск потери всего. Цепочка снапшотов невероятно хрупкая. Если хотя бы один промежуточный дельта-файл повредится (например, из-за сбоя на СХД), вся цепочка данных после него превратится в тыкву. Ты потеряешь все изменения.
Сложное удаление. Когда ты наконец решишь удалить старые снапшоты, гипервизору придется объединить (консолидировать) все эти гигабайты изменений обратно в базовый диск. Этот процесс сильно грузит систему, занимает уйму времени, а ВМ-ка может зависнуть («stun») в самый неподходящий момент.
Снапшоты с сохранением ОЗУ и без: в чем подвох?
При создании снимка гипервизор обычно спрашивает, нужно ли сохранять состояние оперативной памяти (Snapshot the virtual machine’s memory). У каждого подхода есть своя специфика.
Без сохранения памяти (Crash-consistent)
Записывается только состояние диска. Для гостевой ОС откат к такому снапшоту выглядит так, как будто серверу внезапно выдернули кабель питания, а потом включили снова.
Плюсы: Создается очень быстро, не требует дополнительного места для ОЗУ.
Минусы: Транзакции в базах данных, которые висели в памяти и не успели сброситься на диск, будут потеряны.
С сохранением памяти (Application-consistent / Memory state)
Гипервизор делает точный слепок не только диска, но и всего, что было в оперативной памяти (создается отдельный файл дампа памяти, равный объему выделенной ОЗУ виртуалки). При откате система оживает в ту же секунду, с открытыми окнами и незавершенными процессами.
Скрытая угроза: В момент создания такого снапшота ВМ-ка буквально «замораживается» на доли секунды или даже секунды, чтобы безопасно сбросить содержимое ОЗУ на диск. В высоконагруженных системах (базы данных, почтовые серверы) эта пауза рвет сетевые соединения. Клиенты отваливаются, кластеры думают, что нода умерла, и начинают перестроение. Работать с такими снапшотами в продакшене нужно максимально осторожно.
А когда это вредно?
Есть отдельная каста машин, для которых снапшоты это либо гарантированная авария либо тупо бесполезно.
Контроллеры домена Active Directory при откате ломают счетчики репликации и изолируются от остальной сети. Кластерные системы (Windows Failover Cluster, SQL Always On) невероятно чувствительны к микро-фризам: когда гипервизор (тот же ESXi) на долю секунды «станит» машину для создания или консолидации снимка, кластер теряет хартбиты и запускает ложный failover с разрывом пользовательских сессий. In-Memory базы (Redis, Memcached) вообще бессмысленно снимаить: без сохранения ОЗУ получишь пустую оболочку, а дамп памяти на диск может наглухо повесить сервис. Сюда же относятся тяжелые транзакционные БД и реал-тайм сервисы (телефония, NTP), где паузы на сброс кэша убивают производительность хранилища штормом IOPS и рвут сетевые соединения. Правило одно: если внутри крутится репликация, кластеризация или жесткая привязка ко времени — забываем про снапшоты и делаем нормальные бэкапы профильным софтом.
Итог: правила гигиены
Снапшот — это пластырь (а иногда тупо подорожниковый листик), а не гипс. Правила выживания здесь просты:
Держи снапшот максимум 24-72 часа. Сделал работу, убедился, что все ок — удаляй (консолидируй).
Не строй цепочки больше 2-3 снимков.
Для долгосрочного хранения используй полноценные системы резервного копирования (бэкапы).
Если о чем то забыл написать, дай знать в комментах или в ЛС. Всем тихой пятницы!
P.S
Само собой я не являюсь истиной в последней инстанции или цифровым миссией. А по сему мое мнение или же видение может не соответсвтовать твоему. В целом если мои статьи имеют пользу, это уже хорошо. А если нет, то на нет и суда нет.