EngineerSpock

Postgres 16: интересное и незамеченное

Технический директор Tembo
 
 
 
 
 

Выпуски Postgres

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

Стоит ли мне перейти на Postgres 16?

Если вы заняты разработкой нового приложения, да, я бы рекомендовал вам начать с последней основной версии Postgres. Это гарантирует наличие новейших и лучших функций, а также непрерывное поступление второстепенных выпусков, исправляющих ошибки и повышающих безопасность вашей базы данных.
Если вы обновляете существующую систему, необходимо учитывать больше факторов. Общий совет — всегда обновляйте второстепенные версии, поскольку они содержат исправления безопасности и ошибок, и риск необновления выше.
Однако для основных версий вам придется учитывать компромиссы, поскольку основные версии, как правило, меняют внутренний формат системных таблиц и файлов данных. Это означает, что вы не можете просто использовать предыдущие версии каталога данных — для обновления вам потребуются pg_dump / pg_restore или pg_upgrade. Кроме того, в зависимости от используемых вами функций и выпуска Postgres также может потребоваться вручную внести изменения в ваш код или запросы.
Очевидно, что еще одним важным фактором, если вы пользуетесь услугами поставщика управляемых услуг, является время предоставления им поддержки Postgres 16. В Tembo Cloud мы уже начали работу над поддержкой Postgres 16 и ожидаем, что она будет доступна через несколько недель.

Что самое интересное в Postgres 16?

Postgres 16 предоставляет потрясающие функции, касающиеся всех аспектов работы с базами данных, включая повышение производительности, оптимизацию мониторинга, более высокий уровень безопасность и обработку прав доступа, улучшения репликации, новые серверные функции и команды и многое другое.
Если вас интересует полный список функций, вы можете ознакомиться с ним в подробных заметках о выпуске. Ниже я расскажу об аспектах этого выпуска, которые вызвали у меня наибольший интерес, и мы поговорим о нескольких малоизвестных функциях, которые лежат в основе более интересных функций в Postgres 17.
 
Улучшения логической репликации
Логическая репликация — это функция, которая меня всегда интересовала, поскольку она позволяет расширить возможности Postgres, перемещая данные между разными базами данных Postgres или из Postgres в другие базы данных. Интересны следующие варианты использования: выборочная репликация из одной базы данных в другую, репликация между версиями Postgres, онлайн-миграция и объединение данных из нескольких баз данных.
В этом выпуске, возможно, самая интересная функция — это функция логической репликации, которая позволяет выполнять логическую репликацию с резервных серверов. До появления этой функции вы могли создать слот логической репликации только на первичном сервере, что означало, что добавление большего количества реплик увеличивало бы нагрузку на первичный сервер. В Postgres 16 вторичные серверы также имеют возможность создавать слоты репликации, что позволяет лучше распределять эту нагрузку. Более того, слоты репликации на вторичном сервере сохраняются, даже если резервный сервер становится основным. Это означает, что даже при аварийном переключении это не скажется на пользователях! Подробнее об этой функции можно прочитать в блоге Бертрана.
Короче говоря, теперь вы можете сделать это на резервном Postgres 16:
 
 
 
 
 
Помимо этого, имеется ряд других улучшений производительности логической репликации. Сюда входит более быстрая начальная синхронизация таблицы с использованием двоичного формата, использование индексов двоичного дерева во время логической репликации, когда таблицы не имеют первичного ключа (раньше таблица сканировалась бы последовательно), и параллельное выполнение крупных транзакций (увеличение скорости ~ 25–40 %).
 
Оптимизация мониторинга
Еще одна группа функций, которая меня заинтриговала — это оптимизация мониторинга. Хотя Postgres предоставляет ряд таблиц статистических данных мониторинга, я считаю, что можно сделать больше с точки зрения предоставления пользователям полезной информации. В качестве примера Лукас в своем выступлении на конференции PGCon 2020 указал на несколько занимательных пробелов в мониторинге Postgres.
Возвращаясь к этому выпуску, pg_stat_io должен быть наиболее ценной информацией, добавленной в представления статистических данных в Postgres 16. Это позволяет вам понять реализацию ввода-вывода в Postgres на более детальном уровне с разбивкой по backend_type и context. Это означает, что вы можете более точно рассчитать коэффициент попадания в кэш, игнорируя операции ввода-вывода, выполняемые VACUUM, различать extends и flushes, а также разделять операции с большим массивом данных, решая, какие параметры конфигурации следует настраивать. Мелани говорит об этом и многом другом в своем выступлении, а в этой публикации в блоге рассказывается о том, как можно использовать это в качестве администратора базы данных.
Вот пример статистики, которую можно посмотреть в pg_stat_io:
 
 
 
 
 
Помимо этого, есть и другие улучшения, включая добавление last_seq_scan и last_idx_scan в таблицы pg_stat_*, которые позволяют лучше понять, как использовать индексы, и определять, когда планы запроса могли измениться.
 
Особые упоминания
Как я уже сказал, каждый выпуск содержит множество улучшений, и я не смог бы описать их все в одной заметке в блоге. (А если бы я это сделал, никто бы это не прочитал!) Но я хочу упомянуть еще несколько моментов в Postgres 16, которые я не смогу глубоко рассмотреть, но они тоже интересны.
  • Балансировка нагрузки с несколькими хостами в libpq. Эта функция позволяет распределить нагрузку между репликами чтения Postgres непосредственно в libpq (которая является основной клиентской библиотекой Postgres) без необходимости использования другого балансировщика нагрузки. О том, как эта новая функция реализована и как ее можно использовать, вы можете прочитать в этой заметке в блоге.
  • Производительность. Я не буду повторять то, что написано в заметках о выпуске, но в этом выпуске есть длинный список улучшений производительности. Имеется расширенная поддержка параллельной обработки данных для FULL и OUTER JOIN, а также большего количества агрегатов, более широкое использование инкрементальных сортировок, оптимизация оконных функций и даже повышение производительности до 300 % в COPY.
  • Улучшения VACUUM. Последнее, что я хотел бы упомянуть — это улучшения VACUUM, которые включают повышение производительности при зависании, возможность увеличивать (или уменьшать) коэффициент загрузки совместно используемого буфера в VACUUM и более быструю загрузку конфигураций VACUUM.

Создание задела для многообещающего Postgres 17 (и последующих версий)

Все упомянутые выше функции могут сразу же повысить ценность использования Postgres, но есть и новые функции, которые закладывают основу для создания высокоэффективных функций в будущих выпусках. Я коротко коснусь трех моментов, которые, по моему мнению, заслуживают внимания.
  • Прямой ввод-вывод и асинхронный ввод-вывод в Postgres. В Postgres 16 было зафиксировано несколько конструкционных блоков для реализации прямого и асинхронного ввода-вывода для Postgres. Это включает в себя уменьшение конфликтов относительно блокировки расширения отношения и добавление прямого ввода-вывода в качестве опции только для разработчиков с помощью параметра debug_io_direct. Эта важная, но трудная работа продолжается в течение реализации нескольких выпусков, и Postgres 17, вероятно, станет первым выпуском, в котором пользователи смогут использовать эти функции.
  • Переход к репликации по схеме «ведущий-ведущий». В Postgres 16 была реализована функция логической репликации, которая позволяет избегать циклов репликации, когда транзакция реплицируется из источника в цель и обратно. Postgres 16 позволяет подписчикам обрабатывать только изменения, не имеющие источника, что позволяет предотвратить возникновение подобных циклов. Двунаправленная репликация по схеме «ведущий-ведущий» по-прежнему очень сложна и требует решения множества проблем, но эта функция решает одну из этих важных подзадач.
  • Миграция системы сборки на Meson. Возможно, это ускользнуло от вашего внимания, но в этом выпуске Postgres добавил поддержку новой системы сборки, которая, как ожидается, заменит системы сборки на базе Autoconf и Windows. Зачем, спросите вы? Андрес приводит убедительные аргументы в пользу этого в этом обсуждении, если вам интересно, но среди ряда причин можно перечислить сокращение времени компоновки текущего варианта программы, более простое управление зависимостями и переход к общей системе сборки для Linux и Windows.

Postgres продолжает оставаться на высоте

С каждым новым выпуском Postgres становится все более привлекательным, добавляются замечательные функции, улучшающие взаимодействие с пользователями. Я рекомендую вам ознакомиться с пресс-релизом и заметками о выпуске, чтобы увидеть все, что будет в этом новом выпуске.
А если вы хотите опробовать все возможности Postgres, включая его полнофункциональную экосистему расширений в управляемом сервисе, попробуйте Tembo Cloud.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *