Перейти к основному содержимому

Примечания к релизам

В версии 8.1.0 СУБД Pangolin версия Patroni обновлена до 4.1.0. Краткое описание ключевых изменений в Patroni (с 3.2.0 до 4.1.0):

  • Важные новые возможности:

    • Поддержка версий PostgreSQL:

      • Добавлена поддержка PostgreSQL 17 и 18, включая новые функции и параметры конфигурации.
      • Исправления для совместимости со старыми версиями PostgreSQL (9.5+) для обеспечения согласованного поведения.
    • Синхронная репликация:

      • Введена отказоустойчивость на основе кворума для уменьшения задержек и предотвращения потери данных.
      • Новый тег sync_priority для контроля приоритета узла при выборе синхронной реплики.
      • Улучшена обработка synchronous_standby_names и отчетность о статусе, особенно для каскадных/резервных кластеров.
    • Управление резервными кластерами:

      • Новые команды patronictl demote-cluster и promote-cluster для безопасного перевода кластера между основным и резервным режимом.
      • Обеспечен чистый демоушн при добавлении секции standby_cluster в конфигурацию.
    • Мониторинг и наблюдаемость:

      • REST API (/cluster) и patronictl list теперь показывают LSN приема/воспроизведения и соответствующие лаги для каждой реплики.
      • Информация о состоянии инстанса PostgreSQL в эндпоинте /metrics (формат Prometheus).
      • patronictl list и API /patroni теперь отображают причину ожидания перезагрузки (pending_restart_reason).
      • Параметр restapi.server_tokens для контроля информации в HTTP-заголовке Server.
    • Управление слотами репликации:

      • Глобальный параметр member_slots_ttl для контроля времени хранения слотов отсутствующих членов.
      • Атрибут cluster_type для указания, где создавать постоянный слот репликации.
      • Улучшена логика продвижения слотов с учетом replay_lsn на репликах.
    • Конфигурация и валидация:

      • Опция --print для --validate-config выводит полную разрешенную конфигурацию.
      • Улучшена валидация GUC — не блокирует установку валидных, но неописанных параметров.
      • Новая опция --ignore-listen-port для игнорирования занятых портов при валидации.
    • Операционная надежность:

      • Реплики считаются готовыми только при активной репликации и небольшом лаге.
      • Добавлена поддержка systemd notify для предотвращения состояния гонки с SIGHUP.
      • Возможность настройки прав доступа к лог-файлам и отключения wal_log_hints.
      • Поддержка структурированного логирования в формате JSON.
      • Опция для подавления повторяющихся логов heartbeat.
  • Критические исправления:

    • Логика отказоустойчивости и переключения:

      • Исправлена обработка бывшего лидера с высоким приоритетом, но тем же LSN.
      • Исправлены проверки кворума при switchover в режиме synchronous_mode=quorum.
      • Исправлены ошибки в машине состояний кворума.
      • patronictl исключает текущего лидера из списка кандидатов на failover.
    • Слоты репликации:

      • Исправлено сохранение слота бывшего лидера после failover.
      • Предотвращено влияние неактивных слотов на xmin и работу VACUUM на новом основном сервере.
      • Исправлена гонка при продвижении/копировании логических слотов.
      • Исправлено создание лишних слотов для узлов с именами в верхнем регистре.
    • Целостность данных и восстановление:

      • Гарантируется выполнение CHECKPOINT после промоушна.
      • Добавлена проверка получения LSN контрольной точки репликами перед снятием блокировки лидера.
      • Улучшена совместимость pg_rewind с PostgreSQL 9.5 и 16+.
      • Исправлено восстановление recovery GUC при присоединении к работающему резервному кластеру.
    • DCS (etcd/Consul):

      • Исправлена активация режима failsafe при недоступности etcd.
      • Улучшена устойчивость клиента etcd: игнорирование устаревших узлов, обработка исключений.
      • Для Consul исправлено использование согласованных чтений (consistent reads) для ключей синхронизации.
      • Предотвращены состояния гонки при «оффлайн» демоушне и ошибках DCS при старте.
    • Конфигурация и запуск:

      • Исправлено сохранение устаревших значений в synchronous_standby_names.
      • Исправлена логика флага pending_restart и перезагрузка конфигурации при сбросе параметров.
      • Конфигурационные файлы PostgreSQL теперь обновляются по SIGHUP.
      • Исправлены проблемы совместимости при обработке строк подключения.
      • Длительные операции (например, pg_basebackup) отменяются при завершении работы Patroni.
    • Безопасность и логирование:

      • Отключено логирование pgaudit при создании пользователей для защиты паролей.
      • Логирование команды pg_basebackup понижено до уровня DEBUG.
    • Обновление терминологии (критическое изменение в v4.0.0):

      • Термин master полностью заменен на primary во всем API, DCS, командах и коллбэках. Прямое обновление на v4+ с версий старше 3.1.0 может привести к неожиданному поведению.

В разделах далее приведено подробное описание изменений для каждой, выпущенной ранее версии.

Версия 4.1.0

Выпущено 2025-09-23

Новые функции

  • Добавлена поддержка типа юнита systemd "notify"

    Без типа юнита notify возможно запустить Patroni и немедленно отправить ему сигнал SIGHUP через systemd, фактически завершив его до того, как он успеет настроить обработчики сигналов.

  • Предоставление информации о receive и replay LSN/lag в API и ctl

    Конечная точка REST API Patroni /cluster и команда patronictl list теперь предоставляют информацию о receive LSN, replay LSN, receive lag и replay lag для каждого участника-реплики.

  • Обеспечение чистого понижения до standby-кластера

    Гарантируется, что введение раздела standby_cluster в динамической конфигурации приводит к чистому понижению кластера.

  • Реализация команд patronictl demote-cluster и promote-cluster

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

  • Реализация тега sync_priority

    Этот параметр управляет приоритетом, который должен иметь участник при выборе синхронной реплики, когда synchronous_mode установлен в on.

  • Реализация опции --print для --validate-config

    Вывод локальной конфигурации (включая переопределения конфигурации через переменные окружения) после успешной валидации.

  • Реализация kubernetes.bootstrap_labels

    Эта функция позволяет определить метки, которые будут назначены поду участника при состоянии initializing new cluster, running custom bootstrap script, starting after custom bootstrap или creating replica.

  • Добавлена опция конфигурации для подавления дублирующих логов heartbeat

    Если установлено в true, последовательные идентичные логи heartbeat не будут выводиться.

  • Добавлен необязательный атрибут cluster_type для постоянных слотов репликации

    Это позволяет указать, должен ли конкретный постоянный слот репликации всегда создаваться, или только на первичном или standby-кластере.

  • Сделан настраиваемым HTTP-заголовок Server

    Введен параметр конфигурации restapi.server_tokens, позволяющий ограничить информацию, раскрываемую в HTTP-заголовке Server.

  • Реализация проверок готовности API для репликации на участниках-репликах

    Предыдущая реализация считала реплики готовыми, как только запускался PostgreSQL. С этим изменением под реплики считается готовым только тогда, когда PostgreSQL реплицируется и не слишком сильно отстает от лидера.

Улучшения

  • Снижение уровня логирования сбоя конфигурации watchdog

    Строка лога Could not activate Linux watchdog device теперь отображается на уровне отладки, когда watchdog настроен в режиме required. Ранее она отображалась на уровне info.

  • Использование преимуществ written_lsn и latest_end_lsn из pg_stat_wal_receiver

    written_lsn, фактический LSN записи, теперь имеет приоритет над значением, возвращаемым pg_last_wal_receive_lsn(), которое на самом деле является LSN сброса. latest_end_lsn указывает на сброс WAL на исходном хосте. В случае первичного узла это позволяет лучше рассчитывать отставание replay, поскольку значения, хранящиеся в DCS, обновляются только каждые loop_wait секунд.

  • Избегание взаимодействия со слотами, созданными с опцией failover=true

    Это изменение необходимо для полноценной работы функции логических слотов failover.

  • Добавление состояния PostgreSQL в конечную точку REST API /metrics

    Информация о состоянии экземпляра PostgreSQL теперь доступна в выводе формата Prometheus конечной точки REST API /metrics.


Версия 4.0.7

Выпущено 2025-09-22

Новые функции

  • Добавлена поддержка PostgreSQL 18 RC1

    Правила валидации GUC расширены. Patroni теперь корректно обрабатывает новый фоновый worker ввода-вывода.

Исправления ошибок

  • Исправление потенциальной проблемы с разрешением localhost в IPv6 на Windows

    При настройке listen_addresses в PostgreSQL использование 0.0.0.0 или 127.0.0.1 ограничивает прослушивание только IPv4, исключая IPv6. Однако в типичных системах Windows localhost часто по умолчанию разрешается в адрес IPv6 ::1. Для обеспечения совместимости Patroni теперь настраивает PostgreSQL на прослушивание 127.0.0.1 вместо localhost в системах Windows.

  • Возврат глобальной конфигурации только при наличии ключа /config в DCS

    REST API Patroni возвращал пустую конфигурацию вместо выдачи ошибки, если ключ /config отсутствовал в DCS.

  • Исправление проблемы с неподключением режима failsafe при недоступности etcd

    Patroni не всегда корректно обрабатывал исключения etcd3, что приводило к неподключению режима failsafe.

  • Исправление взаимной блокировки повторного входа обработчика сигналов

    Patroni, работающий в контейнере Docker с PID=1, в некоторых особых случаях испытывал взаимную блокировку после получения SIGCHLD.

  • Пересоздание (постоянного) физического слота, когда он не резервирует WAL

    Постоянные физические слоты репликации, созданные вне области Patroni без резервирования WAL, вызывали ошибку replication slot cannot be advanced. Чтобы избежать этого, Patroni теперь пересоздает такие слоты.

  • Корректная обработка сообщений отмены watch в etcd3

    Когда etcd3 отправляет сообщение об отмене в канал watch, он не закрывает соединение. Это приводит к тому, что Patroni использует устаревшие данные. Patroni теперь решает эту проблему, прерывая цикл чтения чанкового ответа и закрывая соединение на стороне Patroni.

  • Обработка случая, когда сокет HTTPConnection обернут в pyopenssl

    Patroni некорректно использовал интерфейсы pyopenssl, принудительно применяемые в python-etcd.

Улучшения документации

  • Улучшение руководства для кластеров из 2 узлов

    Уточнено поведение во время failover и требования к DCS.


Версия 4.0.6

Выпущено 2025-06-06

Исправления ошибок

  • Исправление ошибки в failover с лидера с более высоким приоритетом

    Гарантируется, что Patroni игнорирует бывшего лидера с более высоким приоритетом, когда он сообщает тот же LSN, что и текущий узел.

  • Исправление прав доступа к файлу postgresql.conf, создаваемому вне PGDATA

    Учет системного значения umask при создании файла postgresql.conf вне каталога PGDATA.

  • Исправление ошибки с переключением при synchronous_mode=quorum

    Не проверять требования кворума, когда указан кандидат.

  • Игнорирование устаревших узлов etcd путем сравнения термина кластера

    Запоминание последнего известного "raft_term" кластера etcd и сравнение его с "raft_term", сообщаемым узлом etcd, при выполнении клиентских запросов.

  • Обновление файлов конфигурации PostgreSQL при SIGHUP

    Ранее Patroni заменял файлы конфигурации PostgreSQL только при обнаружении изменения глобальной или локальной конфигурации.

  • Корректная обработка исключения Unavailable, вызываемого etcd3

    Patroni ранее повторял такие запросы на том же узле etcd3, тогда как переключение на другой узел является лучшей стратегией.

  • Улучшение обработки аренды etcd3

    Гарантия, что Patroni обновляет аренду etcd3 как минимум один раз за цикл HA.

  • Повторная проверка аннотаций при коде статуса 409 при попытке захвата блокировки лидера

    Реализация того же поведения, что было сделано для чтения объекта лидера в Patroni версии 4.0.3.

  • Учет replay_lsn при продвижении слотов

    Не пытаться продвигать слоты на репликах за пределы replay_lsn. Дополнительно продвигать слот до позиции replay_lsn, если он уже прошел confirmed_flush_lsn этого слота на реплике, но реплика еще не воспроизвела фактический LSN, на котором находится этот слот на первичном узле.

  • Гарантия выполнения CHECKPOINT после повышения

    Было возможно, что задача checkpoint не сбрасывалась при понижении, потому что CHECKPOINT еще не завершился. Это приводило к использованию устаревшего result при следующем запуске повышения.

  • Избегание параллельного запуска "офлайн" понижения

    В случае медленного завершения работы может случиться, что следующий цикл heartbeat снова попадет в метод обработки ошибок DCS, что приведет к предупреждению AsyncExecutor is busy, demoting from the main thread и повторному запуску офлайн-понижения.

  • Нормализация значения data_dir перед переименованием каталога данных при сбое инициализации

    Предотвращение поломки процесса переименования после сбоя инициализации из-за завершающего слэша в значении параметра data_dir.

  • Проверка, что synchronous_standby_names содержит ожидаемое значение

    Ранее механизм, реализующий конечный автомат для несинхронной репликации без кворума, не проверял фактическое значение synchronous_standby_names, что приводило к использованию устаревшего значения synchronous_standby_names, когда pg_stat_replication является подмножеством synchronous_standby_names.


Версия 4.0.5

Выпущено 2025-02-20

Улучшения стабильности

  • Совместимость с python-json-logger>=3.1

    Избавление от предупреждений, производимых старым использованием API.

  • Совместимость с Python 3.13

    Запуск тестов против Python 3.13.

  • Совместимость с pyinstaller>=4.4

    Возврат к стандартному iter_modules, если атрибут toc pyinstaller отсутствует.

  • Исправление проблем с поддержкой PostgreSQL 9.5

    • Корректная обработка формата вывода pg_rewind.
    • Учет формата synchronous_standby_names, не поддерживающего спецификацию "num".
  • Совместимость с последними изменениями в urlparse

    urlparse больше не принимает несколько хостов с символом [] в URL. Для смягчения проблемы переключиться на нативные обертки PQconninfoParse() из libpq, когда это возможно, и использовать нашу реализацию только для старых версий psycopg2, скомпилированных с устаревшей версией libpq.

Исправления ошибок

  • Показывать только участников, подлежащих перезапуску, при подтверждении перезапуска

    Ранее при выполнении patronictl restart <clustername> --pending в подтверждении перечислялись все участники, независимо от того, ожидается ли их перезапуск.

  • Отмена долго выполняющихся задач при остановке Patroni и удаление каталога данных при сбое бутстрапа реплики

    Ранее Patroni мог выполнять бутстрап реплики, в то время как pg_basebackup / wal-g / pgBackRest / barman или аналогичные продолжали работать.

  • Корректная обработка имен кластеров с косой чертой в patronictl edit-config

    Замена прямой косой черты в cluster_name на подчеркивание.

  • Избегание слишком раннего удаления физических слотов

    Отложить удаление физических слотов репликации, содержащих xmin, после failover: на новом первичном узле — до повышения этого участника, на репликах — до появления лидера в кластере.

  • Обработка всех исключений, вызываемых subprocess в controldata()

    Patroni некорректно обрабатывал все исключения, которые могли быть вызваны при вызове утилиты pg_controldata.

  • Исправление ошибки со слотом для бывшего лидера, не сохраняемым при failover

    Избегать ложного полагания на наличие участников в DCS, в то время как при failover ключ /member для бывшего лидера истекает точно в то же время.

  • Исправление пары ошибок в конечном автомате кворума

    • При оценке наличия здоровых узлов для гонки лидеров, перед понижением необходимо учитывать требования кворума. Без этого бывший лидер может оказаться в восстановлении в окружении асинхронных узлов.
    • QuorumStateResolver некорректно обрабатывал случай, когда узел-реплика быстро подключался и отключался.

Улучшения

  • Улучшение ошибки при пустом или не-словарном файле конфигурации

    Выбрасывать более явное исключение при валидации, содержит ли файл конфигурации Patroni действительный объект Mapping.


Версия 4.0.4

Выпущено 2024-11-22

Улучшения стабильности

  • Добавлена совместимость с модулем py-consul

    Модуль python-consul не поддерживается уже долгое время, тогда как py-consul является официальной заменой. Обратная совместимость с python-consul сохранена.

  • Добавлена совместимость с модулем prettytable>=3.12.0

    Устранение предупреждений о депрекации.

  • Совместимость с модулем ydiff==1.4.2

    Исправление проблем совместимости для последней версии, ограничение версии в requirements.txt и введение теста совместимости с последней версией.

Исправления ошибок

  • Запуск callback on_role_change после восстановления неудачного первичного узла

    Дополнительно запускать callback on_role_change для первичного узла, который не смог запуститься после сбоя, чтобы повысить шансы выполнения callback, даже если дальнейший запуск в качестве реплики завершится неудачей.

  • Исправление утечки потоков в patronictl list -W

    Кэширование объекта экземпляра DCS для избежания утечки потоков.

  • Гарантия записи в строку подключения только поддерживаемых параметров

    Patroni ранее передавал параметры, введенные в новых версиях, в строку подключения, что приводило к ошибкам подключения.


Версия 4.0.3

Выпущено 2024-10-18

Исправления ошибок

  • Отключение pgaudit при создании пользователей, чтобы не раскрывать пароль

    Patroni логировал пароли superuser, replication и rewind при их создании, когда было включено расширение pgaudit.

  • Исправление проблемы со смешанными настройками: первичный узел на Patroni до v4 и реплики на v4+

    Использовать xlog_location, извлеченный из ключа /members, вместо попытки получить позицию слота участника из ключа /status, если версия Patroni, работающая на лидере, до 4.0.0. Отсутствие этого приводило к накоплению WAL на репликах.

  • Не игнорировать действительные GUC PostgreSQL, не имеющие валидатора Patroni

    Все равно проверять через postgres --describe-config, является ли GUC действительным, даже если у него нет валидатора Patroni.

Улучшения

  • Повторная проверка аннотаций при коде статуса 409 при чтении объекта лидера в K8s

    Избегать дополнительного обновления, если запрос PATCH был отменен Patroni, в то время как запрос успешно обновил целевой объект.

  • Добавлена поддержка опции клиентского подключения sslnegotiation

    sslnegotiation был добавлен в финальный релиз PostgreSQL 17.


Версия 4.0.2

Выпущено 2024-09-17

Исправления ошибок

  • Обработка исключений при обнаружении файлов валидации конфигурации

    Пропускать каталоги, для которых у Patroni недостаточно прав для выполнения операций списка.

  • Гарантия, что неактивные горячие физические слоты репликации не удерживают xmin

    Начиная с версии 3.2.0 Patroni создает физические слоты репликации для всех участников на репликах и периодически продвигает их с помощью функции pg_replication_slot_advance(). Однако если по какой-либо причине включен hot_standby_feedback и первичный узел понижен до реплики, теперь неактивные слоты имеют значение xmin NOT NULL, распространяемое обратно на новый первичный узел. Это приводит к тому, что горизонт xmin не продвигается вперед, и vacuum не может очищать мертвые кортежи. С этим исправлением Patroni пересоздает физические слоты репликации, которые должны быть неактивными, но имеют значение xmin NOT NULL.

  • Исправление необработанного DCSError во время фазы запуска

    Обеспечение подключения к DCS перед попыткой проверки уникальности имени узла.

  • Явное включение GUC CMDLINE_OPTIONS при запросе pg_settings

    Гарантия, что все GUC, переданные postmaster в качестве параметров командной строки, восстанавливаются, когда Patroni присоединяется к работающему standby. Это продолжение ошибки, исправленной в Patroni 3.2.2.

  • Исправление ошибки в логике кавычек synchronous_standby_names

    Согласно документации PostgreSQL, ключевые слова ANY и FIRST должны быть заключены в двойные кавычки, чего Patroni ранее не делал.

  • Исправление проблемы с диапазоном значения keepalive

    Гарантия, что значение опции keepalive, рассчитанное на основе установленного ttl, не превышает максимально допустимое значение для текущей платформы.


Версия 4.0.1

Выпущено 2024-08-30

Исправление ошибки

  • Patroni создавал ненужные слоты репликации для себя

    Это происходило, если name содержал заглавные буквы или специальные символы.


Версия 4.0.0

Выпущено 2024-08-29

warning

Эта версия завершает работу по избавлению от термина "master" в пользу "primary". Это означает несколько критических изменений, пожалуйста, внимательно прочитайте примечания к релизу. Обновление до Patroni 4+ будет работать надежно только если запускается Patroni 3.1.0 или новее. Обновление с более старой версии напрямую до 4+ возможно, но может привести к неожиданному поведению, если первичный узел выйдет из строя, в то время как остальные узлы работают на других версиях Patroni.

Критические изменения

  • Следующие критические изменения были введены при избавлении от неинклюзивного термина "master" в коде Patroni:

    • В Kubernetes Patroni по умолчанию установит метку role в primary. В случае, если требуется сохранить старое поведение и избежать простоя или длительных сложных миграций, можно настроить параметры kubernetes.leader_label_value и kubernetes.standby_leader_label_value в master.
    • Роль Patroni записывается в DCS как primary вместо master.
    • Роль Patroni, возвращаемая REST API Patroni, изменена с master на primary.
    • REST API Patroni больше не принимает role=master в запросах к конечным точкам /switchover, /failover, /restart.
    • Конечная точка REST API /metrics больше не будет сообщать метрику patroni_master.
    • patronictl больше не принимает опцию --master для любой команды. Вместо этого следует использовать опции --leader или --primary.
    • Опция no_master в декларативной конфигурации пользовательских методов создания реплик больше не рассматривается как специальная опция, пожалуйста, используйте вместо нее no_leader.
    • Скрипт patroni_wale_restore больше не принимает опцию --no_master.
    • Скрипт patroni_barman больше не принимает опцию --role=master.
    • Все callback-скрипты выполняются с опцией role=primary, переданной вместо role=master.
  • patronictl failover больше не принимает опцию --leader, которая была депрецирована с Patroni 3.2.0.

  • Функциональность создания пользователей (раздел конфигурации bootstrap.users), депрецированная с Patroni 3.2.0, была удалена.

Новые функции

  • Failover на основе кворума

    Функция реализует синхронную репликацию на основе кворума (доступна с PostgreSQL v10), которая помогает снизить наихудшие задержки даже во время нормальной работы, так как более высокая задержка репликации на один standby может быть компенсирована другими standby. Patroni реализует дополнительные меры защиты для предотвращения любой видимой пользователем потери данных, выбирая кандидата для failover на основе последней полученной транзакции.

  • Регистрация вторичных узлов Citus в pg_dist_node

    Patroni теперь поддерживает список узлов с role==replica, state==running и без тега noloadbalance в pg_dist_node.

  • Настраиваемое хранение слотов репликации участников

    Реализует поддержку глобального параметра конфигурации member_slots_ttl, который управляет, как долго должны храниться слоты репликации участников, когда ключ участника отсутствует.

  • Возможность настройки прав доступа к файлам логов, создаваемым Patroni

    Позволяет устанавливать конкретные права доступа для файлов логов, создаваемых Patroni. Если не указано, права устанавливаются на основе текущего значения umask.

  • Совместимость с PostgreSQL 17 beta3

    Правила валидации GUC расширены. Patroni обрабатывает все новые вспомогательные бэкенды во время завершения работы и устанавливает dbname в primary_conninfo, как это требуется для синхронизации логических слотов репликации.

  • Реализация опции --ignore-listen-port для валидации конфигурации Patroni

    Делает возможным игнорирование уже занятых портов при запуске patroni --validate-config.

Улучшения

  • Сделать wal_log_hints настраиваемым

    Позволяет избежать накладных расходов конфигурации wal_log_hints, включенной в случае, если use_pg_rewind установлен в off.

  • Логирование команды pg_basebackup на уровне DEBUG

    Облегчает отладку неудачной инициализации.

Исправления ошибок

  • Продвижение постоянных слотов для каскадных узлов во время failsafe

    Гарантируется, что слоты для каскадных реплик корректно продвигаются на первичном узле при активации режима failsafe. Это делается путем расширения ответа реплик на запрос REST API POST /failsafe их xlog_location.

  • Не позволять текущему узлу быть выбранным как синхронный

    Может быть "что-то", потоково передающее данные с текущего первичного узла с application_name, совпадающим с именем текущего первичного узла. Patroni некорректно обрабатывал эту ситуацию, что могло привести к объявлению первичного узла синхронным и, как следствие, блокировке переключений.

  • Игнорировать restapi.allowlist_include_members для POST /failsafe

  • Улучшение валидации GUC

    Из-за дополнительной валидации через запуск команды postgres --describe-config ранее было невозможно задать через конфигурацию Patroni GUC, не перечисленные там. Это ограничение теперь снято.

  • Добавление строки с localhost в файл .pgpass при обнаружении unix-сокетов

    Patroni добавит дополнительную строку в файл .pgpass, если указанный параметр host начинается с символа /. Это позволяет покрыть крайний случай, когда host совпадает с путем к каталогу сокетов по умолчанию.

  • Исправление проблем с логированием

    Определен корректный URL запроса в логах обработки failsafe и исправлен порядок временных меток в логе проверки postmaster.

Версия 3.3.2

Выпущено 2024-07-11

Исправления ошибок

  • Исправление режима обычной синхронной репликации Postgres

    С момента внедрения synchronous_mode в Patroni, обычная синхронная репликация Postgres не работала. С этим исправлением Patroni устанавливает значение synchronous_standby_names так, как настроено пользователем, если это так, когда synchronous_mode отключен.

  • Обработка инвалидации логических слотов на standby

    Начиная с PG16, логические слоты репликации на standby могут быть инвалидированы из-за горизонта: отныне Patroni принудительно копирует (то есть пересоздает) инвалидированные слоты.

  • Исправление состояния гонки с продвижением и копированием логического слота

    Из-за этой ошибки была возможна ситуация, когда инвалидированный логический слот репликации копировался с перезапуском PostgreSQL более одного раза.


Версия 3.3.1

Выпущено 2024-06-17

Улучшения стабильности

  • Совместимость с Python 3.12

    Обработка нового атрибута, добавленного в logging.LogRecord.

Исправления ошибок

  • Исправление бесконечной рекурсии в обработке тегов replicatefrom

    В рамках этого исправления также улучшена проверка is_physical_slot() и скорректирована документация.

  • Исправление неверного сообщения о роли в standby-кластерах

    synchronous_standby_names и синхронная репликация работают только на реальном первичном узле и в случае каскадной репликации просто игнорируются Postgres. До этого исправления patronictl list и GET /cluster ложно сообщали о некоторых узлах как о синхронных.

  • Исправление доступности GUC allow_in_place_tablespaces

    allow_in_place_tablespaces был добавлен не только в PostgreSQL 15, но и бэкпортирован в PostgreSQL 10-14.


Версия 3.3.0

Выпущено 2024-04-04

warning

Все более старые версии Patroni не совместимы с ydiff>=1.3.

Доступны следующие варианты «исправления» проблемы:

  1. обновить Patroni до последней версии
  2. установить ydiff<1.3 после установки Patroni
  3. установить модуль cdiff

Новые функции

  • Добавлена возможность передачи auth_data клиенту Zookeeper

    Это позволяет указать учетные данные аутентификации для использования при подключении.

  • Добавлен contrib-скрипт для интеграции с Barman

    Предоставлено приложение patroni_barman, которое позволяет выполнять операции Barman удаленно и может использоваться как пользовательский метод бутстрапа/создания реплики или как callback on_role_change.

  • Поддержка формата логов JSON

    Помимо plain (по умолчанию), Patroni теперь также поддерживает формат логов json. Требуется установка библиотеки python-json-logger>=2.0.2.

  • Отображение информации pending_restart_reason

    Предоставлена расширенная информация о параметрах PostgreSQL, которые вызвали установку флага pending_restart. И patronictl list, и конечная точка REST API /patroni теперь показывают имена параметров и их «diff» как pending_restart_reason.

  • Реализация тега nostream

    Если тег nostream установлен в true, узел не будет использовать протокол репликации для потоковой передачи WAL, а вместо этого будет полагаться на восстановление из архива (если настроен restore_command). Это также отключает копирование и синхронизацию постоянных логических слотов репликации на самом узле и всех его каскадных репликах.

Улучшения

  • Реализация валидации раздела log

    До сих пор валидатор не проверял корректность предоставленной конфигурации логирования.

  • Улучшение логирования для изменения параметров PostgreSQL

    Преобразование старых значений в человекочитаемый формат и логирование информации о несоответствии pg_controldata и глобальной конфигурации Patroni.

Исправления ошибок

  • Корректная фильтрация недопустимых опций pg_basebackup

    Из-за ошибки Patroni некорректно фильтровал недопустимые опции, настроенные для метода бутстрапа реплик basebackup, при предоставлении в формате - setting: value.

  • Исправление обработки ошибки аутентификации etcd3

    Всегда повторять один раз при ошибке аутентификации etcd3, если аутентификация не была выполнена непосредственно перед выполнением запроса. Также не перезапускать наблюдателей при повторной аутентификации.

  • Улучшение логики обнаружения файлов валидатора

    Использовать библиотеку importlib для обнаружения файлов с доступными параметрами конфигурации, когда это возможно (для Python 3.9+). Эта реализация более стабильна и не ломает дистрибутивы Patroni на основе архивов zip.

  • Использовать target_session_attrs только когда в разделе standby_cluster указано несколько хостов

    target_session_attrs=read-write теперь добавляется в primary_conninfo на узле-лидере standby только когда раздел standby_cluster.host содержит несколько хостов, разделенных запятыми.

  • Добавлен код совместимости для библиотеки ydiff версии 1.3+

    Patroni полагается на некоторый API из ydiff, который не является публичным, поскольку предполагается, что это просто терминальный инструмент, а не Python-модуль. К сожалению, изменение API в 1.3 сломало старые версии Patroni.


Версия 3.2.2

Выпущено 2024-01-17

Исправления ошибок

  • Не позволять реплике восстанавливать ключ initialize при очистке DCS

    Это происходило в методе, где Patroni должен был взять на себя управление автономным кластером PG.

  • Использовать согласованное чтение при получении только что обновленного ключа sync из Consul

    Consul не предоставляет никакого интерфейса для немедленного получения ModifyIndex для ключа, который был только что обновлен, поэтому необходимо выполнить явную операцию чтения. Поскольку устаревшие чтения разрешены по умолчанию, иногда возвращалась устаревшая версия ключа.

  • Перезагрузить конфигурацию Postgres, если параметр, требующий перезапуска, был сброшен к исходному значению

    Ранее Patroni не обновлял конфигурацию, а только сбрасывал pending_restart.

  • Исправление ошибочной инвертированной логики сообщения запроса подтверждения при выполнении failover на асинхронного кандидата в синхронном режиме

    Проблема существовала только в patronictl.

  • Исключить лидера из кандидатов на failover в patronictl

    Если кластер исправен, failover на существующего лидера является операцией без эффекта.

  • Создание базы данных Citus и расширения идемпотентно

    Это позволит создавать их в скрипте post_bootstrap, если есть необходимость добавить дополнительные зависимости в базу данных Citus.

  • Не фильтровать противоречивый тег nofailover

    Конфигурация {nofailover: false, failover_priority: 0}, установленная на узле, не позволяла ему участвовать в гонке, хотя должен был, потому что тег nofailover должен иметь приоритет.

  • Исправлена проблема заморозки PyInstaller

    freeze_support() вызывался после argparse, и в результате Patroni не мог запустить Postgres.

  • Исправлена ошибка в генераторе конфигурации для patronictl и конфигурации Citus

    Это предотвращало запись параметров конфигурации patronictl и Citus, установленных через переменные окружения, в сгенерированную конфигурацию.

  • Восстановление GUC восстановления и некоторых управляемых Patroni параметров при присоединении к работающему standby

    Patroni не удавалось перезапустить Postgres v12 и новее с ошибкой об отсутствии port в одной из внутренних структур.

  • Исправления вокруг флага pending_restart

    Не раскрывать pending_restart при пользовательском бутстрапе с recovery_target_action = promote или когда кто-то изменил hot_standby или wal_log_hints, например, с помощью ALTER SYSTEM.


Версия 3.2.1

Выпущено 2023-11-30

Исправления ошибок

  • Ограничение принимаемых значений для аргумента --format в patronictl

    Ранее он принимал любую произвольную строку и не выводил ничего, если значение не было распознано.

  • Проверка, что узлы-реплики получили LSN контрольной точки при завершении работы перед освобождением ключа лидера

    Ранее в некоторых случаях использовался LSN записи SWITCH, за которой следует CHECKPOINT (если включен режим архивирования). В результате бывший первичный узел иногда должен был выполнять pg_rewind, но потери данных при этом не происходило.

  • Выполнение реального HTTP-запроса при выполнении проверки уникальности имени узла

    При запуске Patroni в контейнерах возможно, что трафик маршрутизируется через docker-proxy, который прослушивает порт и принимает входящие соединения. Это вызывало ложные срабатывания.

  • Исправлена поддержка Citus с etcd v2

    Patroni не удавалось развернуть новый кластер Citus с etcd v2.

  • Исправлено поведение pg_rewind с Postgres v16+

    Формат сообщения об ошибке pg_waldump изменился в v16, что приводило к вызову pg_rewind Patroni даже когда это было не нужно.

  • Исправлена ошибка с пользовательским бутстрапом

    Patroni ложно применял аргумент --command, который является самой командой бутстрапа.

  • Исправлена проблема с конечными точками проверки здоровья REST API

    Были шансы, что после перезапуска Postgres мог вернуть состояние unknown для Postgres, потому что соединения не были корректно закрыты.

  • Кэширование результатов вывода postgres --describe-config

    Они используются для определения, какие GUC доступны для валидации конфигурации PostgreSQL; этот список не должен меняться в течение времени работы Patroni.


Версия 3.2.0

Выпущено 2023-10-25

Уведомление о депрекации

  • Поддержка bootstrap.users будет удалена в версии 4.0.0. Если требуется создать пользователей после развертывания нового кластера, пожалуйста, используйте для этого хук bootstrap.post_bootstrap.

Критические изменения

  • Принудительное применение правила loop_wait + 2*retry_timeout <= ttl и жесткое кодирование минимально возможных значений

    Минимальные значения: loop_wait=2, retry_timeout=3, ttl=20. В случае, если значения меньше или нарушают правило, они корректируются, и предупреждение записывается в логи Patroni.

Новые функции

  • Приоритет failover

    С помощью tags.failover_priority теперь можно сделать узел более предпочтительным во время гонки лидеров. Подробнее в документации (смотрите теги).

  • Реализация patroni --generate-config [--dsn DSN] и patroni --generate-sample-config

    Это позволяет сгенерировать файл конфигурации для работающего кластера PostgreSQL или пример файла конфигурации для нового кластера Patroni.

  • Использование выделенного подключения к Postgres для REST API Patroni

    Это помогает избежать блокировки основного цикла heartbeat, если система находится под нагрузкой.

  • Обогащение некоторых конечных точек name узла

    Для конечной точки мониторинга name добавляется рядом с scope, а для конечной точки метрик name добавляется в теги.

  • Обеспечение строгого различия между failover/switchover

    Быть более точным в сообщениях лога и разрешать failover на асинхронный узел в исправном синхронном кластере.

  • Заставить постоянные физические слоты репликации вести себя аналогично постоянным логическим слотам

    Создавать постоянные физические слоты репликации на всех узлах, которым разрешено стать лидером, и использовать функцию pg_replication_slot_advance() для продвижения restart_lsn для слотов на узлах standby.

  • Добавлена возможность указания пространства имен через аргумент --dcs в patronictl

    Это может быть удобно, если patronictl используется без файла конфигурации.

  • Добавлена поддержка дополнительных параметров в конфигурации пользовательского бутстрапа

    Ранее можно было добавить только пользовательские аргументы к command, а теперь можно перечислить их как отображение.

Улучшения

  • Установка значения GUC citus.local_hostname в то же значение, которое используется Patroni для подключения к Postgres

    Есть случаи, когда Citus хочет иметь подключение к локальному Postgres. По умолчанию он использует localhost, который не всегда доступен.

Исправления ошибок

  • Игнорировать настройку synchronous_mode в standby-кластере

    Postgres не поддерживает каскадную синхронную репликацию, и неигнорирование synchronous_mode ломало переключение в standby-кластере.

  • Обработка SIGCHLD для callback on_reload

    Отсутствие этого приводит к процессу-зомби, который уничтожается только при выполнении следующего on_reload.

  • Обработка ошибки AuthOldRevision при работе с etcd v3

    Ошибка возникает, если etcd настроен на использование JWT и когда база данных пользователей в etcd обновляется.