**Этап 0: Подготовка и планирование (за недели до события).**
- **Тщательное изучение changelog целевой версии.** Особое внимание — на изменения, ломающие обратную совместимость (breaking changes) в SQL, типах данных, настройках конфигурации. Проверьте используемые расширения (PostGIS, TimescaleDB и др.) — их совместимые версии должны быть готовы.
- **Тестирование, тестирование и еще раз тестирование.** Разверните точную копию продакшн-окружения (желательно, с тем же объемом данных) в staging. Воспроизведите нагрузку с помощью утилит вроде pgbench или реальных дампов запросов из pg_stat_statements. Проведите полный цикл обновления на staging, включая откат.
- **Определите окно для переключения (maintenance window).** Даже при использовании zero-downtime методов короткий период, когда старая и новая версии синхронизируются перед финальным переключением, может потребовать блокировок. Сообщите о нем заинтересованным сторонам.
- **Обеспечьте полное резервное копирование.** Сделайте физический бэкап с помощью pg_basebackup. Это ваш последний рубеж обороны.
Это ключевая технология. В отличие от физической репликации (streaming replication), логическая позволяет реплицировать данные между разными major-версиями PostgreSQL.
- На исходном (старом) сервере (Publisher) настройте `wal_level = logical` в `postgresql.conf` и перезагрузите сервер.
- Создайте публикацию для всех таблиц или выбранных: `CREATE PUBLICATION my_publication FOR ALL TABLES;`.
- На новом сервере (Subscriber) установите целевую версию PostgreSQL. Инициализируйте кластер и настройте его конфигурацию (shared_buffers, work_mem и т.д.) в соответствии с новой версией и вашим железом.
- **Восстановите схему на новом сервере.** Используйте `pg_dump --schema-only` со старого сервера. ВАЖНО: Не переносите данные дампом. Схема должна быть идентичной, включая индексы, последовательности (sequences), но данные придут через репликацию.
- На новом сервере создайте подписку: `CREATE SUBSCRIPTION my_subscription CONNECTION 'host=old_server user=repuser dbname=mydb' PUBLICATION my_publication;`. PostgreSQL начнет процесс начальной копирования данных (initial data sync) — это может занять много времени на больших БД, но сервис при этом продолжает работать.
- Мониторьте отставание репликации: `SELECT * FROM pg_stat_subscription;`. Убедитесь, что `pg_stat_replication.sync_state` на основном сервере показывает `async` (для логической репликации).
- Проверяйте целостность: сравните количество записей в ключевых таблицах, выполните выборочные проверки контрольных сумм.
- **Самый ответственный шаг — синхронизация последовательностей (sequences).** Логическая репликация не реплицирует значения последовательностей. Перед переключением необходимо вручную выровнять их на новом сервере, используя последние значения со старого. Сделайте это в момент минимальной нагрузки, возможно, потребуется кратковременная блокировка записей на отдельных таблицах.
- Перенаправьте часть read-only нагрузки (отчеты, аналитика) на новый сервер, чтобы проверить его в боевых условиях.
- Остановите все приложения, зависящие от БД (или переведите в режим только для чтения, если архитектура позволяет). Это и есть то самое минимальное окно простоя.
- На основном сервере: завершите все транзакции, сделайте все таблицы read-only: `ALTER DATABASE mydb SET default_transaction_read_only = ON;` (или на уровне пользователя).
- Дождитесь, пока репликация догонит (лаг станет нулевым). Удалите подписку на новом сервере: `DROP SUBSCRIPTION my_subscription;`.
- **Перенастройте последовательности на новом сервере**, установив значения с запасом, используя `SELECT setval('seq_name', nextval('seq_name'::regclass) + 1000);` (значение запаса зависит от нагрузки).
- Смените IP-адреса/имена хостов в конфигурации вашего приложения или на уровне балансировщика (HAProxy, PgBouncer), чтобы они указывали на новый сервер. Перезапустите приложения.
- Тщательно протестируйте основные функции приложения.
- Мониторьте производительность нового сервера: запросы, индексы, настройки авто-вакуума.
- Старый сервер не удаляйте сразу. Держите его в горячем резерве на случай необходимости быстрого отката (просто поменяв конфигурацию обратно).
- Обновите мониторинг, бэкап-скрипты и документацию в соответствии с новой версией.
Комментарии (9)