Примечания к релизам
В версии 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и отчетность о статусе, особенно для каскадных/резервных кластеров.
-
Управление резервными кластерами:
- Новые команды
patronictldemote-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.
- REST API (
-
Управление слотами репликации:
- Глобальный параметр
member_slots_ttlдля контроля времени хранения слотов отсутствующих членов. - Атрибут
cluster_typeдля указания, где создавать постоянный слот репликации. - Улучшена логика продвижения слотов с учетом
replay_lsnна репликах.
- Глобальный параметр
-
Конфигурация и валидация:
- Опция
--printдля--validate-configвыводит полную разрешенную конфигурацию. - Улучшена валидация GUC — не блокирует установку валидных, но неописанных параметров.
- Новая опция
--ignore-listen-portдля игнорирования занятых портов при валидации.
- Опция
-
Операционная надежность:
- Реплики считаются готовыми только при активной репликации и небольшом лаге.
- Добавлена поддержка
systemdnotifyдля предотвращения состояния гонки с SIGHUP. - Возможность настройки прав доступа к лог-файлам и отключения
wal_log_hints. - Поддержка структурированного логирования в формате JSON.
- Опция для подавления повторяющихся логов
heartbeat.
-
-
Критические исправления:
-
Логика отказоустойчивости и переключения:
- Исправлена обработка бывшего лидера с высоким приоритетом, но тем же LSN.
- Исправлены проверки кворума при
switchoverв режимеsynchronous_mode=quorum. - Исправлены ошибки в машине состояний кворума.
patronictlисключает текущего лидера из списка кандидатов наfailover.
-
Слоты репликации:
- Исправлено сохранение слота бывшего лидера после
failover. - Предотвращено влияние неактивных слотов на
xminи работуVACUUMна новом основном сервере. - Исправлена гонка при продвижении/копировании логических слотов.
- Исправлено создание лишних слотов для узлов с именами в верхнем регистре.
- Исправлено сохранение слота бывшего лидера после
-
Целостность данных и восстановление:
- Гарантируется выполнение
CHECKPOINTпосле промоушна. - Добавлена проверка получения LSN контрольной точки репликами перед снятием блокировки лидера.
- Улучшена совместимость
pg_rewindс PostgreSQL 9.5 и 16+. - Исправлено восстановление
recoveryGUC при присоединении к работающему резервному кластеру.
- Гарантируется выполнение
-
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_receiverwritten_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. Однако в типичных системах Windowslocalhostчасто по умолчанию разрешается в адрес IPv6::1. Для обеспечения совместимости Patroni теперь настраивает PostgreSQL на прослушивание127.0.0.1вместоlocalhostв системах Windows. -
Возврат глобальной конфигурации только при наличии ключа
/configв DCSREST 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обернут вpyopensslPatroni некорректно использовал интерфейсы
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, вызываемогоetcd3Patroni ранее повторял такие запросы на том же узле
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, если атрибутtocpyinstallerотсутствует. -
Исправление проблем с поддержкой PostgreSQL 9.5
- Корректная обработка формата вывода
pg_rewind. - Учет формата
synchronous_standby_names, не поддерживающего спецификацию "num".
- Корректная обработка формата вывода
-
Совместимость с последними изменениями в
urlparseurlparseбольше не принимает несколько хостов с символом[]в 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, в то время как запрос успешно обновил целевой объект. -
Добавлена поддержка опции клиентского подключения
sslnegotiationsslnegotiationбыл добавлен в финальный релиз PostgreSQL 17.
Версия 4.0.2
Выпущено 2024-09-17
Исправления ошибок
-
Обработка исключений при обнаружении файлов валидации конфигурации
Пропускать каталоги, для которых у Patroni недостаточно прав для выполнения операций списка.
-
Гарантия, что неактивные горячие физические слоты репликации не удерживают
xminНачиная с версии 3.2.0 Patroni создает физические слоты репликации для всех участников на репликах и периодически продвигает их с помощью функции
pg_replication_slot_advance(). Однако если по какой-либо причине включенhot_standby_feedbackи первичный узел понижен до реплики, теперь неактивные слоты имеют значениеxminNOT NULL, распространяемое обратно на новый первичный узел. Это приводит к тому, что горизонтxminне продвигается вперед, и vacuum не может очищать мертвые кортежи. С этим исправлением Patroni пересоздает физические слоты репликации, которые должны быть неактивными, но имеют значениеxminNOT 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
Эта версия завершает работу по избавлению от термина "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.
- В Kubernetes Patroni по умолчанию установит метку
-
patronictl failoverбольше не принимает опцию--leader, которая была депрецирована с Patroni 3.2.0. -
Функциональность создания пользователей (раздел конфигурации
bootstrap.users), депрецированная с Patroni 3.2.0, была удалена.
Новые функции
-
Failover на основе кворума
Функция реализует синхронную репликацию на основе кворума (доступна с PostgreSQL v10), которая помогает снизить наихудшие задержки даже во время нормальной работы, так как более высокая задержка репликации на один standby может быть компенсирована другими standby. Patroni реализует дополнительные меры защиты для предотвращения любой видимой пользователем потери данных, выбирая кандидата для failover на основе последней полученной транзакции.
-
Регистрация вторичных узлов Citus в
pg_dist_nodePatroni теперь поддерживает список узлов с
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_tablespacesallow_in_place_tablespacesбыл добавлен не только в PostgreSQL 15, но и бэкпортирован в PostgreSQL 10-14.
Версия 3.3.0
Выпущено 2024-04-04
Все более старые версии Patroni не совместимы с ydiff>=1.3.
Доступны следующие варианты «исправления» проблемы:
- обновить Patroni до последней версии
- установить
ydiff<1.3после установки Patroni - установить модуль
cdiff
Новые функции
-
Добавлена возможность передачи
auth_dataклиенту ZookeeperЭто позволяет указать учетные данные аутентификации для использования при подключении.
-
Добавлен contrib-скрипт для интеграции с
BarmanПредоставлено приложение
patroni_barman, которое позволяет выполнять операцииBarmanудаленно и может использоваться как пользовательский метод бутстрапа/создания реплики или как callbackon_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_rewindPatroni даже когда это было не нужно. -
Исправлена ошибка с пользовательским бутстрапом
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 обновляется.