ADG Оставить заявку
Блог Данные и аналитика 4 мин чтения

PostgreSQL 17 GA: incremental backup на Tantor и Postgres Pro, план миграции с PG 15

PostgreSQL 17 вышел в GA точно по расписанию. Публикуем результаты теста incremental backup и план миграции клиентских инсталляций с PG 15 на Tantor SE и Postgres Pro.

Контекст момента

PostgreSQL 17 GA вышел с incremental backup, улучшениями async commit и расширенным MERGE с RETURNING

PostgreSQL 17 вышел в GA 16 сентября - день в день по графику, что для крупного опенсорс-проекта уже само по себе приятный факт. Мы следили за этим релизом с бета-стадии, гоняли incremental backup сначала на тестовой копии 1С, потом на 2-терабайтной аналитической базе клиента в RC1. Сейчас GA - и это момент переходить от тестирования к реальному плану.

Что приехало в GA

Три вещи, которые для нас важны в работе с DWH и аналитикой:

Incremental backup API - нативный инкрементальный бэкап через pg_basebackup --incremental и pg_combinebackup. Мы подробно тестировали его ещё в бете и RC1: на 2 ТБ базе ежедневное backup-окно сократилось примерно в 4 раза по сравнению с полным pg_basebackup. В GA API стабилен, поведение соответствует RC1 - неожиданностей не было.

Async commit improvements - улучшения в работе асинхронного коммита, в первую очередь снижение латентности при высоком параллелизме. На OLTP-нагрузках с большим числом коротких транзакций это проявляется в снижении среднего времени отклика. На аналитических базах эффект менее очевиден, но для смешанных OLAP/OLTP инсталляций - интересно.

MERGE с RETURNING - наконец-то. MERGE появился в PG 15, но без поддержки RETURNING, что делало его неудобным в ряде ETL-сценариев. В PG 17 RETURNING в MERGE поддерживается, и это закрывает один из наиболее раздражавших пробелов. ETL-джобы, которые делали INSERT ... ON CONFLICT ... RETURNING через хитрые конструкции, теперь можно переписать аккуратнее.

Отдельная история: Tantor и Postgres Pro

Большинство наших клиентских инсталляций PostgreSQL - не ванильный upstream, а коммерческие дистрибутивы: Tantor SE или Postgres Pro. Это важный нюанс при планировании миграции: GA upstream не означает автоматически, что сегодня можно обновляться.

Tantor SE 2024 анонсировал поддержку PG 17 - ждём официального билда и документации. Для КИИ-инсталляций это особенно важно: нам нужен не просто работающий бинарник, а версия с актуальным сертификатом ФСТЭК или хотя бы чёткой датой его получения. Обновляться на несертифицированную версию в регулируемом контуре - не вариант.

Postgres Pro аналогично: upstream GA - это сигнал к тому, что коммерческий дистрибутив начинает финальную подготовку своей версии. Обычно отставание составляет несколько недель.

План миграции с PG 15

Наши клиентские инсталляции в большинстве своём сидят на PG 15. PG 17 - это прыжок через два мажорных релиза, что требует внимания.

Мы идём по следующей схеме:

  • Dev и staging окружения - обновляем немедленно, как только появляется билд Tantor SE или Postgres Pro на основе PG 17. Там нет ограничений по сертификации, и это лучший способ поймать несовместимости заранее.
  • Production, некритичные сервисы - плановое окно обновления через 4-6 недель после выхода коммерческого билда. Нужно время на обкатку расширений: pg_partman, pg_cron, timescaledb - всё должно пересобраться и пройти smoke-тесты.
  • Production, КИИ-контуры - только после получения актуального сертификата Tantor SE. Там торопиться незачем: PG 15 получает security-патчи, угрозы нет.

Для самого апгрейда используем pg_upgrade с флагом --link там, где позволяет инфраструктура - это сокращает downtime за счёт hard links вместо полного копирования датафайлов. Перед апгрейдом обязательно полный pg_basebackup - именно сейчас переходим на incremental-цепочку уже на PG 17 после апгрейда.

Про MERGE RETURNING на практике

Небольшое замечание по MERGE ... RETURNING, потому что мы сразу начали смотреть на свои ETL-пайплайны. Синтаксис выглядит ожидаемо:

MERGE INTO target AS t
USING source AS s ON t.id = s.id
WHEN MATCHED THEN
  UPDATE SET val = s.val
WHEN NOT MATCHED THEN
  INSERT (id, val) VALUES (s.id, s.val)
RETURNING t.id, xmax = 0 AS inserted;

xmax = 0 как способ отличить вставленные строки от обновлённых - это старый трюк из PostgreSQL, теперь применимый прямо в MERGE. Для ETL-джобов, которым нужно знать что именно произошло с каждой строкой - удобно. Заменяем несколько паттернов с CTE и ON CONFLICT.

Что дальше

Инкрементальный бэкап тестировали на vanilla PostgreSQL. Нужно проверить поведение pg_combinebackup в Tantor SE - коммерческие дистрибутивы иногда патчат механизмы резервирования, и стоит убедиться что инкрементальная цепочка собирается корректно и в их версии.

Следим за датой выхода коммерческих билдов. Как только Tantor SE опубликует версию на PG 17 с внятным статусом сертификации - начинаем миграцию dev-контуров.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.