Бэкапы базы и восстановление на точку
Снял с одной и той же базы две копии. Логическая: 316 миллисекунд, файл 3,3 мегабайта, внутри команды создания таблиц и загрузки данных. Физическая: 51,3 мегабайта, внутри - побайтовые файлы каталога базы. Но самое интересное было со временем: первая физическая копия снялась за 54 525 миллисекунд, а точно такая же с одним дополнительным ключом - за 487. Разница в 112 раз, и данные абсолютно те же.
Стержень: копии бывают двух совсем разных видов, а время их снятия определяется не размером данных, а тем, ждёте ли вы контрольную точку.
// Формулировки: «чем логическая копия отличается от физической?», «как восстановиться на момент до ошибки?», «почему бэкап снимается полчаса?»
Логическая и физическая копия
Логическая копия - это текст: команды создания таблиц и данные для загрузки. Она маленькая (у меня 3,3 мегабайта против 51,3), переносима между версиями базы и разными машинами, позволяет достать одну таблицу. Восстановление - это выполнение всех этих команд заново: у меня 200 тысяч строк восстановились за 324 миллисекунды, а на большой базе это часы, потому что заново строятся все индексы - вспомогательные структуры, по которым база быстро находит нужные строки.
Физическая копия - побайтовая копия каталога базы вместе со служебными файлами. Она больше, привязана к версии и к платформе, зато восстанавливается простым копированием обратно и годится как основа для реплики - второй базы, которая повторяет за основной все изменения. На больших базах разница в скорости восстановления решает всё.
// Отсюда обычная связка: физические копии как основной способ восстановления, логические - как страховка и способ переехать. И главное: копия, которую ни разу не восстанавливали, копией не считается. Проверка восстановления - отдельная регулярная процедура, где замеряют, сколько времени она заняла: именно это число потом обещают бизнесу.
- логическая копия
- текст с командами создания и данными; переносима, но восстанавливается долго
- физическая копия
- побайтовая копия каталога базы; быстро возвращается, но привязана к версии
Почему копия снимается полчаса
Вот та самая находка. Перед физической копией база делает контрольную точку - сбрасывает на диск все изменения, которые пока лежат только в памяти. По умолчанию она РАСТЯГИВАЕТ эту работу во времени, чтобы не мешать обычной нагрузке. Мой замер: копия с настройками по умолчанию снималась 54 525 миллисекунд, из которых почти всё - ожидание растянутой контрольной точки. Та же копия с требованием сделать контрольную точку немедленно - 487 миллисекунд.
Практический вывод: если копия снимается подозрительно долго при небольшой базе, дело почти наверняка не в объёме данных и не в диске. И выбор тут осознанный: немедленная контрольная точка даёт всплеск записи на диск, растянутая бережёт нагрузку, но заставляет ждать.
// Второй расход при копии - журнал предзаписи. Все изменения сначала попадают в него, и уже потом в файлы данных. Замерил его аппетит: вставка 300 тысяч строк в таблицу размером 13 мегабайт продвинула журнал на 41 мегабайт. Журнал растёт быстрее самих данных, и место под него планируют отдельно.
- контрольная точка
- сброс на диск изменений, накопленных в памяти
- WAL
- журнал предзаписи (write-ahead log): изменения пишутся туда раньше, чем в файлы данных
Восстановление на точку во времени
Восстановление на момент до ошибки - это PITR (point-in-time recovery), и собирается оно из двух частей: полной копии и всех записей журнала предзаписи, накопленных после неё. Порядок такой: разворачиваем копию, подкладываем архив журнала, говорим «проигрывай до такого-то момента» и запускаем. База проигрывает изменения по одному и останавливается там, где сказано.
Отсюда два числа, которые надо назвать вслух до аварии, а не после. Сколько данных допустимо потерять - это определяет, как часто архивируется журнал. И сколько времени допустимо восстанавливаться - это определяет, как часто снимать полную копию, потому что чем она старее, тем дольше проигрывать журнал.
// Три вещи, которые ломают эту схему на практике. Архив журнала лежит рядом с базой на том же диске - тогда авария диска уносит и копию, и журнал. Архивация журнала отвалилась месяц назад, и никто не заметил, потому что базу это не тормозит. И самое частое: восстановление ни разу не проверяли, поэтому реальное время неизвестно, а обещанное взято с потолка.
- PITR
- восстановление на точку во времени (point-in-time recovery): копия плюс журнал
- архив журнала
- накопленные записи журнала предзаписи; хранятся ОТДЕЛЬНО от базы
Как отвечать: «Чем логическая копия отличается от физической и что брать?»
Логическая - это текст с командами создания и данными: маленькая, переносится между версиями, позволяет достать одну таблицу, но восстанавливается медленно, потому что заново выполняет все команды и строит индексы. Физическая - побайтовая копия каталога базы: больше, привязана к версии и платформе, зато возвращается копированием обратно и годится как основа для реплики. Я мерил на одной и той же базе: логическая 3,3 мегабайта, физическая 51,3. На проде обычно берут физические как основной способ и логические как страховку и способ переехать. И отдельно назову две вещи, о которых спрашивают следом. Первая: время снятия копии определяется не размером, а контрольной точкой - у меня одна и та же копия снималась 54 секунды с настройками по умолчанию и полсекунды с требованием немедленной контрольной точки. Вторая: копия, которую ни разу не восстанавливали, копией не считается.
Ответ сравнивает по трём осям сразу и заканчивается двумя практическими вещами. Про контрольную точку и про непроверенные копии обычно молчат, а именно они и стреляют.
На чём валятся
- −Держат единственную логическую копию большой базы и обнаруживают, что восстановление занимает часы.
- −Считают, что долгая копия означает медленный диск, и не смотрят на контрольную точку.
- −Кладут архив журнала рядом с базой: авария диска уносит и копию, и журнал.
- −Не следят за архивацией журнала: она отваливается молча, база от этого не тормозит.
- −Ни разу не проверяли восстановление и называют время наугад.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 6, остальные разбираются в тренажёре.
- Чем логический дамп отличается от физической копии базы?A)Логический снимается на живой базе, физический требует остановкиB)Логический хранит только схему, физический — данныеC)Логический — команды и данные, физический — файлыD)Логический подходит для восстановления на точку, физический — нет
показать ответ и разбор
+C)Логический — команды и данные, физический — файлы// разбор: Логический дамп описывает содержимое: его можно развернуть в другой версии базы, перенести отдельную таблицу, прочитать глазами. Расплата — медленное восстановление большой базы: данные заливаются как обычные вставки, индексы строятся заново. Физическая копия — снимок файлов кластера, восстановление быстрое и точное, но привязано к версии и архитектуре, зато с ним работает восстановление на момент времени.
- Что нужно, чтобы восстановить базу на состояние за минуту до ошибочного удаления?A)Ежечасные логические дампы и выбор ближайшего по времениB)Базовая копия плюс непрерывный архив журнала предзаписиC)Реплика с задержкой применения изменений на суткиD)Снимок диска, снятый в момент инцидента
показать ответ и разбор
+B)Базовая копия плюс непрерывный архив журнала предзаписи// разбор: Восстановление на точку складывается из двух частей: физическая базовая копия и все журналы предзаписи после неё, уезжающие в архив непрерывно. При восстановлении база разворачивается из копии и проигрывает журнал до указанного момента — вплоть до секунды перед ошибкой. Отсюда требования: архив на отдельном хранилище, контроль непрерывности сегментов и регулярная проверка, что развернуть это реально получается.
- База выросла до двух терабайт. RTO — час. Почему схема с ночным логическим дампом больше не годится?A)Дамп такого размера не поместится в объектное хранилищеB)Логический дамп снимается только с остановкой нагрузкиC)Инструмент дампа не работает с базами больше терабайтаD)Заливка данных и построение индексов займут часы, а не минуты
показать ответ и разбор
+D)Заливка данных и построение индексов займут часы, а не минуты// разбор: Логическое восстановление — это выполнение вставок и построение индексов заново: на терабайтах счёт идёт на часы, и никакая скорость диска этого не спасает. Под жёсткий RTO берут физическую копию с журналом (разворачивается быстрее) или держат горячий резерв, на который переключаются за минуты. Проверяют не размер копии, а замеренное время восстановления — и сравнивают его с обещанным бизнесу.
- Логический дамп (pg_dump) или физическая копия — по какому признаку выбирают между ними?A)Физический быстрее, логический дамп уже устарелB)Логический дамп годится для восстановления на точку во времениC)Разницы по сути между ними нетD)По задаче: перенос vs быстрый полный recovery
показать ответ и разбор
+D)По задаче: перенос vs быстрый полный recovery// разбор: Логический дамп (pg_dump) — это команды и данные: он переносим между версиями и платформами, позволяет выгрузить часть (схему, отдельные таблицы), удобен для миграций и небольших баз, но восстановление большой БД идёт медленно (перезаливка + пересборка индексов). Физическая копия (файлы кластера, pg_basebackup) восстанавливается быстрее и целиком, но привязана к версии/архитектуре и берёт весь кластер. Выбор — по задаче: перенос/выборка → логический, быстрый полный recovery большой БД → физический.
- База выросла, а ночная полная копия занимает слишком долго и много места. Как сократить окно и объём?A)Полная копия реже + инкрементальные между нимиB)Снимать полную копию просто пореже, без инкрементовC)Сжимать полную копию сильнее тем же расписаниемD)Удалять старые данные, чтобы база не росла
показать ответ и разбор
+A)Полная копия реже + инкрементальные между ними// разбор: Для больших баз переходят со схемы «каждую ночь полный бэкап» на комбинацию: периодическая полная копия + частые инкрементальные/дифференциальные между ними, которые сохраняют только изменения с предыдущей точки. Это резко сокращает окно бэкапа и объём хранения, сохраняя возможность восстановиться на нужный момент (полная + цепочка инкрементов + журнал). Инструменты вроде pgBackRest это поддерживают. Просто «реже полный» без инкрементов увеличивает потенциальную потерю данных.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.