RPO, RTO и проверка бэкапов
Посчитал честно. База на 500 гигабайт, канал 120 мегабайт в секунду - только копирование данных займёт 1,2 часа, и это без запуска, прогрева и проверки. Если бизнесу обещано «поднимемся за час», такая схема не работает в принципе, и узнавать об этом лучше не в момент катастрофы.
Стержень: два числа задают всю схему - сколько данных допустимо потерять и за сколько надо подняться; реплика при этом не заменяет копию.
// Формулировки: «что такое RPO и RTO?», «реплика это бэкап?», «как проверить, что копии рабочие?»
Два числа, из которых растёт схема
RPO (recovery point objective) - сколько данных допустимо потерять, измеряется во времени. Копия раз в сутки означает потерю до суток. Архив журнала изменений (базы пишут все правки в отдельный журнал) с выгрузкой раз в пять минут - до пяти минут. Синхронная реплика - ноль, но за неё платят задержкой каждой записи.
RTO (recovery time objective) - за сколько надо вернуться в строй. Именно оно упирается в физику: мой расчёт с 500 гигабайтами и часовым обещанием показывает, что копированием тут не обойтись. Если нужен час, то нужна уже поднятая и работающая копия базы, готовая принять трафик, - на неё переключаются, а не восстанавливаются из архива.
// Эти два числа не выбираются техническим отделом. Их называет бизнес, отвечая на вопрос «сколько стоит час простоя и сколько стоит потеря часа данных», а инженеры переводят ответ в схему и в её цену. Разговор в обратную сторону («мы сделали копии раз в сутки, вам хватит?») почти всегда заканчивается неприятным открытием в момент аварии.
- RPO
- допустимая потеря данных во времени (recovery point objective)
- RTO
- допустимое время восстановления (recovery time objective)
Реплика не заменяет копию
Реплика повторяет за основной базой всё, включая ошибки. Удалили таблицу командой без условия - реплика послушно удалила её у себя через миллисекунды. Приложение записало испорченные данные - реплика записала их же. От чего реплика защищает: от смерти машины, диска, зоны. От чего не защищает: от ошибки человека, от бага приложения, от шифровальщика.
Копия защищает от второго класса именно потому, что она отстаёт и неизменна. Поэтому копии держат в нескольких поколениях (вчера, неделю назад, месяц назад) и, желательно, в режиме, где их нельзя переписать или удалить раньше срока - иначе тот, кто добрался до вашей инфраструктуры, удалит и копии.
// Отсюда обычный минимум: копии лежат в другом месте, чем основная база; есть несколько поколений; есть проверка, что архив журнала действительно пишется. Последнее ломается чаще всего и молча: архивация отвалилась месяц назад, база от этого не тормозит, никто не замечает, а восстановление на точку становится невозможным.
- неизменяемая копия
- копия, которую нельзя переписать или удалить раньше срока
- поколения копий
- несколько копий разной давности, а не одна последняя
Проверка и учения
Копия, которую ни разу не восстанавливали, копией не считается. Причины отказа известны и повторяются: файл бьётся, версия не совпадает, забыли одну из баз, нет прав, не хватает места на целевой машине, а иногда архив просто пуст, потому что скрипт падал молча.
Поэтому восстановление проверяют по расписанию и автоматически: развернуть копию в отдельном месте, проверить, что данные читаются и сходятся, ЗАМЕРИТЬ время. Это время и есть настоящее значение, которое можно обещать бизнесу, а не то, которое кажется.
// Уровнем выше стоят учения по переключению целиком: увести трафик на резервную площадку и пожить там. Они находят то, чего не найдёт проверка копий: забытые записи в системе имён, сертификаты, которых нет во второй зоне, конфиги с прибитыми адресами, права доступа, выданные только в основной площадке. Практика простая: план переключения, который ни разу не проходили целиком, при аварии не сработает.
- проверка восстановления
- регулярное разворачивание копии с замером времени
- учения по переключению
- перевод трафика на резервную площадку в спокойное время
Как отвечать: «Есть реплика. Зачем ещё и бэкапы?»
Потому что они закрывают разные классы бед. Реплика повторяет за основной базой всё, включая ошибки: команда удаления без условия доедет до неё за миллисекунды, и испорченные приложением данные тоже. Она защищает от смерти машины, диска или зоны и ни от чего больше. Копия защищает именно тем, что отстаёт и неизменна: можно вернуться на состояние до ошибки. Поэтому держат несколько поколений копий, в другом месте, и по возможности в режиме, где их нельзя удалить раньше срока - иначе тот, кто добрался до инфраструктуры, удалит и копии. И третье, о чём спрашивают реже, чем стоило бы: копию надо регулярно восстанавливать и замерять время. Я считал простой пример - 500 гигабайт на канале 120 мегабайт в секунду это 1,2 часа только на копирование, так что обещание «поднимемся за час» такой схемой не выполняется.
Ответ разводит два класса аварий, добавляет требование неизменности и заканчивается измеримым временем восстановления. Именно эти три вещи и проверяются вопросом.
На чём валятся
- −Считают реплику заменой копии и теряют данные при ошибке человека.
- −Держат копии рядом с базой: авария или взлом уносит и то и другое.
- −Не проверяют восстановление и называют время наугад.
- −Не следят за архивацией журнала: она отваливается молча.
- −Пишут план переключения и ни разу не проходят его целиком.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 6, остальные разбираются в тренажёре.
- Что означают RPO и RTO в плане восстановления?A)RPO — потеря данных, RTO — время подъёмаB)RPO — время восстановления, RTO — частота снятия резервных копийC)RPO — срок хранения копий, RTO — их количествоD)RPO — доступность за год, RTO — допустимое число аварий
показать ответ и разбор
+A)RPO — потеря данных, RTO — время подъёма// разбор: RPO задаёт глубину потери данных: копия раз в сутки означает готовность потерять сутки работы. RTO задаёт время возвращения сервиса. Эти два числа определяют схему: RPO в минутах требует непрерывного архивирования журнала или репликации, RTO в минутах — тёплого резерва и отрепетированного переключения. Обе цифры берут из требований бизнеса, а не из возможностей текущей схемы.
- База реплицируется на две реплики. Достаточно ли этого вместо резервных копий?A)Достаточно: реплики хранят полную копию данныхB)Нет: ошибочное удаление доедет до реплик за секундыC)Достаточно, если реплики стоят в разных зонах доступностиD)Нет, но хватит снапшотов дисков раз в неделю
показать ответ и разбор
+B)Нет: ошибочное удаление доедет до реплик за секунды// разбор: Репликация защищает от отказа узла, а не от ошибки: команда, снёсшая таблицу, приедет на реплики мгновенно и не оставит выбора. Нужен независимый по времени слепок — резервная копия плюс архив журнала для восстановления на точку до сбоя. Хранят их отдельно от боевой системы и желательно с защитой от удаления, чтобы взломанный доступ не снёс заодно и копии.
- Копии снимаются каждую ночь, задание зелёное уже год. Что здесь всё ещё не сделано?A)Копии стоит дублировать во второе хранилищеB)Задание надо перевести на инкрементальную схемуC)Восстановление ни разу не проверяли и время его не мерилиD)Не настроено уведомление об успешном завершении задания
показать ответ и разбор
+C)Восстановление ни разу не проверяли и время его не мерили// разбор: Зелёное задание говорит лишь о том, что файл записался. Пока из него не подняли рабочую систему, неизвестно, полон ли дамп, читается ли он, есть ли ключи шифрования, хватает ли места и укладывается ли восстановление в RTO. Потому учения делают по расписанию: поднять копию в отдельном окружении, прогнать проверки целостности, замерить время и записать результат.
- Резервные копии лежат на том же сервере/в том же аккаунте, что и прод. Какое правило это нарушает?A)3-2-1: копии офсайт и часть неизменяемойB)Копии должны совпадать с продом по формату один в одинC)Бэкапы надо снимать только вручную, не по расписаниюD)Резервные копии положено хранить дольше самих данных
показать ответ и разбор
+A)3-2-1: копии офсайт и часть неизменяемой// разбор: Правило 3-2-1: три копии данных, на двух разных типах носителей, одна — офсайт (в другом месте/аккаунте/регионе). Бэкапы рядом с продом бесполезны против того, что убивает прод: пожар/потеря региона, компрометация аккаунта, шифровальщик — снесут заодно и копии. Поэтому часть копий держат вне досягаемости и неизменяемыми (immutable/WORM, отдельные права), чтобы их нельзя было затереть вместе с продом.
- Снимок диска работающей базы восстановили — а данные оказались битыми/несогласованными. Почему?A)Снимок диска для баз данных использовать не стоитB)Диск был зашифрован, поэтому данные нечитаемыC)Восстановили не на ту версию движка базыD)Снимок «на ходу» поймал незавершённые записи
показать ответ и разбор
+D)Снимок «на ходу» поймал незавершённые записи// разбор: Снимок диска работающей БД без согласования — crash-consistent: он ловит момент как при внезапном выключении, с незавершёнными транзакциями и данными в кэше, ещё не сброшенными на диск. Отсюда битость. Нужен app-consistent бэкап: заморозить/согласовать состояние (нативный дамп БД, quiesce/flush перед снимком, снапшот через механизм БД, согласованный снапшот файловой системы). Тогда копия соответствует целостному состоянию.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.