6 МЕСЯЦЕВ ПРЕДОПЛАТА −28% · 1 ГОД ПРЕДОПЛАТА −50%Сравнить тарифы
PrivacyNodes
РЕЛИЗНАЯ ИНЖЕНЕРИЯ

Поддерживайте совместимость изменения базы данных между релизами

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

Инженерные заметки PrivacyNodes · Проверено · 3 мин чтения

Составьте карту всех читателей и писателей

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

Наш иллюстративный сервис отчётности хранит метку экспорта в label и хочет display_name. Это пример проектирования, а не универсальный исполняемый SQL. Уточните вашу точную версию PostgreSQL и фреймворк, прежде чем выбирать синтаксис миграции или настройки блокировок.

Расширяйте, не выводя из эксплуатации старое представление

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

PostgreSQL ALTER TABLE операции захватывают блокировки, уровень которых зависит от подкоманды. Небольшое изменение может ждать за длительной транзакцией, а затем препятствовать другой работе. Изучите конкретную операцию и наблюдайте ожидания во время репетиции; аддитивность не означает отсутствие блокировок.

Техническая справка: PostgreSQL ALTER TABLE · Явные блокировки в PostgreSQL.

Сделайте границу совместимости видимой

Иллюстративная матрица совместимости релизов
Схема и писателиПоведение читателяРешение о восстановлении
Существует только labelСтарый код поддерживаетсяСначала добавьте новое поле
Оба поля; писатели, работающие только со старым, остаютсяЧитайте label как авторитетный источникПока не переключайте читателей
Все писатели выполняют двойную запись; проверенное обратное заполнениеНовое поле может стать авторитетнымОткат только к совместимому коду с двойной записью
Старое поле удаленоНикакой код не должен ссылаться на labelСтарый артефакт несовместим

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

Выполняйте обратное заполнение ограниченными, перезапускаемыми порциями

Найдите строки, которые нужно скопировать, не перезаписывая более новое изменение клиента. Используйте стабильный порядок, условие обновления, безопасное при конкурентном доступе, и пакеты, подобранные под рабочую нагрузку. Сохраняйте прогресс, чтобы сбой можно было возобновить с известной границы. Отслеживайте объём записи, ожидания блокировок, задержку запросов и репликацию, если она есть.

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

Проверяйте семантику, а не только заполненные строки

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

Зафиксируйте версию схемы, ревизию миграции, критерии завершения и несовместимые комбинации. Изучите использование резервного варианта и согласованность, прежде чем удалять что-либо из них. Если проверки не проходят, остановите обратное заполнение или продвижение, сохраните доказательства и выберите совместимый артефакт или проверенное исправление вперёд. Не утверждайте, что откат приложения восстанавливает зафиксированные данные.

Выведите из эксплуатации старое поле в другом проверенном релизе

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

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

Официальные ссылки

Документация была проверена для этой статьи. Примеры — это планировочные упражнения, а не команды, протестированные на сервере PrivacyNodes. Проверьте документацию для вашей установленной версии.