6 МІСЯЦІВ ПЕРЕДОПЛАТОЮ −28% · 1 РІК ПЕРЕДОПЛАТОЮ −50%Порівняти тарифи
PrivacyNodes
ІНЖЕНЕРІЯ РЕЛІЗІВ

Зберігайте сумісність зміни бази даних між релізами

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

Інженерні нотатки PrivacyNodes · Перевірено · 3 хв читання

Складіть карту кожного читача й записувача

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

Наш ілюстративний сервіс звітності зберігає мітку експорту в label і хоче display_name. Це приклад проєктування, а не універсальний виконуваний SQL. Підтвердьте свою точну версію PostgreSQL і фреймворк, перш ніж обирати синтаксис міграції чи налаштування блокувань.

Розширюйте, не виводячи з ужитку старе подання

Спочатку введіть нове поле, яке допускає NULL. Розгорніть випуск сумісності, який записує обидва значення в одній транзакції та читає з потрібним запасним варіантом, поки дані неповні. Визначте, що станеться, коли клієнт редагує запис під час заповнення. Повторна спроба не повинна створювати другий логічний експорт.

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

Технічна довідка: PostgreSQL ALTER TABLE · Явне блокування PostgreSQL.

Зробіть межу сумісності видимою

Ілюстративна матриця сумісності випусків
Схема та записувачіПоведінка читачаРішення про відновлення
Існує лише labelСтарий код підтримуєтьсяСпочатку додайте нове поле
Обидва поля; записувачі лише старого поля залишаютьсяЧитайте label як авторитетне джерелоПоки не перемикайте читачів
Усі записувачі пишуть подвійно; перевірене заповненняНове поле може стати авторитетнимВідкат лише до сумісного коду з подвійним записом
Старе поле видаленоЖоден код не може посилатися на labelСтарий артефакт несумісний

Запасний варіант для відсутніх значень не може виявити не-NULL, але застаріле нове значення. Перш ніж перемикати читачів, виведіть з ужитку записувачів лише старого поля та перевірте узгодженість. Відкат до коду лише старого поля після перемикання читачів може відтворити розбіжність. Натомість залишайте випуск сумісності як переглянутий артефакт відновлення.

Заповнюйте обмеженими, відновлюваними порціями

Знаходьте рядки, які потрібно скопіювати, не перезаписуючи новіше редагування клієнта. Використовуйте стабільне впорядкування, безпечну для конкурентності умову оновлення та порції, обрані під навантаження. Зберігайте поступ, щоб збій можна було відновити від відомої межі. Стежте за обсягом запису, очікуваннями блокувань, затримкою запитів і реплікацією, де вона є.

Жоден розмір порції не є безпечним для кожного застосунку. Під час репетиції порівняйте малу порцію зі звичайним трафіком, а потім оберіть правило паузи чи зупинки. Якщо порція зазнає збою, перегляньте, що зафіксувалося, перш ніж повторювати спробу. Необмежений цикл повторів може перетворити відновлювану розбіжність на постійний тиск на базу даних.

Перевіряйте семантику, а не лише заповнені рядки

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

Зафіксуйте версію схеми, ревізію міграції, критерії завершення та несумісні комбінації. Перегляньте використання запасного варіанта й узгодженість, перш ніж видаляти будь-що. Якщо перевірки не проходять, зупиніть заповнення або просування, збережіть докази та оберіть сумісний артефакт або переглянуте виправлення вперед. Не стверджуйте, що відкат застосунку відтворює зафіксовані дані.

Виведіть старе поле з ужитку в іншому переглянутому випуску

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

Якщо погані дані з'являться після виведення з ужитку, зупиніть подальшу шкоду та скористайтеся планом відновлення або затвердженим виправленням. Не застосовуйте руйнівну міграцію вниз лише тому, що інструментарій показує кнопку відкату. Додайте матрицю до запису релізу і відрепетируйте відновлення даних перед зміною продакшену. Корисний результат — явна межа сумісності, а не гарантія нульового простою.

Офіційні посилання

Документацію переглянуто для цієї статті. Приклади — це планувальні вправи, а не команди, перевірені на сервері PrivacyNodes. Перевірте документацію для вашої встановленої версії.