Переезд на PostgreSQL 18 без даунтайма
Один из наших клиентов держит каталог на ~600 ГБ и не может позволить себе остановку дольше минуты. Классический pg_upgrade требовал бы окна в несколько часов, поэтому мы пошли через логическую репликацию.
План
- Поднимаем новый кластер на 18-й версии и переносим схему через
pg_dump --schema-only. - Создаём публикацию на старом кластере и подписку на новом.
- Ждём, пока догонится начальная синхронизация, и следим за лагом.
- Переключаем приложение через PgBouncer и выравниваем последовательности.
CREATE PUBLICATION catalog_pub FOR ALL TABLES;
-- на новом кластере
CREATE SUBSCRIPTION catalog_sub
CONNECTION 'host=old-db dbname=catalog user=replicator'
PUBLICATION catalog_pub;
Главная ловушка — последовательности: логическая репликация их не переносит. Мы сняли значения скриптом прямо перед переключением и выставили с запасом в 1000.
Итог: 38 секунд read-only режима и ни одного потерянного заказа.