Перейти к содержанию

Примечания к выпускам

Хронологические примечания к выпускам Patroni и история изменений.


Версия 4.1.5

Выпущено 2026-08-12

Улучшения совместимости

  • Совместимость с PostgreSQL 14.24, 15.19, 16.15, 17.11, 18.6 (Alexander Kukushkin)

    Добавьте новый output_plugin_libraries GUC, который ограничивает вывод плагинов логического декодирования.

Улучшения

  • Записывать REST предупреждения о сбросе API соединений в DEBUG вместо WARNING (Kyle McLaren)

    Убедитесь, что распространенные варианты “клиент неожиданно завершил операцию записи” не влияют на обработку реальных (не связанных с соединением) ошибок.

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

  • Исправить выравнивание при проверке thread_stack_size (Sundong Kim)

    Исправьте значение aligned из 65535 в 65536 в записи схемы thread_stack_size. Ранее, patroni --validate-config отклонял практически каждое реалистичное значение, включая значение по умолчанию, применяемое самим демоном 524288.

  • Предоставьте возможность проверки synchronous_mode для принятия 'quorum' и строковых значений, похожих на булевы (Eray Araz)

    patroni --validate-config ранее отклонял значения synchronous_mode, такие как quorum, и строковые представления булевых значений, принятые во время выполнения.

Версия 4.1.4

Выпущено 2026-07-07

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

  • Проверьте переменную окружения NOTIFY_SOCKET перед использованием пакета systemd (Polina Bungina)

    Попытайтесь импортировать и использовать пакет только тогда, когда переменная окружения NOTIFY_SOCKET установлена, чтобы избежать исключения FileNotFoundError: [Errno 2] No such file or directory.

  • Объединить pg_replication_slots запрос (Polina Bungina)

    Неправильная обработка значений failover и synced приводила к возникновению исключений KeyError при удалении неверных слотов логической репликации.

  • Рассмотрите параметры аутентификации, специфичные для версии, при создании конфигурации (Polina Bungina)

    В команде patroni --generate-config, удалите все не относящиеся к делу параметры аутентификации, которые были случайно получены из окружения, на основе версии, полученной от соединения с PostgreSQL.

  • Обрабатывать pg_rewind во время запуска экземпляра PostgreSQL в качестве резервного сервера (Alexander Kukushkin)

    Использовать информацию pg_controldata в случае, когда экземпляр PostgreSQL работает, но еще не принимает соединения.

  • Исправить тип метрики Prometheus для patroni_postgres_timeline (Huseyin Demir)

    Объявить метрику patroni_postgres_timeline как gauge вместо counter, поскольку она не всегда возрастает монотонно (e.g., может сбрасываться в 0, если экземпляр PostgreSQL не запущен).

  • Не останавливайте сторожевой таймер, пока все клиентские бэкенды не будут полностью остановлены (Alexander Kukushkin)

    Ранее, если primary_stop_timeout был меньше минимального тайм-аута сторожевого таймера, и тайм-аут остановки фактически истек, Patroni отключал сторожевой таймер до того, как все клиентские бэкенды завершились.

  • Обработка ошибки превышения времени ожидания для запроса мониторинга (Alexander Kukushkin)

    В случае возникновения ошибки превышения таймаута, используйте кэшированную роль в качестве резервного варианта, чтобы избежать понижения первичного сервера. Кроме того, принудительно установите pg_stat_statements.track в none для запроса мониторинга, чтобы избежать дорогостоящих операций сборки мусора pg_stat_statements.

  • Удаление слотов репликации, управляемых Patroni с wal_status=lost (Alexander Kukushkin)

    Слоты репликации с wal_status=lost больше не используются. Patroni теперь удаляет такие слоты и создает их заново при необходимости.

  • Исправить представление роли в ошибке проверки участника в patronictl (Polina Bungina)

    Обеспечивает использование правильного строкового представления в сообщении об исключении, предотвращая форматирование ошибок в соответствии с Error: No CtlPostgresqlRole.REPLICA among provided members.

Версия 4.1.3

Выпущено 2026-05-05

Повышение стабильности

  • Правильно обрабатывать ошибки etcd с неправильной меткой (Ants Aasma)

    Текущие версии etcd выдают ошибку Unknown, когда лидер etcd теряется во время обновления аренды. Patroni теперь переопределяет отчётный код ошибки на Unavailable.

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

  • Используйте двоичную версию, когда файл PG_VERSION отсутствует (Polina Bungina)

    В некоторых случаях, например, при использовании пользовательской начальной инициализации, файл PG_VERSION может отсутствовать в каталоге данных. В этом случае Patroni считал версию равной 0.0, что приводило к проблемам с логикой, специфичной для определенной версии. С этой поправкой Patroni будет пытаться получить версию из бинарного файла в таких случаях.

  • Переработать инициализацию логгера, чтобы избежать пропущенных ранних сообщений (Alexander Kukushkin)

    Создайте PatroniLogger до загрузки Config для захвата ранних сообщений в логах.

  • Включите MONOTONIC_USEC в уведомление systemd RELOADING=1 (Alexander Kukushkin)

    systemd 257+ требует MONOTONIC_USEC вместе с RELOADING=1 для Type=notify-reload служб. Без этого systemctl reload висит бесконечно.

Улучшения

  • Пропускать восстановление после сбоя для одного пользователя, когда backup_label присутствует (Vadim Ponomarev)

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

  • Предупреждать при работе под systemd без пакета python-systemd (Alexander Kukushkin)

    Вместо ведения журнала “интеграция с systemd не поддерживается” при запуске, проверьте NOTIFY_SOCKET и выдавайте предупреждение только тогда, когда система фактически работает под systemd без установленного пакета python-systemd.

Версия 4.1.2

Выпущено 2026-04-21

Улучшения поддержки systemd

  • Добавить поддержку типа системного юнита notify-reload (Ronan Dunklau)

    Позволяет systemctl reload дождаться, пока Patroni фактически обработает перезагрузку конфигурации, отправляя уведомления RELOADING=1 и READY=1 в systemd.

  • Отправить уведомление STOPPING=1 в systemd при завершении работы (Alexander Kukushkin)

    Patroni теперь правильно уведомляет systemd о завершении работы, следуя протоколу systemd notify.

  • Не позволяйте PostgreSQL отправлять уведомления systemd (Alexander Kukushkin)

    Удалите NotifyAccess=all из примера файла юнита systemd. Фильтруйте NOTIFY_SOCKET из переменных окружения при запуске PostgreSQL, чтобы оно не отправляло READY=1 или STOPPING=1 в systemd. При переходе к PostgreSQL, который был запущен до Patroni и уже имеет NOTIFY_SOCKET, повторно установите READY=1 при завершении PostgreSQL, чтобы нейтрализовать его STOPPING=1.

Версия 4.1.1

Выпущено 2026-04-08

Повышение стабильности

  • Совместимость с изменениями в многопоточности в Python 3.11+ (Alexander Kukushkin)

    Избегайте запуска/остановки потоков во время выполнения. Используйте пулы потоков для REST API и для выполнения асинхронных задач. Предусмотрите возможность настройки глобальных thread_pool_size и restapi.thread_pool_size.

  • Совместимость с python 3.14 (Alexander Kukushkin)

    Выполните тесты против python 3.14 и устраните проблемы совместимости.

  • Совместимость с исправлениями безопасности etcd в v3.6.9, v3.5.28 и v3.4.42 (Alexander Kukushkin)

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

  • Улучшения обработки ошибок в Etcd3 (Alexander Kukushkin)

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

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

  • Повторить обновление лидера при временной ошибке в Kubernetes 403 (Sophia Ruan, Alexander Kukushkin)

    Когда узел Kubernetes API временно возвращается 403 Permission Denied (например, во время временных проблем RBAC), Patroni теперь проверяет, по-прежнему ли текущий узел является лидером, и повторяет попытку обновления лидера в течение retry_timeout, а не немедленно понижает его.

  • Устранить проблему с переименованием узла-лидера в режиме синхронизации и паузы (Alexander Kukushkin)

    /sync ключ не был обновлён после переименования узла-лидера с перезапуском Patroni в режиме паузы (без перезапуска Postgres). Это препятствовало продвижению Patroni после следующего перезапуска без паузы.

  • Запускать проверку pg_rewind при увеличении временной шкалы первичным сервером (Alexander Kukushkin)

    Такое увеличение временной шкалы может произойти в результате восстановления после сбоя в однопользовательском режиме, а также после повышения до роли лидера при одновременном изолировании других реплик DCS. В этом случае реплики не запустили машину состояний pg_rewind, поскольку лидер и, следовательно, primary_conninfo не изменились.

  • Указывайте только пароль суперпользователя во время initdb начальной инициализации, если он не пуст (Michael Banck)

    Указание пустого пароля в процессе initdb начальной инициализации вызывало проблемы.

  • Исправить ошибку, связанную с failover_priority, используя synchronous_mode=on (Alexander Kukushkin)

    значения tag.failover_priority игнорировались, когда synchronous_node_count > 1.

  • Исправить ошибку с сравнением пароля primary_conninfo (Alexander Kukushkin)

    Начиная с PostgreSQL 10, Patroni использует passfile в primary_conninfo и не обновляет passfile после обновления пароля репликации в конфигурации YAML-файла при перезагрузке.

  • Не перезапускайте реплику с меткой nofailover в режиме паузы (Alexander Kukushkin)

    Patroni ранее запускал PostgreSQL реплику в режиме паузы вручную, когда для нее был установлен тег nofailover со значением true.

  • Исправить check_recovery_conf(), когда PostgreSQL находится в начальном состоянии (Alexander Kukushkin)

    Для PostgreSQL v12 и более новых, pg_settings невозможно запросить, пока сервер еще не запускается и не начинает принимать соединения. Отсутствующие параметры восстановления теперь добавляются в внутреннее состояние при записи postgresql.conf. Кроме того, восстановите проверку Postgresql.is_starting() в Ha.is_healthiest_node().

  • Проверьте параметры пользователя в формате словаря для initdb/basebackup (m4rrypro)

    Когда опции initdb или basebackup предоставлялись в виде словаря (вместо списка), проверка option_is_allowed() была пропущена, что позволяло использовать заблокированные опции.

  • Разрешить сжатие данных на стороне basebackup (m4rrypro)

    Опция compress была полностью отключена для basebackup, но начиная с PostgreSQL 15, сжатие на стороне сервера является полезным и работает прозрачно в формате без сжатия. Сжатие на стороне клиента по-прежнему не поддерживается.

  • Не перезагружайте конфигурацию PostgreSQL во время выполнения пользовательской начальной инициализации (Alexander Kukushkin)

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

  • Убедитесь, что postgresql.parameters является словарем (Alexander Kukushkin)

    Отбросить новую конфигурацию, если postgresql.parameters не является словарем.

Версия 4.1.0

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

Новые возможности

  • Добавьте поддержку типа юнита “notify” от systemd (Ronan Dunklau)

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

  • Предоставлять информацию о получении и воспроизведении LSN/задержке в API и ctl (Polina Bungina)

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

  • Обеспечьте чистое понижение до резервного кластера (Polina Bungina)

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

  • Реализуйте команды patronictl demote-cluster и promote-cluster (Polina Bungina)

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

  • Реализовать тег sync_priority (Polina Bungina)

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

  • Реализуйте опцию --print для --validate-config (Polina Bungina)

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

  • Реализовать kubernetes.bootstrap_labels (Polina Bungina)

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

  • Добавьте конфигурационную опцию для подавления дублирующих логов о сердцебинии (Michael Morris)

    Если установлено значение true, то последовательные логи о сердечных сигналах, которые идентичны, не должны выводиться.

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

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

  • Сделать HTTP конфигурацию заголовка сервера (David Grierson)

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

  • Реализуйте проверки готовности API для репликации на участниках (Ants Aasma)

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

Улучшения

  • Уменьшить уровень логирования при ошибках конфигурации сторожевого таймера (Ants Aasma)

    Показывать строку журнала Could not activate Linux watchdog device на уровне отладочного ведения журнала, если сторожевой таймер не настроен в режиме required. Ранее она отображалась на уровне информационного ведения журнала.

  • Воспользуйтесь written_lsn и latest_end_lsn, предоставленными pg_stat_wal_receiver (Alexander Kukushkin)

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

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

    Данное изменение необходимо для обеспечения полной функциональности логической функции переключения при отказе.

  • Добавьте состояние PostgreSQL в конечную точку /metrics REST API (Ivan Filianin)

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


Версия 4.0.7

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

Новые возможности

  • Добавьте поддержку PostgreSQL 18 RC1 (Alexander Kukushkin)

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

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

  • Устраните потенциальную проблему, связанную с разрешением localhost на IPv6 в Windows (András Váczi)

    При настройке 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 (Alexander Kukushkin)

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

  • Устраните проблему, при которой режим отказоустойчивости не активируется в случае недоступности etcd (Alexander Kukushkin)

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

  • Устранить проблему блокировки из-за повторного вызова обработчика сигнала (Waynerv)

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

  • Восстановить (постоянно) физическое место при отсутствии резервирования WAL (Israel Barth Rubio)

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

  • Обрабатывать сообщения об отмене наблюдения etcd3 корректно (Alexander Kukushkin)

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

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

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

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

  • Улучшить руководство для кластера, состоящего из узлов 2 (Nikolay Samokhvalov)

    Уточнить поведение при переключении при отказе и требования к DCS.


Версия 4.0.6

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

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

  • Исправить ошибку в переключении при отказе от лидера с более высоким приоритетом (Alexander Kukushkin)

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

  • Устранить разрешения для файла postgresql.conf, созданного вне PGDATA (Michael Banck)

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

  • Исправить ошибку, связанную с плановым переключением synchronous_mode=quorum (Alexander Kukushkin)

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

  • Игнорировать устаревшие узлы etcd путем сравнения термина кластера (Alexander Kukushkin)

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

  • Обновляйте файлы конфигурации PostgreSQL в SIGHUP (Alexander Kukushkin)

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

  • Правильно обрабатывать исключение Unavailable, возникающее в результате работы etcd3 (Alexander Kukushkin)

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

  • Улучшить обработку etcd3 (Alexander Kukushkin)

    Убедитесь, что Patroni обновляет etcd3 в течение как минимум одного цикла обеспечения высокой доступности.

  • Проверьте аннотации статуса 409 при попытке получить блокировку лидера (Alexander Kukushkin)

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

  • Учитывайте replay_lsn при продвижении слотов (Polina Bungina)

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

  • Убедитесь, что CHECKPOINT выполняется после повышения (Alexander Kukushkin)

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

  • Избегайте одновременного выполнения “офлайн” понижения (Alexander Kukushkin)

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

  • Нормализовать значение data_dir перед переименованием каталога данных при неудачной инициализации (Waynerv)

    Предотвратите появление обратного слеша в значении параметра data_dir, чтобы избежать сбоя процесса переименования после сбоя инициализации.

  • Убедитесь, что synchronous_standby_names содержит ожидаемое значение (Alexander Kukushkin)

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


Версия 4.0.5

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

Повышение стабильности

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

    Удалите предупреждения, возникающие при использовании API.

  • Совместимость с Python 3.13 (Alexander Kukushkin)

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

  • Совместимость с pyinstaller>=4.4 (Joe Jensen)

    Переключитесь на значение по умолчанию iter_modules, если атрибут pyinstaller toc отсутствует.

  • Устранить проблемы с поддержкой PostgreSQL 9.5 (Alexander Kukushkin)

    • Правильно обрабатывайте формат вывода pg_rewind.
    • Учитывайте, что формат synchronous_standby_names не поддерживает указание “num”.
  • Совместимость с последними изменениями в urlparse (Alexander Kukushkin)

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

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

  • Показать только участников, которые необходимо перезапустить после подтверждения перезапуска (András Váczi)

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

  • Отмена длительных задач при остановке Patroni и удаление каталога данных при неудачной начальной инициализации реплики (Alexander Kukushkin)

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

  • Правильно обрабатывать имена кластеров, содержащие символ “/” patronictl edit-config (Antoni Mur)

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

  • Избегайте преждевременного освобождения физических слотов (Alexander Kukushkin)

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

  • Обрабатывать все исключения, возникающие в дочернем процессе controldata() (Alexander Kukushkin)

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

  • Исправить ошибку, при которой слот для бывшего лидера не сохранялся при переключении (Alexander Kukushkin)

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

  • Исправить несколько ошибок в машине состояния кворума (Alexander Kukushkin)

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

Улучшения

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

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


Версия 4.0.4

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

Повышение стабильности

  • Добавить совместимость с модулем py-consul (Alexander Kukushkin)

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

  • Добавить совместимость с модулем prettytable>=3.12.0 (Alexander Kukushkin)

    Устраните предупреждения об устаревших адресах.

  • Совместимость с ydiff==1.4.2 (Alexander Kukushkin)

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

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

  • Запустить функцию обратного вызова on_role_change после неудачного восстановления первичного сервера (Polina Bungina, Alexander Kukushkin)

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

  • Устранить утечку потоков в patronictl list -W (Alexander Kukushkin)

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

  • Убедитесь, что в строку соединения записываются только поддерживаемые параметры (Alexander Kukushkin)

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


Версия 4.0.3

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

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

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

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

  • Устранить проблему с смешанными конфигурациями: первичный сервер на версии Patroni до v4 и реплики на версии v4+ (Alexander Kukushkin)

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

  • Не игнорируйте допустимые параметры GUC PostgreSQL, которые не имеют валидатора Patroni (Polina Bungina)

    Проверьте также, соответствует ли postgres --describe-config, если GUC не имеет валидатора Patroni, но фактически является допустимым GUC.

Улучшения

  • Проверьте аннотации статуса 409 при чтении объекта лидера в K8s (Alexander Kukushkin)

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

  • Добавьте поддержку опции соединения sslnegotiation на стороне клиента (Alexander Kukushkin)

    Добавлена sslnegotiation в финальный выпуск PostgreSQL 17.


Версия 4.0.2

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

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

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

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

  • Убедитесь, что неактивные физические слоты репликации не содержат xmin (Alexander Kukushkin, Polina Bungina)

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

  • Устранить не обработанные DCSError во время фазы запуска (Waynerv)

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

  • Явно включайте параметры конфигурации CMDLINE_OPTIONS при запросе к pg_settings (Alexander Kukushkin)

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

  • Исправить ошибку в логике каутирования synchronous_standby_names (Alexander Kukushkin)

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

  • Исправить проблему с неверным диапазоном соединения keepalive (hadizamani021)

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


Версия 4.0.1

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

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

  • Patroni создавал избыточные слоты репликации для себя (Alexander Kukushkin)

    Это происходит, если 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, возвращаемая Patroni REST API, была изменена с master на primary.
    • Patroni REST API больше не принимает role=master в запросах к конечным точкам /switchover, /failover, /restart.
    • Конечная точка /metrics REST API больше не будет отчитываться о метрике patroni_master.
    • Команда patronictl больше не принимает опцию --master ни для одной команды. Вместо этого следует использовать опции --leader или --primary.
    • Опция no_master в декларативной конфигурации методов создания пользовательских реплик больше не рассматривается как специальная опция, используйте вместо неё no_leader.
    • Скрипт patroni_wale_restore больше не принимает опцию --no_master.
    • Скрипт patroni_barman больше не принимает опцию --role=master.
    • Все скрипты обратного вызова выполняются с опцией role=primary, вместо role=master.
  • patronictl failover больше не принимает опцию --leader, которая была объявлена устаревшей начиная с Patroni 3.2.0.
  • Функциональность создания пользователей (раздел bootstrap.users конфигурации) была удалена начиная с Patroni 3.2.0.

Новые возможности

  • Переключение при отказе, основанное на кворуме (Ants Aasma, Alexander Kukushkin)

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

  • Зарегистрируйте вторичные узлы Citus в pg_dist_node (Alexander Kukushkin)

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

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

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

  • Сделать права доступа к файлам журналов, созданным Patroni, настраиваемыми (Alexander Kukushkin)

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

  • Совместимость с PostgreSQL 17 бета3 (Alexander Kukushkin)

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

  • Реализуйте опцию --ignore-listen-port для проверки конфигурации Patroni (Sahil Naphade)

    Предусмотреть возможность игнорировать уже занятые порты при работе с patroni --validate-config.

Улучшения

  • Сделайте wal_log_hints настраиваемым (Paul_Kim)

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

  • Записывать команду pg_basebackup в журнал с уровнем DEBUG (Waynerv)

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

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

  • Обеспечение постоянных слотов для каскадных узлов при работе в режиме отказоустойчивости (Alexander Kukushkin)

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

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

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

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

  • Улучшить проверку GUCs (Polina Bungina)

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

  • Добавьте строку с localhost в файл .pgpass при обнаружении Unix-сокет (Alexander Kukushkin)

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

  • Устранить проблемы с ведением журнала (Waynerv)

    Определена корректная запись запроса URL в журналах обработки ошибок и исправлен порядок времени в журнале проверки Postmaster.


Версия 3.3.2

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

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

  • Устранить синхронный режим репликации для Postgres (Israel Barth Rubio)

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

  • Обработка логических слотов, когда они становятся недействительными на резервном сервере (Polina Bungina)

    Поскольку PG16 логические слоты репликации на резервном сервере могут быть недействительными из-за горизонта: начиная с текущего момента, Patroni обязательно выполняет копирование (i.e, создание) недействительных слотов.

  • Устранить условие гонки с логическим продвижением слота и копированием (Alexander Kukushkin)

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


Версия 3.3.1

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

Повышение стабильности

  • Совместимость с Python 3.12 (Alexander Kukushkin)

    Обработать новое свойство, добавленное в logging.LogRecord.

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

  • Исправить бесконечную рекурсию при обработке тегов replicatefrom (Alexander Kukushkin)

    Как часть этой исправления, также улучшите проверку is_physical_slot() и обновите документацию.

  • Исправить некорректное отображение ролей в резервных кластерах (Alexander Kukushkin)

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

  • Обеспечить доступность allow_in_place_tablespaces GUC (Polina Bungina)

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


Версия 3.3.0

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

Предупреждение

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

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

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

Новые возможности

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

    Оно позволяет указать учетные данные для аутентификации, которые необходимо использовать для соединения.

  • Добавьте скрипт из дополнения для интеграции с Barman (Israel Barth Rubio)

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

  • Поддержка формата журнала JSON (alisalemmi)

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

  • Показать информацию pending_restart_reason (Polina Bungina)

    Предоставьте подробную информацию о параметрах PostgreSQL, которые вызвали установку флага pending_restart. Оба конечных пункта patronictl list и /patroni, а также REST и API теперь отображают имена параметров и их “разницу” в формате pending_restart_reason.

  • Реализовать тег nostream (Grigory Smolkin)

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

Улучшения

  • Реализовать проверку раздела log (Alexander Kukushkin)

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

  • Улучшить ведение журнала для изменений параметров PostgreSQL (Polina Bungina)

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

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

  • Правильно отфильтровать недопустимые pg_basebackup опции (Israel Barth Rubio)

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

  • Исправить ошибку обработки аутентификации etcd3 (Alexander Kukushkin)

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

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

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

  • Используйте target_session_attrs только в том случае, когда в разделе указано несколько хостов standby_cluster (Alexander Kukushkin)

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

  • Добавьте код совместимости для библиотеки версии ydiff и 1.3+ (Alexander Kukushkin)

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


Версия 3.2.2

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

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

  • Не позволяйте реплике выполнить инициализацию ключа, когда DCS было удалено (Alexander Kukushkin)

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

  • Используйте последовательное чтение при извлечении только обновленного ключа синхронизации из Consul (Alexander Kukushkin)

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

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

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

  • Исправить ошибочную логику сообщения подтверждения при переключении на асинхронного кандидата в синхронном режиме (Polina Bungina)

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

  • Исключить лидер из кандидатов на переключение при отказе в patronictl (Polina Bungina)

    Если кластер находится в здоровом состоянии, переключение на существующего лидера не имеет никакого эффекта.

  • Создайте базу данных Citus и расширение, обеспечивая атомарность операций (Alexander Kukushkin, Zhao Junwang)

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

  • Не фильтруйте наш тег nofailover (Polina Bungina)

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

  • Устранен проблема с замерзшим исполняемым файлом, созданным с помощью PyInstaller (Sophia Ruan)

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

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

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

  • Восстановить параметры GUC и некоторые параметры, управляемые Patroni, при присоединении к работающему резервному серверу (Alexander Kukushkin)

    Patroni не удавалось перезапустить Postgres с версии 12 и выше, выдавая ошибку о том, что отсутствует port в одной из внутренних структур.

  • Исправления, связанные с флагом pending_restart (Polina Bungina)

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


Версия 3.2.1

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

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

  • Ограничить допустимые значения аргумента --format в patronictl (Alexander Kukushkin)

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

  • Убедитесь, что узлы-реплики получили контрольную точку LSN при выключении, прежде чем освободить ключ лидера (Alexander Kukushkin)

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

  • Выполняйте реальный запрос HTTP при проверке уникальности имени узла (Alexander Kukushkin)

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

  • Установлена фиксированная поддержка Citus с etcd v2 (Alexander Kukushkin)

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

  • Исправлено поведение pg_rewind с PostgreSQL v16+ (Alexander Kukushkin)

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

  • Исправлена ошибка с пользовательской начальной инициализацией (Alexander Kukushkin)

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

  • Устраненная проблема с конечными точками проверки работоспособности REST API (Sophia Ruan)

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

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

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


Версия 3.2.0

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

Уведомление об устаревании

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

Изменения, нарушающие совместимость

  • Обеспечить выполнение правила loop_wait + 2*retry_timeout <= ttl и жестко закодировать минимально возможные значения (Alexander Kukushkin)

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

Новые возможности

  • Приоритет переключения при отказе (Mark Pekala)

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

  • Реализованы patroni --generate-config [--dsn DSN] и patroni --generate-sample-config (Polina Bungina)

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

  • Используйте выделенное соединение с Postgres для Patroni REST API (Alexander Kukushkin)

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

  • Расширить некоторые конечные точки с использованием name узла (sskserk)

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

  • Обеспечить строкое различие между переключением при отказе и плановым переключением (Polina Bungina)

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

  • Обеспечить, чтобы физические слоты репликации работали аналогично логическим слотам (Alexander Kukushkin)

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

  • Добавьте возможность указания пространства имен через аргумент --dcs в команде patronictl (Israel Barth Rubio)

    Было бы полезно, если patronictl использовался без файла конфигурации.

  • Добавьте поддержку дополнительных параметров в пользовательской конфигурации начальной инициализации (Israel Barth Rubio)

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

Улучшения

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

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

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

  • Игнорировать настройку synchronous_mode в резервном кластере (Polina Bungina)

    PostgreSQL не поддерживает каскадное синхронное репликацию и игнорирование synchronous_mode приводило к сбоям при плановом переключении в резервном кластере.

  • Обработка SIGCHLD для обратного вызова on_reload (Alexander Kukushkin)

    Не выполнение этого приведет к созданию “живого” процесса, который завершается только при выполнении следующего on_reload.

  • Обрабатывать ошибку AuthOldRevision при работе с etcd v3 (Alexander Kukushkin, Kenny Do)

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


Версия 3.1.2

Выпущено 2023-09-26

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

  • Исправлена ошибка с проверками wal_keep_size (Alexander Kukushkin)

    wal_keep_size представляет собой GUC, который обычно имеет единицу, и Patroni не мог преобразовать его значение в int. В результате значение bootstrap.dcs не было записано в ключ /config после этого.

  • Обнаружение и устранение несоответствий между /sync и synchronous_standby_names (Alexander Kukushkin)

    Обычно Patroni обновляет /sync и synchronous_standby_names в определенном порядке, но в случае возникновения ошибки или при ручном сбросе synchronous_standby_names, Patroni переходил в несогласованное состояние. В результате могло произойти переключение на несинхронный узел.

  • Прочитать значения GUC при объединении работающих экземпляров Postgres (Alexander Kukushkin)

    При перезапуске в режиме паузы , Patroni удалял synchronous_standby_names GUC из postgresql.conf. Чтобы решить эту проблему и избежать подобных ситуаций, Patroni будет считывать значение GUC, если он присоединяется к уже работающей Postgres.

  • Устранено отображение назойливых предупреждений при проверке уникальности узла (Alexander Kukushkin)

    Предупреждение WARNING генерируется urllib3, если Patroni перезапускается слишком быстро.


Версия 3.1.1

Выпущено 2023-09-20

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

  • Сброс состояния резервного копирования при повышении (ChenChangAo)

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

  • Игнорировать ненужные предупреждения в patronictl (Alexander Kukushkin)

    Если patronictl использует тот же patroni.yaml файл, что и Patroni, и имеет доступ к PGDATA каталогу, оно может выдавать навязчивые предупреждения об неправильных значениях в глобальной конфигурации.

  • Явно включить синхронный режим для редкого случая (Alexander Kukushkin)

    Синхронный режим эффективно не активируется, если нет реплик, получающих данные от первичного сервера.

  • Исправлена ошибка с проверкой целочисленных значений 0 (Israel Barth Rubio)

    В большинстве случаев это не вызывало никаких проблем, только предупреждения.

  • Не возвращайте логические слоты для резервного кластера (Alexander Kukushkin)

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

  • Избегайте отображения строки документации в patronictl --help (Israel Barth Rubio)

    Модуль click должен получить специальное указание для этого.

  • Исправлена ошибка, связанная с kubernetes.standby_leader_label_value (Alexander Kukushkin)

    Эта функция фактически никогда не работала.

  • Вернул идентификатор системы кластера в patronictl list (Polina Bungina)

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

  • Переопределите метод write_leader_optime в реализации для Kubernetes (Alexander Kukushkin)

    Метод должен записывать команду остановки LSN на конечную точку/ConfigMap, когда нет доступных здоровых реплик, которые могли бы стать новым первичным сервером.

  • Не запускайте остановленный PostgreSQL в режиме ожидания (Alexander Kukushkin)

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

  • Исправлена ошибка в команде patronictl query (Israel Barth Rubio)

    Не работало, когда предоставлялся только аргумент -m, или когда не предоставлялись ни -r, ни -m.

  • Правильно обрабатывать целочисленные параметры, используемые в командной строке для запуска PostgreSQL (Polina Bungina)

    Если значения передаются в виде строк и не преобразуются в целые числа, это приводило к неверному расчету max_prepared_transactions, основанному на max_connections для кластеров Citus.

  • Не полагайтесь на pg_stat_wal_receiver при принятии решения о pg_rewind (Alexander Kukushkin)

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


Версия 3.1.0

Выпущено 2023-08-03

Изменения, нарушающие совместимость

  • Изменили семантику restapi.keyfile и restapi.certfile (Alexander Kukushkin)

    Ранее Patroni использовал restapi.keyfile и restapi.certfile в качестве сертификатов клиента в качестве резервного варианта, если соответствующие параметры конфигурации отсутствовали в разделе ctl.

Предупреждение

Если включена проверка клиентских сертификатов (restapi.verify_client имеет значение required), также обязательно предоставьте действительные клиентские сертификаты в ctl.certfile, ctl.keyfile, ctl.keyfile_password. Без них Patroni не будет работать правильно.

Новые возможности

  • Сделать возможность настройки роли Pod (Waynerv)

    Значения можно было настроить с помощью параметров kubernetes.leader_label_value, kubernetes.follower_label_value и kubernetes.standby_leader_label_value. Эта функция будет очень полезна, когда мы изменим роль master на primary. Вы можете узнать больше о функции и шагах миграции здесь .

Улучшения

  • Различные улучшения patroni --validate-config (Alexander Kukushkin)

    Улучшена проверка параметров для различных DCS, bootstrap.dcs, ctl, restapi и сегментов, а также для .

  • Запускать PostgreSQL без режима восстановления, если он завершился во время восстановления, пока работает Patroni (Alexander Kukushkin)

    Это может сократить время восстановления и поможет предотвратить ненужные увеличения временной шкалы.

  • Избегайте ненужных обновлений ключа /status (Alexander Kukushkin)

    Когда отсутствуют постоянные логические слоты, Patroni обновлял /status на каждом цикле проверки работоспособности, даже когда LSN на первичном сервере не продвигался вперед.

  • Не допускайте, чтобы устаревший первичный сервер выиграл выбор лидера (Alexander Kukushkin)

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

  • Реализована возможность проверки определенных параметров PostgreSQL (Alexander Kukushkin, Feike Steenbergen)

    Если проверка max_connections, max_wal_senders, max_prepared_transactions, max_locks_per_transaction, max_replication_slots или max_worker_processes завершилась неудачей, Patroni использовал какое-то разумное значение по умолчанию. Теперь, помимо этого, он также отобразит предупреждение.

  • Установите разрешения для файлов и каталогов, созданных в PGDATA (Alexander Kukushkin)

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

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

  • Запустите archive_command через оболочку (Waynerv)

    Patroni мог архивировать некоторые сегменты WAL перед аварийным восстановлением в однопользовательском режиме или перед pg_rewind. Если archive_command содержала операторы оболочки, например &&, она не работала с Patroni.

  • Устранены ошибки при проверках завершения работы “в процессе переключения” (Polina Bungina)

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

  • Исправлена проверка “является ли первичным сервером” (Alexander Kukushkin)

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

  • Исправлена patronictl list (Alexander Kukushkin)

    Поле «Название кластера» отсутствовало в форматах вывода tsv, json и yaml.

  • Исправлено поведение pg_rewind после паузы (Alexander Kukushkin)

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

  • Исправлена ошибка в реализации etcd v3 (Alexander Kukushkin)

    Недействительновать внутренний кэш KV, если обновление ключа выполнено с использованием поля create_revision/mod_revision из-за несоответствия версий.

  • Фиксированное поведение реплик в резервном кластере в режиме паузы (Alexander Kukushkin)

    Когда истекает срок действия ключа лидера, реплики в резервном кластере не будут следовать удаленному узлу, а будут оставаться в текущем состоянии primary_conninfo.


Версия 3.0.4

Выпущено 2023-07-13

Новые возможности

  • Сделать статус репликации резервных узлов видимым (Alexander Kukushkin)

    Для PostgreSQL 9.6+ Patroni сообщит о состоянии репликации как streaming, когда резервный сервер получает данные от другого узла, или in archive recovery, когда нет соединения репликации и установлено значение restore_command. Состояние видно в ключах member в DCS, в выводе REST API и в patronictl list.

Улучшения

  • Улучшенные сообщения об ошибках с использованием etcd v3 (Alexander Kukushkin)

    Когда кластер etcd v3 недоступен, Patroni сообщал, что не может получить доступ к конечным точкам /v2.

  • Используйте режим чтения с кворумом patronictl , если это возможно (Alexander Kukushkin)

    Кластеры etcd или Consul могут быть приведены в режим только для чтения, но с точки зрения patronictl всё было нормально. Сейчас произойдет сбой с ошибкой.

  • Предотвратить разделение на две части из-за дублирования имен в конфигурации (Mark Pekala)

    При запуске Patroni будет проверено, зарегистрирован ли узел с таким же именем в DCS, и будет предпринята попытка запросить его REST API. Если REST API доступно, Patroni завершится с ошибкой. Это поможет защититься от человеческих ошибок.

  • Запустить Postgres без режима восстановления, если он завершился во время работы Patroni (Alexander Kukushkin)

    Это может сократить время восстановления и поможет избежать ненужных изменений временной шкалы.

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

  • REST API SSL сертификат не был перезагружен при получении SIGHUP (Israel Barth Rubio)

    Ошибку было внесено в 3.0.3.

  • Фиксированная проверка целочисленных параметров GUC, таких как max_connections (Feike Steenbergen)

    Patroni не воспринимал значения, заключенные в кавычках. Ошибка была внесена в 3.0.3.

  • Устранить проблему, связанную с , synchronous_mode, (Alexander Kukushkin)

    Выполните txid_current() с использованием synchronous_commit=off, чтобы избежать случайного ожидания отсутствующих синхронных резервных серверов при включении synchronous_mode_strict.


Версия 3.0.3

Выпущено 2023-06-22

Новые возможности

  • Совместимость с PostgreSQL 16 бета1 (Alexander Kukushkin)

    Расширьте правила валидации для GUC.

  • Сделайте валидатор PostgreSQL GUC расширяемым (Israel Barth Rubio)

    Правила валидации загружаются из файлов YAML, расположенных в каталоге patroni/postgresql/available_parameters/. Файлы располагаются в алфавитном порядке и применяются последовательно. Это позволяет использовать пользовательские правила валидации для нестандартных дистрибутивов PostgreSQL.

  • Добавлена опция restapi.request_queue_size (Andrey Zhidenkov, Aleksei Sukhov)

    Устанавливает размер очереди запросов для сокета TCP, используемого Patroni REST API. После заполнения очереди, дальнейшие запросы получают ошибку “Соединение отклонено”. Значение по умолчанию равно 5.

  • Вызывайте initdb напрямую при инициализации нового кластера (Matt Baker)

    Ранее это осуществлялось через pg_ctl, что требовало специального кастинга параметров, передаваемых в initdb.

  • Добавлено до точки останова (Le Duane)

    Этот хук можно настроить через postgresql.before_stop и выполняется непосредственно перед pg_ctl stop. Код завершения не влияет на процесс остановки.

  • Добавлена поддержка пользовательских имен для исполняемых файлов Postgres (Israel Barth Rubio, Polina Bungina)

    При использовании пользовательской версии Postgres может оказаться, что бинарные файлы Postgres были скомпилированы с другими именами, отличными от именами, используемых в общедоступной версии Postgres. Имена пользовательских бинарных файлов можно настроить с помощью переменных окружения postgresql.bin_name.* и PATRONI_POSTGRESQL_BIN_*.

Улучшения

  • Различные улучшения patroni --validate-config (Polina Bungina)

    • Сделать bootstrap.initdb необязательным. Оно требуется только для новых кластеров, но patroni --validate-config выдавала ошибку, если оно отсутствовало в конфигурации.
    • Не выдавать ошибку, когда postgresql.bin_dir пусто или не установлено. Сначала попытайтесь найти бинарные файлы Postgres в стандартном месте PATH.
    • Сделать раздел postgresql.authentication.rewind необязательным. Если он отсутствует, Patroni использует учетную запись суперпользователя.
  • Улучшенная отчетность об ошибках в patronictl (Israel Barth Rubio)

    Символ \n отображался в том виде, в котором он есть, вместо фактического символа новой строки.

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

  • Устраненная проблема в поддержке Citus (Alexander Kukushkin)

    Если вызов REST API от продвинутого рабочего к координатору завершился неудачно во время планового переключения, это приводило к блокировке указанной группы Citus в течение неопределенного времени.

  • Разрешить etcd3 URL в опции --dcs-url команды patronictl (Israel Barth Rubio)

    Если пользователи попытаются передать etcd3 URL через опцию --dcs-url программы patronictl , они столкнутся с исключением.


Версия 3.0.2

Выпущено 2023-03-24

Предупреждение

В версии 3.0.2 поддержка Python версий старше 3.6 прекращена.

Новые возможности

  • Добавлена синхронизация статуса резервного сервера в конечную точку /metrics (Thomas von Dein, Alexander Kukushkin)

    Ранее осуществлялось только отслеживание primary/standby_leader/replica.

  • Удобное управление PAGER в patronictl (Israel Barth Rubio)

    Оно позволяет настраивать вывод постранично через переменную окружения PAGER, которая переопределяет значения по умолчанию less и more.

  • Сделать код состояния K8s, подлежащий повторной попытке HTTP, настраиваемым (Alexander Kukushkin)

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

Улучшения

  • Установите hot_standby в значение off только при выполнении пользовательской начальной инициализации, если recovery_target_action установлено в значение promote (Alexander Kukushkin)

    Необходимо было обеспечить корректную работу recovery_target_action=pause.

  • Не разрешайте on_reload вызывать другие callback-функции для завершения работы. (Alexander Kukushkin)

    on_start/on_stop/on_role_change обычно используются для добавления/удаления виртуального IP, и on_reload не должны влиять на них.

  • Переключено на IMDSFetcher в примере скрипта обратного вызова для AWS (Polina Bungina)

    Для IMDSv2 требуется токен для работы, а IMDSFetcher обрабатывает его автоматически.

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

  • Устранена ошибка patronictl switchover в кластере Citus, работающем на Kubernetes (Lukáš Lalinský)

    Это не работало для пространств имен, отличных от default.

  • Не записывайте данные в PGDATA, если основная версия неизвестна (Alexander Kukushkin)

    Если сразу после запуска PGDATA был пустым (возможно, еще не был смонтирован), Patroni делал ложное предположение о версии PostgreSQL и ошибочно создавал файл recovery.conf даже в том случае, если фактическая основная версия составляет v10+ или выше.

  • Исправлена ошибка с метаданными Citus после переключения координатора (Alexander Kukushkin)

    Вызов citus_set_coordinator_host() не вызывает синхронизацию метаданных, и изменение было незаметным на узлах-рабочих. Проблема решается путем перехода на citus_update_node().

  • Используйте хосты etcd, указанные в файле конфигурации, в качестве резервного варианта, когда все узлы etcd “не удалось” (Alexander Kukushkin)

    Кластер etcd может изменять свою топологию со временем, и Patroni пытается следить за этим. Если в какой-то момент все узлы становятся недоступными, Patroni будет использовать комбинацию узлов из конфигурации, а также последнюю известную топологию, при попытке повторного подключения.


Версия 3.0.1

Выпущено 2023-02-16

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

  • Передайте правильное имя роли в on_role_change скрипт обратного вызова. (Alexander Kukushkin, Polina Bungina)

    Patroni ранее ошибочно передавал роли promoted обратному вызову on_role_change при повышении. Имя передаваемой роли было возвращено к master. Этот регресс был введён в 3.0.0.


Версия 3.0.0

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

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

Предупреждение
  • Выпуск 3.0.0 является последним выпуском, поддерживающим Python 2.7. Следующий выпуск прекратит поддержку версий Python, более старых, чем 3.7.

  • Поддержка RAFT устарела. Мы сделаем всё возможное для её поддержания, но не гарантируем и не несём ответственности за возможные проблемы.

  • Этот выпуск является первым шагом по отказу от термина «master» в пользу «primary». Обновление до следующего мажорного выпуска будет работать надёжно только в том случае, если вы используете не менее 3.0.0.

Новые возможности

  • DCS отказоустойчивый режим (Alexander Kukushkin, Polina Bungina)

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

  • Поддержка Citus (Alexander Kukushkin, Polina Bungina, Jelte Fennema)

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

Улучшения

  • Подавление повторяющихся ошибок при удалении неизвестных, но активных слотов репликации (Michael Banck)

    Patroni по-прежнему будет создавать эти логи, но только в DEBUG.

  • Запускать только один запрос мониторинга в каждом цикле HA (Alexander Kukushkin)

    Это не относится к случаю, когда включена синхронная репликация.

  • Сохранить последнюю неудачную директорию данных (William Albertus Dembo)

    Если начальная инициализация завершилась неудачно, Patroni использовал для переименования папки PGDATA с суффиксом временной метки. С этого момента суффикс будет .failed, и если такая папка существует, она удаляется перед переименованием.

  • Улучшенная проверка соединений для синхронной репликации (Alexander Kukushkin)

    Когда новый хост добавляется в synchronous_standby_names, он устанавливается как синхронный в DCS только в том случае, если он успешно синхронизируется с первичным сервером, а также pg_stat_replication.sync_state = 'sync'.

Удалённые возможности

  • Удалите patronictl scaffold (Alexander Kukushkin)

    Единственная причина для его использования заключалась в неэффективном способе управления резервными кластерами.


Версия 2.1.7

Выпущено 2023-01-04

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

  • Устранены незначительные несовместимости с устаревшими Python-модулями (Alexander Kukushkin)

    Они предотвратили установку/запуск Patroni на Debian Buster/Ubuntu Bionic.


Версия 2.1.6

Выпущено 2022-12-30

Улучшения

  • Устраните раздражающие исключения при завершении соединения SSL (Alexander Kukushkin)

    HAProxy закрывает соединения, как только получает код статуса HTTP, не оставляя Patroni время для корректного завершения SSL соединения.

  • Настройте пример Dockerfile для архитектуры arm64 (Polina Bungina)

    Удалите явные amd64 и x86_64, не удаляйте libnss_files.so.*.

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

  • Обеспечить search_path=pg_catalog для соединений, не участвующих в репликации (Alexander Kukushkin)

    Поскольку Patroni в значительной степени полагается на соединения с правами суперпользователя, мы хотим защитить его от возможных атак, осуществляемых с использованием пользовательских функций и/или операторов в схеме public с тем же именем и сигнатурой, что и соответствующие объекты в pg_catalog. Для этого обеспечивается search_path=pg_catalog для всех соединений, созданных Patroni (кроме соединений репликации).

  • Предотвратить запись паролей в pg_stat_statements (Feike Steenbergen)

    Это достигается путем установки pg_stat_statements.track_utility=off при создании пользователей.

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

  • Объявить proxy_address как необязательный (Denis Laxalde)

    Поскольку это, по сути, необязательная опция.

  • Улучшить поведение опции «insecure» (Alexander Kukushkin)

    Опция insecure Ctl не работала должным образом, когда использовались клиентские сертификаты для REST API запросов.

  • Получите конфигурацию сторожевого таймера из bootstrap.dcs при начальной инициализации нового кластера (Matt Baker)

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

  • Исправьте способ обработки расширений файлов при поиске исполняемых файлов WIN32 (Martín Marqués)

    Добавляйте .exe в имя файла только в том случае, если у файла еще нет расширения.

  • Исправить настройку Consul TTL (Alexander Kukushkin)

    Мы использовали ttl/2.0 при установке значения в классе HTTPClient, но забыли умножить текущее значение на 2 в свойстве класса. Это приводило к тому, что Consul TTL получал неверные данные в два раза.

Удалённые возможности

  • Удалите patronictl configure (Polina Bungina)

    Не требуется создавать отдельный patronictl конфигурационный файл.


Версия 2.1.5

Выпущено 2022-11-28

Эта версия улучшает совместимость с PostgreSQL 15 и объявляет о готовности к использованию etcd v3 в производственной среде. Patroni на Raft остается в статусе Бета.

Новые возможности

  • Улучшить patroni --validate-config (Denis Laxalde)

    Завершить работу с кодом 1, если конфигурация недействительна, и вывести сообщения об ошибках в stderr.

  • Не удаляйте слоты репликации в режиме паузы (Alexander Kukushkin)

    Patroni автоматически создает/удаляет физические слоты репликации при присоединении/удалении участников кластера. В режиме паузы слоты репликации не будут удаляться.

  • Поддержка метода запроса HEAD для мониторинговых конечных точек (Robert Cutajar)

    Если использовать GET вместо него, Patroni вернет только код статуса HTTP.

  • Обеспечить поддержку тестов поведения в Windows (Alexander Kukushkin)

    Имитировать корректный выход Patroni (SIGTERM) в Windows путем внедрения нового REST API конечного POST /sigterm.

  • Введение postgresql.proxy_address (Alexander Kukushkin)

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

Повышение стабильности

  • Выполните pg_replication_slot_advance() из потока (Alexander Kukushkin)

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

  • Архив может содержать отсутствующие WAL, перед вызовом pg_rewind на старый первичный сервер (Polina Bungina)

    Если первичный сервер вышел из строя и был недоступен в течение длительного времени, некоторые файлы WAL могут отсутствовать в архиве и на новом первичном сервере. Существует вероятность того, что pg_rewind удалит эти файлы WAL с старого первичного сервера, что сделает невозможным его запуск в качестве резервного. Архивируя файлы ready WAL, мы не только решаем эту проблему, но и в целом улучшаем процесс непрерывного архивирования.

  • Игнорировать ошибки 403 при попытке создания Kubernetes Service (Nick Hudson, Polina Bungina)

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

  • Улучшить проверку работоспособности (Alexander Kukushkin)

    Проблема с доступностью начнет возникать, если цикл проверки работоспособности работает дольше ttl на первичном сервере или 2\*ttl на реплике. Это позволит использовать его в качестве альтернативы watchdog в Kubernetes.

  • Убедитесь, что только узел, отвечающий за синхронизацию, пытается получить блокировку во время планового переключения (Alexander Kukushkin, Polina Bungina)

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

  • Избегайте клонирования во время начальной инициализации (Ants Aasma)

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

  • Совместимость с kazoo 2.9.0 (Alexander Kukushkin)

    В зависимости от версии Python, метод SequentialThreadingHandler.select() может вызывать исключения TypeError и IOError, если метод select() вызывается на закрытом сокете.

  • Явно завершить SSL соединение перед завершением работы сокета (Alexander Kukushkin)

    Не выполнение этого привело к возникновению unexpected eof while reading ошибок с использованием OpenSSL 3.0.

  • Совместимость с prettytable\>=2.2.0 (Alexander Kukushkin)

    В связи с внутренними API изменениями заголовок кластера отображался на неправильной строке.

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

  • Обработать истекший токен для etcd lease_grant (monsterxx03)

    В случае возникновения ошибки получите новый токен и повторите запрос.

  • Исправить ошибку в GET /read-only-sync (Alexander Kukushkin)

    Оно было введено в предыдущем выпуске и фактически никогда не работало.

  • Обработка случая, когда директория хранения данных исчезла (Alexander Kukushkin)

    Patroni периодически проверяет, что PGDATA существует и не является пустым, но в случае возникновения проблем со хранилищем, os.listdir() генерирует исключение OSError, прерывая цикл мониторинга.

  • Применять master_stop_timeout при ожидании закрытия пользовательских бэкендов (Alexander Kukushkin)

    Что-то, похожее на пользовательский бэкенд, на самом деле может быть фоновым процессом (e.g, Citus Maintenance Daemon), который не может быть остановлен.

  • Принять *:<port> для postgresql.listen (Denis Laxalde)

    Система patroni --validate-config сообщала об этом.

  • Исправление тайм-аутов в Raft (Alexander Kukushkin)

    Когда Patroni или patronictl запускаются, они пытаются получить топологию кластера Raft от известных участников. Эти вызовы выполнялись без надлежащих тайм-аутов.

  • Принудительное обновление сервиса consul, если был изменен токен (John A. Lotoski)

    В этом случае возникают ошибки “ошибка вызова RPC: ошибка вызова RPC: ACL не найдено”.


Версия 2.1.4

Выпущено 2022-06-01

Новые возможности

  • Улучшить поведение pg_rewind на типичных системах Debian/Ubuntu (Gunnar “Nick” Bluth)

    В конфигурациях PostgreSQL, в которых postgresql.conf находится вне каталога данных (e.g. пакеты Ubuntu/Debian), pg_rewind --restore-target-wal не может определить значение restore_command.

  • Разрешить установку TLSServerName на проверки сервисов Consul (Michael Gmelin)

    Полезно, когда проверки выполняются по IP-адресам, и Consul node_name не является FQDN.

  • Добавлена поддержка ppc64le в сторожевом таймере (Jean-Michel Scheiwiler)

    И реализована поддержка сторожевого таймера на некоторых платформах, отличных от x86.

  • Перенесен вызов aws.py из boto в boto3 (Alexander Kukushkin)

boto 2.x устарел с 2018 и завершается с ошибкой python 3.9.

  • Периодически обновляйте токен учетной записи сервиса в K8s (Haitao Li)

    Поскольку токены учётных записей службы Kubernetes v1.21 истекают через 1 час.

  • Добавлен конечный пункт мониторинга /read-only-sync (Dennis4b)

    Это аналогично /read-only, но включает только синхронные реплики.

Повышение стабильности

  • Не копируйте слот репликации логической репликации на реплику, если в настройках логического декодирования с первичным сервером имеется несоответствие (Alexander Kukushkin)

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

  • Особые правила обработки параметров конфигурации восстановления для PostgreSQL v12+ (Alexander Kukushkin)

    При запуске в режиме реплики Patroni должен уметь обновлять postgresql.conf и перезапускаться/перезагружаться, если адрес лидера изменился, используя кэшированные значения параметров вместо запросов к pg_settings.

  • Улучшенная обработка IPv6-адресов в параметрах postgresql.listen (Alexander Kukushkin)

    Поскольку параметр listen имеет порт, люди пытаются вводить IPv6-адреса в квадратные скобки, что не происходит корректно, когда в списке указано несколько IP-адресов.

  • Используйте учетные данные replication при выполнении проверки на соответствие только для PostgreSQL v10 и более ранних версий (Alexander Kukushkin)

    Если включено rewind, Patroni снова будет использовать либо учетные данные superuser, либо rewind в новых версиях Postgres.

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

  • Исправлена отсутствующая импорт dateutil.parser (Wesley Mendes)

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

  • Убедитесь, что аннотация optime является строкой (Sebastian Hasler)

    В определенных случаях Patroni пытался интерпретировать это как число.

  • Улучшенная обработка неудачной попытки pg_rewind (Alexander Kukushkin)

    Если первичный сервер станет недоступным в течение pg_rewind, $PGDATA останется в нерабочем состоянии. Впоследствии Patroni удалит каталог данных, даже если это не разрешено конфигурацией.

  • Не удаляйте slots аннотации с лидера ConfigMap/Endpoint, когда PostgreSQL еще не готов (Alexander Kukushkin)

    Если значение slots не передано, аннотация будет использовать текущее значение.

  • Решение проблемы конкурентности с помощью наблюдателей K8s API (Alexander Kukushkin)

    В некоторых (неизвестных) условиях наблюдатели могут стать устаревшими; в результате метод attempt_to_acquire_leader() может завершиться сбоем из-за кода состояния HTTP 409. В таком случае мы сбрасываем соединения наблюдателей и начинаем сначала.


Версия 2.1.3

Выпущено 2022-02-18

Новые возможности

  • Добавлена поддержка для зашифрованных ключей TLS для patronictl (Alexander Kukushkin)

    Его можно было настроить через ctl.keyfile_password или переменную окружения PATRONI_CTL_KEYFILE_PASSWORD.

  • Добавлены дополнительные метрики в конечную точку /metrics (Alexandre Pereira)

    В частности, patroni_pending_restart и patroni_is_paused.

  • Предусмотреть возможность указания нескольких хостов в конфигурации резервного кластера (Michael Banck)

    Если резервный кластер реплицирует данные из кластера Patroni, может быть удобно использовать переключение при отказе на стороне клиента, доступное в libpq начиная с PostgreSQL v10. То есть, настройка primary_conninfo на резервном лидере и параметр pg_rewind в строке подключения target_session_attrs=read-write. Файл pgpass будет сгенерирован с несколькими строками (по одной строке на хост), и вместо вызова CHECKPOINT на узлах первичного кластера резервный кластер будет ждать обновления pg_control.

Повышение стабильности

  • Совместимость со старыми системами psycopg2 (Alexander Kukushkin)

    Например, psycopg2, установленный из пакетов Ubuntu 18.04, пока не имеет исключения UndefinedFile.

  • Перезапустите etcd3, если все узлы etcd не отвечают (Alexander Kukushkin)

    Если наблюдатель активен, метод get_cluster() продолжает возвращать устаревшую информацию, даже если все узлы etcd выходят из строя.

  • Не удаляйте блокировку лидера в резервном кластере во время приостановки (Alexander Kukushkin)

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

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

  • Исправлена ошибка в начальной инициализации с резервным сервером (Alexander Kukushkin)

    Patroni рассматривал начальную инициализацию как неудачную, если Postgres не начинал принимать соединения после 60 секунд. Ошибка была внесена в релизе 2.1.2.

  • Исправлена ошибка с переключением на резервный сервер в случае отказов (Alexander Kukushkin)

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

  • Устранены мелкие проблемы в валидаторе конфигурации Postgres (Alexander Kukushkin)

    Целые параметры, представленные в PostgreSQL версии 14, не проходили валидацию, поскольку минимальные и максимальные значения были заключены в кавычки в validator.py

  • Используйте учетные данные для репликации при проверке статуса лидера (Alexander Kukushkin)

    Возможно, что remove_data_directory_on_diverged_timelines установлено, но rewind_credentials не определено, и доступ суперпользователя между узлами не разрешен.

  • Исправлена ошибка “порт уже используется” при замене сертификатов REST API (Ants Aasma)

    При переключении сертификатов возникала гонка условий с одновременным API запросом. Если один активен в период замены, то замена завершится неудачей с ошибкой “порт занят”, и Patroni окажется в состоянии без активного API сервера.

  • Исправлена ошибка в начальной инициализации кластера, если пароли содержат % символы (Bastien Wirtz)

    Метод начальной инициализации выполняет блок DO, при этом все параметры должны быть правильно заключены в кавычки, но метод cursor.execute() не принимает пустой список с переданными параметрами.

  • Исправлена ошибка “AttributeError: no attribute ’leader’” (Hrvoje Milković)

    Это может произойти, если включен синхронный режим и содержимое DCS было удалено.

  • Исправить ошибку в проверке временной шкалы при расхождениях (Alexander Kukushkin)

    Patroni ошибочно предполагал, что временные шкалы разошлись. Для pg_rewind это не создавало проблем, но если pg_rewind запрещено и remove_data_directory_on_diverged_timelines установлено, это приводило к повторной инициализации предыдущего лидера.


Версия 2.1.2

Выпущено 2021-12-03

Новые возможности

  • Совместимость с psycopg>=3.0 (Alexander Kukushkin)

    По умолчанию используется psycopg2. psycopg\>=3.0 будет использоваться только в том случае, если psycopg2 недоступен или его версия слишком устарела.

  • Добавьте поле dcs_last_seen в REST API (Michael Banck)

    Это поле указывает на последний момент времени (в формате Unix epoch), когда участник кластера успешно взаимодействовал с DCS. Это полезно для выявления и/или анализа сетевых разрывов.

  • Освободите блокировку лидера, когда pg_controldata сообщает о завершении работы (Alexander Kukushkin)

    Для решения проблемы медленного переключения/выключения в случае, когда archive_command работает медленно/неисправно, Patroni удалит ключ лидера сразу после того, как pg_controldata начнет сообщать, что PGDATA является shut down, и подтвердит, что есть хотя бы одна реплика, получившая все изменения. Если нет реплик, удовлетворяющих этому условию, ключ лидера не удаляется, и сохраняется прежнее поведение, i.e. Patroni продолжит обновлять замок.

  • Добавьте поддержку параметра sslcrldir «соединение» (Kostiantyn Nemchenko)

    Новый параметр соединения был введен в PostgreSQL v14.

  • Предоставление возможности настройки ACL для ZNodes в Zookeeper (Alwyn Davis)

    Внедрите новую опцию конфигурации zookeeper.set_acls, чтобы Kazoo применял значение по умолчанию ACL для каждого ZNode, который он создает.

Повышение стабильности

  • Отложите следующий попытку восстановления до следующего цикла HA (Alexander Kukushkin)

    Если PostgreSQL вышли из-за нехватки дискового пространства (например) и не может запуститься из-за этого, Patroni слишком активно пытается его восстановить, что приводит к переполнению логов.

  • Добавьте запись в журнал перед понижением, что может занять некоторое время (Michael Banck)

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

  • Улучшить сообщения статуса “I am” (Michael Banck)

    Сравнение no action. I am a secondary ({0}) и no action. I am ({0}), a secondary

  • Преобразовать в целое число wal_keep_segments при преобразовании в wal_keep_size (Jorge Solórzano)

    Возможно указать wal_keep_segments в виде строки в глобальной динамической конфигурации , и поскольку Python является динамически типизированным языком, строка была просто умножена. Пример: wal_keep_segments: "100" была преобразована в 100100100100100100100100100100100100100100100100MB.

  • Разрешить плановое переключение только к синхронным узлам, когда включена синхронная репликация (Alexander Kukushkin)

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

  • Используйте кэшированную роль в качестве резервного варианта, когда Postgres работает медленно (Alexander Kukushkin)

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

  • Избегайте ненужных обновлений узла члена (Alexander Kukushkin)

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

  • Оптимизировать контрольную точку после повышения (Alexander Kukushkin)

    Избегайте выполнения CHECKPOINT, если последняя временная шкала уже хранится в pg_control. Это помогает избежать ненужных CHECKPOINT сразу после инициализации нового кластера с initdb.

  • Предпочитайте участники, у которых отсутствует nofailover, при выборе узлов для синхронизации (Alexander Kukushkin)

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

  • Удалите дублирующиеся хосты из кэша etcd на машине (Michael Banck)

    Указанные в кластере etcd URL-адреса клиентов могут быть неправильно настроены. Удаление дубликатов в Patroni в этом случае – это простой и эффективный способ.

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

  • Пропускать временные слоты репликации при управлении слотами (Alexander Kukushkin)

    Начиная с версии 10 pg_basebackup создает временный слот репликации для потоковой передачи данных WAL, и Patroni пытался его удалить, поскольку имя слота выглядит неизвестным. Чтобы это исправить, мы игнорируем все временные слоты при запросе представления pg_stat_replication_slots.

  • Убедитесь, что pg_replication_slot_advance() не истекает (Alexander Kukushkin)

    Patroni использовал значение по умолчанию statement_timeout в данном случае, и после того, как вызов завершился неудачно, существует очень высокая вероятность, что он никогда не сможет восстановиться, что приведет к увеличению размера pg_wal и pg_catalog.

  • Обновление /status не было выполнено при понижении (Alexander Kukushkin)

    После демотирования PostgreSQL старый лидер обновляет последний LSN в DCS. Начиная с 2.1.0 был введён новый ключ /status, но optime по-прежнему записывался в /optime/leader.

  • Обрабатывать исключения DCS при понижении (Alexander Kukushkin)

    При понижении мастера из-за невозможности обновления блокировки лидера, может произойти ситуация, когда DCS полностью выходит из строя, и вызов get_cluster() вызывает исключение. Если это не обрабатывается должным образом, это приводит к тому, что Postgres остается в остановленном состоянии до восстановления DCS.

  • В некоторых случаях use_unix_socket_repl не функционировал (Alexander Kukushkin)

    В частности, если postgresql.unix_socket_directories не установлено. В этом случае Patroni должен использовать значение по умолчанию из libpq.

  • Устранить несколько проблем в Patroni REST API (Alexander Kukushkin)

    clusters_unlocked иногда не определялся, что приводило к исключениям в конечной точке GET /metrics. Кроме того, механизм обработки ошибок предполагал, что кортеж connect_address всегда содержит два элемента, в то время как в случае IPv6 их может быть больше.

  • Дождитесь завершения восстановления нового узла перед принятием решения о перемотке (Alexander Kukushkin)

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

  • Обрабатывать отсутствующие временные шкалы в файле истории при принятии решения о перемотке (Alexander Kukushkin)

    Если текущая временная шкала реплики отсутствует в файле истории на первичном сервере, реплика ошибочно предполагала, что перемотка не требуется.


Версия 2.1.1

Выпущено 2021-08-19

Новые возможности

  • Поддержка суффикса имени ETCD SRV (David Pavlicek)

    etcd позволяет различать несколько кластеров etcd, находящихся в той же зоне доменного имени, и теперь Patroni также поддерживает это.

  • Расширьте историю с новым лидером (huiyalin525)

    Оно добавляет новую колонку в patronictl history вывод.

  • Сделайте CA-пакет настраиваемым для конфигурации Kubernetes внутри кластера (Aron Parsons)

    По умолчанию Patroni использует /var/run/secrets/kubernetes.io/serviceaccount/ca.crt, и эта новая функция позволяет указать пользовательское kubernetes.cacert.

  • Поддержка динамической регистрации/отписки в качестве сервиса Consul и изменения тегов (Tommy Li)

    Ранее требовалась перезагрузка Patroni.

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

  • Избегайте ненужного перезапуска REST API (Alexander Kukushkin)

    Предыдущий выпуск добавил функцию перезагрузки REST API сертификатов в случае их изменения на диске. К сожалению, перезагрузка происходила автоматически сразу после запуска.

  • Не разрешайте участники кластера, когда установлено etcd.use_proxies (Alexander Kukushkin)

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

  • Пропускать строки, содержащие значения NULL в столбце pg_stat_replication (Alexander Kukushkin)

    Кажется, что представление pg_stat_replication может содержать значения NULL в полях replay_lsn, flush_lsn или write_lsn, даже когда state = 'streaming'.


Версия 2.1.0

Выпущено 2021-07-06

Эта версия добавляет совместимость с PostgreSQL v14, обеспечивает выживание слотов репликации при переключении, реализует поддержку списка разрешенных REST API, а также уменьшает количество записей в логах до одной строки на сердечный ритм.

Новые возможности

  • Совместимость с PostgreSQL v14 (Alexander Kukushkin)

    Возобновить WAL воспроизведение, если Patroni не находится в режиме “паузы” самостоятельно. Это может быть вызвано изменением определенных параметров, например, max_connections на первичном сервере.

  • Логические слоты для переключения при отказе (Alexander Kukushkin)

    Обеспечьте логическое существование слотов репликации при переключении при отказе/плановом переключении в PostgreSQL v11+. Функция pg_replication_slot_advance() используется для перемещения слота репликации из первичного сервера на реплику после перезапуска, чтобы он был уже создан до переключения. В результате, слот должен существовать заранее, и никаких событий не должно быть потеряно, но существует вероятность, что некоторые события могут быть доставлены несколько раз.

  • Реализована система разрешений для Patroni REST API (Alexander Kukushkin)

    Если настроено, то только IP-адреса, соответствующие правилам, будут разрешены для вызова небезопасных конечных точек. Кроме того, возможно автоматически добавить IP-адреса участников кластера в список.

  • Добавлена поддержка соединения через Unix-сокет (Mohamad El-Rifai)

    Ранее Patroni всегда использовал TCP для соединения с репликацией, что могло вызывать некоторые проблемы с проверкой SSL. Использование Unix-сокет позволяет исключить необходимость проверки учетной записи репликации SSL.

  • Проверка работоспособности по пользовательски определенным тегам (Arman Jafari Tehrani)

    Вместе с предопределенными тегами: можно указать любое количество пользовательских тегов, которые становятся доступными в выводе patronictl list и в REST API. С этого момента пользовательские теги можно использовать в проверках работоспособности.

  • Добавлен конечный /metrics для Prometheus (Mark Mercado, Michael Banck)

    Точка входа, предоставляющая те же метрики, что и /patroni.

  • Уменьшение объема логов Patroni (Alexander Kukushkin)

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

Изменения, нарушающие совместимость

  • Старая функция permanent logical replication slots больше не будет работать с PostgreSQL v10 и более ранними версиями (Alexander Kukushkin)

    Стратегия создания логических слотов после продвижения не гарантирует, что не будут потеряны никакие логические события, и поэтому отключены.

  • Конечная точка /leader всегда возвращает 200, если узел удерживает блокировку (Alexander Kukushkin)

    Для продвижения резервного кластера необходимо обновить проверки работоспособности балансировщика нагрузки, что не очень удобно и легко забывается. Чтобы это решить, мы изменяем поведение конечной точки проверки работоспособности /leader. Она будет возвращать 200, не учитывая, является ли кластер нормальным или нет, и standby_cluster .

Улучшения поддержки Raft

  • Надежная поддержка шифрования трафика Raft (Alexander Kukushkin)

    Из-за различных проблем в PySyncObj поддержка шифрования была очень нестабильной

  • Обработка проблем DNS в реализации Raft (Alexander Kukushkin)

    Если self_addr и/или partner_addrs настроены с использованием имени DNS вместо IP-адреса, то PySyncObj фактически выполнял разрешение только один раз при создании объекта. Это приводило к проблемам, когда один и тот же узел восстанавливался и имел другой IP-адрес.

Повышение стабильности

  • Совместимость с psycopg2-2.9+ (Alexander Kukushkin)

    В psycopg2, autocommit = True игнорируется в блоке with connection, что приводит к разрыву соединений протокола репликации.

  • Устранение избыточных операций HA с использованием Zookeeper (Alexander Kukushkin)

    Обновление ZNodes участника приводило к цепной реакции и приводило к многократному запуску циклов HA.

  • Обновите конфигурацию, если сертификат REST API был изменен на диске (Michael Todorovic)

    Если файл сертификата REST API был обновлен на месте, Patroni не выполнил перезагрузку.

  • Не создавайте каталог pgpass, если используется аутентификация Kerberos (Kostiantyn Nemchenko)

    Аутентификация с использованием Kerberos и пароля несовместима.

  • Устранены незначительные проблемы с пользовательской начальной инициализацией (Alexander Kukushkin)

    Начните работу с PostgreSQL, используя hot_standby=off, только когда выполняется PITR, и перезапустите его после завершения PITR.

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

  • Совместимость с kazoo-2.7+ (Alexander Kukushkin)

    Поскольку Patroni самостоятельно обрабатывает повторные попытки, он опирается на старое поведение kazoo, согласно которому запросы к кластеру Zookeeper немедленно отбрасываются, когда нет доступных соединений.

  • Явно указывать версию кластера etcd v3 при подключении через прокси (Alexander Kukushkin)

    Patroni работает с кластером etcd v3 через gPRC-шлюз, и в зависимости от версии кластера необходимо использовать различные конечные точки /v3, /v3beta или /v3alpha. Версия была определена только совместно с топологией кластера, но поскольку последняя никогда не определялась при подключении через прокси.


Версия 2.0.2

Выпущено 2021-02-22

Новые возможности

  • Возможность игнорировать репликационные слоты, управляемые извне (James Coleman)

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

  • Добавлена поддержка ограничения на выбор набора шифров для REST API (Gunnar “Nick” Bluth)

    Его можно было настроить через restapi.ciphers или переменную окружения PATRONI_RESTAPI_CIPHERS.

  • Добавлена поддержка для зашифрованных TLS ключей для REST API (Jonathan S. Katz)

    Его можно было настроить через restapi.keyfile_password или переменную окружения PATRONI_RESTAPI_KEYFILE_PASSWORD.

  • Сравнение учетных данных REST и API с постоянной задержкой (Alex Brasetvik)

    Используйте hmac.compare_digest() вместо ==, который подвержен атакам, основанным на времени.

  • Выбирайте узлы, работающие в синхронном режиме, на основе отставания в репликации (Krishna Sarabu)

    Если отставание в репликации на синхронном узле начинает превышать заданный порог, его можно понизить до асинхронного и/или заменить другим узлом. Поведение контролируется с помощью maximum_lag_on_syncnode.

Повышение стабильности

  • Запустите PostgreSQL с hot_standby = off при выполнении пользовательской начальной инициализации (Igor Yanchenko)

    Во время пользовательской начальной инициализации Patroni восстанавливает резервную копию, запускает PostgreSQL и ожидает завершения восстановления. Некоторые параметры PostgreSQL на резервном сервере не должны быть меньше, чем на первичном, и если новое значение (восстановленное из WAL) больше, чем сконфигурированное, PostgreSQL падает и останавливается. Чтобы избежать такого поведения, мы выполним пользовательскую начальную инициализацию без режима hot_standby.

  • Предупредить пользователя, если требуемый сторожевой таймер не работает (Nicolas Thauvin)

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

  • Улучшенная детализация процесса восстановления в однопользовательском режиме (Alexander Kukushkin)

    Если Patroni обнаружит, что PostgreSQL не был завершен корректно, в определенных случаях выполняется восстановление путем запуска PostgreSQL в однопользовательском режиме. Возможно, что восстановление завершится неудачно (например, из-за нехватки места на диске), но ошибки будут проигнорированы.

  • Добавлена совместимость с python-consul2 (Alexander Kukushkin, Wilfried Roset)

    Старая, но проверенная python-consul уже несколько лет не поддерживается, поэтому кто-то создал форк с новыми функциями и исправлениями ошибок.

  • Не используйте bypass_api_service при выполнении patronictl (Alexander Kukushkin)

    Когда под K8s выполняется в не default пространстве имён, у него может не хватать прав для запроса к конечной точке kubernetes . В этом случае Patroni выводит предупреждение и игнорирует настройку bypass_api_service. В случае patronictl это предупреждение было немного раздражающим.

  • Создать raft.data_dir, если он не существует, или убедиться, что он доступен для записи (Mark Mercado)

    Улучшает удобство использования и понятность для пользователя.

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

  • Не прерывайте перезапуск или продвижение, если потеряна блокировка лидера в режиме ожидания (Alexander Kukushkin)

    В режиме ожидания разрешено запускать PostgreSQL в качестве первичного сервера без блокировки.

  • Устраненная проблема с shutdown_request() в REST API (Nicolas Limage)

    Для улучшения обработки SSL соединений и отсрочки рукопожатия до запуска потока, Patroni переопределяет несколько методов в HTTPServer. Метод shutdown_request() был упущен.

  • Устранен проблема со временем сна при использовании Zookeeper (Alexander Kukushkin)

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

  • Исправлена некорректная работа os.symlink() при перемещении каталога данных после неудачной начальной инициализации (Andrew L’Ecuyer)

    Если начальная инициализация завершилась неудачно, Patroni переименовывает каталог данных, pg_wal, и все таблицы. Затем она обновляет символические ссылки, чтобы файловая система оставалась согласованной. Создание символических ссылок не удавалось из-за перепутанных аргументов src и dst.

  • Исправлена ошибка в методе post_bootstrap (Alexander Kukushkin)

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

  • Исправлена проблема pg_rewind в резервном кластере (Alexander Kukushkin)

    Если имя суперпользователя отличается от Postgres, то резервный сервер в кластере pg_rewind работал некорректно, поскольку строка соединения не содержала имя базы данных.

  • Выход должен осуществляться только в случае явного неуспеха аутентификации с использованием etcd v3 (Alexander Kukushkin)

    При запуске Patroni выполняет обнаружение топологии кластера etcd и аутентификацию, если это необходимо. Возможно, один из серверов etcd недоступен, и Patroni пытается выполнить аутентификацию на этом сервере, но не удается, вместо этого Patroni не пытается выполнить аутентификацию на следующем узле.

  • Обработка случая, когда cmdline() возвращает пустой список (Alexander Kukushkin)

    Зомби-процессы по-прежнему являются дочерними процессами postmaster, но у них отсутствует cmdline()

  • Рассматривайте переменную окружения PATRONI_KUBERNETES_USE_ENDPOINTS как логическое значение (Alexander Kukushkin)

    Не это приводило к невозможному отключению kubernetes.use_endpoints через переменные окружения.

  • Улучшить обработку ошибок при одновременном обновлении конечных точек (Alexander Kukushkin)

    Patroni явно запросит текущий объект конечной точки, убедится, что текущий под действительно удерживает блокировку лидера, и повторит обновление.


Версия 2.0.1

Выпущено 2020-10-01

Новые возможности

  • Используйте more в качестве пейджера в patronictl edit-config, если less недоступен (Pavel Golub)

    На Windows это будет more.com. Кроме того, cdiff был изменён на ydiff в requirements.txt, однако patronictl по-прежнему поддерживает оба варианта ради совместимости.

  • Добавлена поддержка raft, bind_addr и password (Alexander Kukushkin)

    raft.bind_addr может быть полезен при работе за NAT. raft.password включает шифрование трафика (требует модуля cryptography).

  • Добавлена поддержка параметра sslpassword “соединение” (Kostiantyn Nemchenko)

    Параметр соединения был введен в PostgreSQL 13.

Повышение стабильности

  • Изменили поведение в режиме паузы (Alexander Kukushkin)

    1. Patroni не будет вызывать метод bootstrap, если каталог PGDATA отсутствует или пуст.
    2. Patroni не завершит работу при несовпадении sysid в режиме паузы, а только запишет предупреждение.
    3. Узел не будет пытаться захватить ключ лидера в режиме паузы, если Postgres работает не в режиме восстановления (принимает записи), но sysid не совпадает с ключом initialize.
  • Применять master_start_timeout при выполнении восстановления после сбоя (Alexander Kukushkin)

    Если PostgreSQL упал на узле, являющемся лидером, Patroni выполняет восстановление после сбоя, запуская PostgreSQL в однопользовательском режиме. Во время восстановления после сбоя обновляется блокировка лидера. Если восстановление после сбоя не завершится в течение master_start_timeout секунд, Patroni прервет его и освободит блокировку лидера.

  • Удалено из требований urllib3 лишнее secure (Alexander Kukushkin)

    Единственная причина добавления его туда заключалась в необходимости ipaddress для Python 2.7.

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

  • Исправлена ошибка в Kubernetes.update_leader() (Alexander Kukushkin)

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

  • Исправлена проблема с зависанием patronictl при использовании RAFT (Alexander Kukushkin)

    При использовании patronictl с конфигурацией Patroni, необходимо добавить self_addr в partner_addrs.

  • Исправлена ошибка get_guc_value() (Alexander Kukushkin)

    Patroni не мог получить значение restore_command в PostgreSQL 12, поэтому попытки восстановить отсутствующие WAL-файлы pg_rewind не увенчались успехом.


Версия 2.0.0

Выпущено 2020-09-02

Эта версия улучшает совместимость с PostgreSQL 13, добавляет поддержку нескольких синхронных резервных серверов, имеет значительные улучшения в обработке pg_rewind, добавляет поддержку etcd v3 и Patroni на чистом RAFT (без etcd, Consul или Zookeeper), и позволяет опционально вызывать скрипт pre_promote (защиты).

Поддержка PostgreSQL 13

  • Не запускайте on_reload при переходе в режим лидера standby_leader на PostgreSQL 13+ (Alexander Kukushkin)

    Когда мы повышаем standby_leader, мы изменяем primary_conninfo, обновляем роль и перезагружаем Postgres. Поскольку on_role_change и on_reload по сути являются одинаковыми, Patroni будет вызывать только on_role_change.

  • Добавлена поддержка параметров gssencmode и channel_binding для соединения (Alexander Kukushkin)

    PostgreSQL 12 ввел параметры gssencmode и 13 channel_binding, и теперь они могут использоваться, если определены в разделе postgresql.authentication.

  • Обработка переименования wal_keep_segments в wal_keep_size (Alexander Kukushkin)

    В случае неправильной конфигурации (на wal_keep_segments и 13, а также на wal_keep_size в старых версиях) Patroni автоматически скорректирует конфигурацию.

  • Используйте pg_rewind в сочетании с --restore-target-wal в 13, если это возможно (Alexander Kukushkin)

    На PostgreSQL 13 Patroni проверяет, настроена ли restore_command, и сообщает pg_rewind о необходимости её использования.

Новые возможности

  • BETABETA

    Реализована поддержка Patroni на чистом RAFT (Alexander Kukushkin)

    Это позволяет запускать Patroni без сторонних зависимостей (3rd party), таких как Etcd, Consul или Zookeeper. Для высокой доступности потребуется либо три узла Patroni, либо два узла Patroni и один узел с patroni_raft_controller. Дополнительные сведения приведены в документации .

  • BETABETA

    Реализована поддержка протокола etcd v3 через gPRC-gateway (Alexander Kukushkin)

    etcd 3.0 был выпущен более чем четыре года назад, а etcd 3.4 имеет отключенную версию 2 по умолчанию. Также существует вероятность полного удаления версии 2 из etcd, поэтому мы реализовали поддержку etcd v3 в Patroni. Чтобы начать её использовать, необходимо явно создать раздел etcd3 в файле конфигурации Patroni.

  • Поддержка нескольких синхронных резервных серверов (Krishna Sarabu)

    Это позволяет запускать кластер с несколькими синхронными репликами. Максимальное количество синхронных реплик контролируется новым параметром synchronous_node_count. По умолчанию он установлен в 1 и не оказывает никакого влияния, когда synchronous_mode установлено в off.

  • Добавлена возможность вызова скрипта pre_promote (Sergey Dudoladov)

    В отличие от обратных вызовов, сценарий pre_promote вызывается синхронно после получения блокировки лидера, но до повышения Postgres. Если сценарий завершается с ошибкой или выходит с ненулевым кодом возврата, текущий узел освободит блокировку лидера.

  • Добавлена поддержка каталогов конфигурации (Floris van Nee)

    YAML файлы в каталоге загружаются и применяются в алфавитном порядке.

  • Продвинутая проверка параметров PostgreSQL (Alexander Kukushkin)

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

  • Активируйте основной поток при завершении принудительной проверки после повышения (Alexander Kukushkin)

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

  • Использование представления pg_stat_wal_receiver в 9.6+ (Alexander Kukushkin)

    Вид содержит актуальные значения primary_conninfo и primary_slot_name, в то время как содержимое recovery.conf может быть устаревшим.

  • Улучшенная обработка IPv6-адресов в файле конфигурации Patroni (Mateusz Kowalski)

    IPv6-адрес должен быть заключен в квадратные скобки, но Patroni ожидал получить его в виде обычного текста. Теперь поддерживаются оба формата.

  • Добавлена конфигурационная опция Consul service_tags (Robert Edström)

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

  • Реализована поддержка SSL для Zookeeper (Kostiantyn Nemchenko)

    Для этого требуется kazoo>=2.6.0.

  • Реализована опция no_params для пользовательского метода начальной инициализации (Kostiantyn Nemchenko)

    Оно позволяет вызывать wal-g, pgBackRest и другие инструменты резервного копирования, не используя оболочные скрипты.

  • Переместите WAL и пространства таблиц после неудачной инициализации (Feike Steenbergen)

    При выполнении reinit Patroni уже удалял не только PGDATA, но и символические ссылки на WAL, а также каталоги таблиц и таблицы. Теперь метод move_data_directory() будет выполнять аналогичную задачу, i.e. переименовывает WAL каталоги и таблицы, а также обновляет символические ссылки в PGDATA.

Улучшена поддержка pg_rewind

  • Улучшена проверка на расхождение временных шкал (Alexander Kukushkin)

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

  • Попытайтесь получить отсутствующий WAL, если pg_rewind сообщает о проблеме (Alexander Kukushkin)

    Возможно, что сегмент WAL, необходимый для pg_rewind, больше не находится в каталоге pg_wal, и, следовательно, pg_rewind не может найти местоположение контрольной точки до точки разрыва. Начиная с PostgreSQL 13 pg_rewind можно использовать restore_command для получения отсутствующих WAL. Для более старых версий PostgreSQL Patroni анализирует ошибки неудачной попытки перемотки и пытается получить отсутствующие WAL, вызывая restore_command самостоятельно.

  • Обнаружить новую временную шкалу в резервном кластере и инициировать перемотку/переинициализацию, если это необходимо (Alexander Kukushkin)

    Кластер standby_cluster отвязан от первичного кластера и поэтому не сразу узнаёт о выборах лидера и смене временных шкал. Чтобы обнаружить факт смены, standby_leader периодически проверяет наличие новых файлов истории в pg_wal.

  • Укоротить и улучшить вывод журнала истории (Alexander Kukushkin)

    Когда Patroni пытается определить необходимость pg_rewind, он может извлечь содержимое файла истории с первичного сервера и записать его в лог. Файл истории увеличивается с каждым переключением/плановым переключением и в конечном итоге занимает слишком много строк, большинство из которых не являются полезными. Вместо отображения исходных данных, Patroni отобразит только 3 строк до текущей временной шкалы реплики и 2 строк после нее.

Улучшения для K8s

  • Удалите модуль kubernetes для Python (Alexander Kukushkin)

    Официальный клиент Python для Kubernetes содержит много автогенерируемого кода и, следовательно, очень тяжёлый. Patroni использует лишь небольшую часть конечных точек K8s API, и реализация поддержки для них не представляла сложности.

  • Обеспечить возможность обхода Kubernetes сервиса (Alexander Kukushkin)

    Когда Patroni работает в K8s, он обычно взаимодействует с K8s API через сервис kubernetes , адрес которого указывается в переменной окружения KUBERNETES_SERVICE_HOST. Как и любой другой сервис, сервис kubernetes управляется kube-proxy, который, в свою очередь, в зависимости от конфигурации, либо использует пользовательскую программу, либо iptables для маршрутизации трафика. Пренебрегая промежуточным компонентом и подключаясь напрямую к узлам K8s master, мы можем реализовать более эффективную стратегию повторных попыток и снизить риски деградации Postgres при обновлении узлов K8s master.

  • Синхронизация циклов высокой доступности всех подов кластера Patroni (Alexander Kukushkin)

    Не это приводило к увеличению времени обнаружения сбоев с ttl до ttl + loop_wait.

  • Заполните references и nodename в подмножествах адресов на K8s (Alexander Kukushkin)

    Некоторые балансировщики нагрузки используют эту информацию.

  • Устранить возможные условия гонки в update_leader() (Alexander Kukushkin)

    Одновременное обновление конфигурации лидера или конечной точки, происходящее вне Patroni, может привести к неудаче вызова update_leader(). В этом случае Patroni проверяет, что текущий узел по-прежнему владеет блокировкой лидера, и повторяет обновление.

  • Явно запретить обновление конфигурации несуществующих файлов (Alexander Kukushkin)

    Для DCS, отличного от kubernetes , вызов PATCH завершается с исключением из-за того, что cluster.config является None, но в Kubernetes он успешно создавал аннотацию конфигурации и запрещал запись конфигурации начальной инициализации после завершения начальной инициализации.

  • Исправлена ошибка в pause (Alexander Kukushkin)

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

Улучшения REST API

  • Отложить установку TLS до запуска потока рабочего процесса (Alexander Kukushkin, Ben Harris)

    Если рукопожатие TLS было выполнено в потоке API, и клиент не отправлял никаких данных, то поток API был заблокирован (что создавало риск DoS).

  • Проверьте basic-auth независимо от сертификата клиента в REST API (Alexander Kukushkin)

    Ранее проверялась только сертификат клиента. Независимая проверка двух параметров является абсолютно допустимым сценарием использования.

  • Добавьте двойной CRLF после заголовков HTTP запроса OPTIONS (Sergey Burladyan)

    HAProxy был доволен одним CRLF, в то время как проверка состояния Consul жаловалась на разорванное соединение и неожиданный EOF.

  • GET /cluster отображал устаревшую информацию об участниках кластера Zookeeper (Alexander Kukushkin)

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

  • Фиксированные проверки работоспособности для кластера резервных серверов (Alexander Kukushkin)

    Ошибочно отвечали GET /standby-leader для мастера и GET /master для standby_leader с 200.

  • Реализовано DELETE /switchover (Alexander Kukushkin)

    Вызов REST API удаляет запланированное переключение.

  • Созданы конечные точки /readiness и /liveness (Alexander Kukushkin)

    Они могут быть полезны для удаления «нездоровых» подов из подмножества адресов при использовании сервиса K8s с выборками по меткам.

  • Улучшены GET /replica и GET /async REST API проверки работоспособности (Krishna Sarabu, Alexander Kukushkin)

    Проверки теперь поддерживают необязательный ключевое слово ?lag=<max-lag> и будут отвечать 200 только в том случае, если отставание меньше указанного значения. Если вы используете эту функцию, пожалуйста, обратите внимание, что информация о позиции WAL на лидере обновляется только каждые loop_wait секунд!

  • Добавлена поддержка пользовательских заголовков HTTP в ответах REST API (Yogesh Sharma)

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

Улучшения patronictl

  • Не пытайтесь обращаться к несуществующему лидеру patronictl pause (Alexander Kukushkin)

    При приостановке кластера без лидера в K8s, patronictl выводил предупреждения о том, что участник “None” недоступен.

  • Обработать ситуацию, когда участник conn_url отсутствует (Alexander Kukushkin)

    На K8s возможно, что у пода отсутствуют необходимые аннотации, поскольку Patroni ещё не запущен. Это приводило к сбою patronictl .

  • Добавлена возможность вывода топологии ASCII кластера (Maxim Fedotov, Alexander Kukushkin)

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

  • Реализовать patronictl flush switchover (Alexander Kukushkin)

    До этого patronictl flush поддерживал только отмену запланированных перезапусков.

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

  • Ошибка атрибута во время начальной инициализации кластера с существующим PGDATA (Krishna Sarabu)

    При попытке создать/обновить ключ /history, Patroni обращался к объекту ClusterConfig, который ещё не был создан в DCS.

  • Улучшена обработка исключений в Consul (Alexander Kukushkin)

    Необработанное исключение в методе touch_member() привело к аварийному завершению всего процесса Patroni.

  • Обеспечить выполнение synchronous_commit=local для скрипта post_init (Alexander Kukushkin)

    Patroni уже выполнял это при создании пользователей replication, rewind, но не выполнял его в случае post_init, что было ошибкой. В результате, если скрипт не выполнял это самостоятельно, начальная инициализация , synchronous_mode, не могла завершиться.

  • Увеличение maxsize в менеджере пула Consul (ponvenkates)

    Со значением по умолчанию size=1 были сгенерированы предупреждения.

  • Patroni некорректно сообщал о запуске Postgres (Alexander Kukushkin)

    Состояние не обновлялось, например, когда PostgreSQL выходили из-за ошибки нехватки дискового пространства.

  • Поместите * в pgpass вместо отсутствующих или пустых значений (Alexander Kukushkin)

    Если, например, standby_cluster.port не указан, то файл pgpass был создан некорректно.

  • Пропускать создание слота репликации на узле-лидере, если он содержит специальные символы (Krishna Sarabu)

    Patroni создаёт спящий слот (когда slots определено) для узла-лидера, когда имя содержит специальные символы, такие как ‘-’, (для e.g, например, “abc-us-1”).

  • Избегайте удаления несуществующих pg_hba.conf в пользовательской начальной инициализации (Krishna Sarabu)

    Patroni завершался неудачно, если pg_hba.conf находился за пределами директории pgdata после пользовательской начальной инициализации.


Версия 1.6.5

Выпущено 2020-08-23

Новые возможности

  • Тайм-аут остановки мастера (Krishna Sarabu)

    Количество секунд, которое Patroni может ожидать при остановке Postgres. Действует только при включении , synchronous_mode, . Если установлено значение больше 0 и включено , synchronous_mode, , Patroni отправляет SIGKILL в postmaster, если операция остановки выполняется дольше, чем значение, установленное master_stop_timeout. Установите значение в соответствии с вашим соотношением надежности/доступности. Если параметр не установлен или имеет значение, не равное нулю, master_stop_timeout не оказывает никакого эффекта.

  • Не создавайте постоянный физический слот с именем первичного сервера (Alexander Kukushkin)

    Это распространенная проблема, когда первичный сервер перераспределяет WAL сегменты, в то время как реплика находится в неактивном состоянии. Теперь у нас есть хорошее решение для статических кластеров с фиксированным количеством узлов и именами, которые никогда не меняются. Вам просто нужно перечислить имена всех узлов в slots, чтобы первичный сервер не удалял сегмент, когда узел не зарегистрирован в DCS.

  • Первый вариант конфигурационного валидатора (Igor Yanchenko)

    Используйте patroni --validate-config patroni.yaml для проверки конфигурации Patroni.

  • Возможность настроить максимальную длину истории временной шкалы (Krishna Sarabu)

    Patroni записывает историю переключений при отказе/планового переключения в ключ /history в DCS. Со временем размер этого ключа становится большим, но в большинстве случаев интересны только последние несколько строк. Параметр max_timelines_history позволяет указать максимальное количество элементов временной шкалы, которые необходимо хранить в DCS.

  • Совместимость с Kazoo 2.7.0 (Danyal Prout)

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

Улучшения patronictl

  • Показать теги участников (Kostiantyn Nemchenko, Alexander Kukushkin)

    Теги настраиваются индивидуально для каждого узла, и не было простого способа получить общий обзор их.

  • Улучшить вывод участников (Alexander Kukushkin)

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

$ patronictl list
+ Cluster: batman (6813309862653668387) +---------+----+-----------+---------------------+
|    Member   |      Host      |  Role  |  State  | TL | Lag in MB | Tags                |
+-------------+----------------+--------+---------+----+-----------+---------------------+
| postgresql0 | 127.0.0.1:5432 | Leader | running |  3 |           | clonefrom: true     |
|             |                |        |         |    |           | noloadbalance: true |
|             |                |        |         |    |           | nosync: true        |
+-------------+----------------+--------+---------+----+-----------+---------------------+
| postgresql1 | 127.0.0.1:5433 |        | running |  3 |       0.0 |                     |
+-------------+----------------+--------+---------+----+-----------+---------------------+
  • Выдавать ошибку, если указан файл конфигурации, но он не найден (Kaarel Moppel)

    Ранее patronictl сообщал только об одном DEBUG сообщении.

  • Устранена проблема с непроинициализированным K8s-подом, приводящим к сбоям patronictl (Alexander Kukushkin)

    Patroni опирается на определенные аннотации для контейнеров в K8s. Когда один из контейнеров Patroni останавливается или запускается, соответствующих аннотаций еще нет, и patronictl выдавал исключение.

Повышение стабильности

  • Применить задержку 1 при неудаче вызова сервера K8s LIST API (Alexander Kukushkin)

    В основном необходимо избегать перегрузки логов, но также это помогает предотвратить зависание основного потока.

  • Повторите попытку, если возвращается retry-after HTTP заголовок от K8s API (Alexander Kukushkin)

    Если сервер K8s API перегружен запросами, он может запросить повторную попытку.

  • Очистите KUBERNETES_ окружение от почтового сервера (Feike Steenbergen)

    Переменные окружения KUBERNETES_ не требуются для PostgreSQL, однако их раскрытие для postmaster также раскрывает их для бэкендов и обычных пользователей базы данных (например, с использованием pl/perl).

  • Очистка табличных пространств при повторном инициализации (Krishna Sarabu)

    Во время повторной инициализации Patroni удалял только PGDATA и оставлял пользовательские каталоги таблиц. Это приводило к тому, что Patroni зацикливался при повторной инициализации. Предыдущее решение этой проблемы заключалось в реализации пользовательского скрипта для начальной инициализации .

  • Непосредственно выполнить CHECKPOINT после продвижения (Alexander Kukushkin)

    Это помогает сократить время, необходимое для использования нового первичного сервера pg_rewind.

  • Умное обновление участников etcd (Alexander Kukushkin)

    В случае, если Patroni не смог выполнить запрос на всех участниках кластера etcd, Patroni будет повторно проверять A или SRV записи на предмет изменений IP-адресов/хостов перед повторной попыткой.

  • Пропускать отсутствующие значения из pg_controldata (Feike Steenbergen)

    Значения отсутствуют при попытке использовать бинарные файлы версии, которая не соответствует PGDATA. Patroni попытается запустить Postgres, и Postgres сообщит, что основная версия не соответствует, и завершит работу с ошибкой.

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

  • Отключить проверку SSL для Consul при необходимости (Julien Riou)

    Начиная с определенной версии urllib3, необходимо явно установить cert_reqs в значение ssl.CERT_NONE, чтобы эффективно отключить проверку SSL.

  • Избегайте открытия соединения репликации на каждом цикле цикла отказоустойчивости (Alexander Kukushkin)

    Ошибку было внесено в 1.6.4.

  • Вызвать обратный вызов on_role_change при отказе первичного сервера (Alexander Kukushkin)

    В определенных случаях это может привести к тому, что виртуальный IP-адрес останется привязанным к старому первичному серверу. Ошибка была внесена в 1.4.5.

  • Сбросить состояние отката, если PostgreSQL был запущен после успешного pg_rewind (Alexander Kukushkin)

    В результате этой ошибки Patroni запускался, при этом PostgreSQL автоматически отключался в режиме паузы.

  • Преобразуйте recovery_min_apply_delay в ms при проверке recovery.conf

    Patroni непрерывно перезапускал реплику, если recovery_min_apply_delay было настроено в PostgreSQL, выпущенной до 12.

  • Совместимость с PyInstaller (Alexander Kukushkin)

    PyInstaller создает (упаковывает) приложения Python в автономные исполняемые файлы. Совместимость была нарушена, когда мы перешли от метода spawn вместо fork для multiprocessing.


Версия 1.6.4

Выпущено 2020-01-27

Новые возможности

  • Реализована опция --wait для patronictl reinit (Igor Yanchenko)

    Patronictl будет ждать завершения reinit, если используется опция --wait.

  • Дальнейшее улучшение поддержки Windows (Igor Yanchenko, Alexander Kukushkin)

    1. Все скрипты оболочки, используемые для интеграционных тестов, переписываются на Python.
    2. Команда pg_ctl kill будет использоваться для остановки PostgreSQL на не-POSIX системах.
    3. Не пытайтесь использовать сокеты Unix-домена.

Повышение стабильности

  • Убедитесь, что unix_socket_directories и stats_temp_directory существуют (Igor Yanchenko)

    При запуске Patroni и Postgres убедитесь, что unix_socket_directories и stats_temp_directory существуют, или попробуйте их создать. Patroni завершится, если не удастся их создать.

  • Убедитесь, что postgresql.pgpass находится в месте, где Patroni имеет права на запись (Igor Yanchenko)

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

  • Отключить проверку Consul serfHealth по умолчанию (Kostiantyn Nemchenko)

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

  • Настроить keepalives для TCP-соединений с K8s API (Alexander Kukushkin)

    В случае, если мы не получим никакой информации от сокета после TTL секунд, его можно считать неактивным.

  • Избегайте ведения журнала паролей при создании пользователя (Alexander Kukushkin)

    Если пароль отклонен или ведение журнала настроено на подробный режим или вообще не настроено, то пароль может быть записан в логи PostgreSQL. Чтобы этого избежать, Patroni изменит log_statement, log_min_duration_statement и log_min_error_statement на безопасные значения перед попыткой создания/обновления пользователя.

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

  • Используйте restore_command из конфигурации standby_cluster для создания реплик в кластере (Alexander Kukushkin)

    Функция standby_leader уже была реализована изначально, и эта функция существовала. Отсутствие её реализации на репликах может помешать им синхронизироваться с резервным лидером.

  • Обновить временную шкалу, предоставленную резервным кластером (Alexander Kukushkin)

    В случае смены временной шкалы, резервный кластер корректно копировал данные с первичного сервера, но patronictl сообщал о старой временной шкале.

  • Предоставьте возможность определять определенные параметры восстановления в custom_conf (Alexander Kukushkin)

    Когда выполняется проверка параметров восстановления на реплике Patroni, будут пропущены archive_cleanup_command, promote_trigger_file, recovery_end_command, recovery_min_apply_delay и restore_command, если они не определены в конфигурации Patroni, но определены в других файлах, отличных от postgresql.auto.conf и postgresql.conf.

  • Улучшить обработку параметров PostgreSQL, содержащих точку в их имени (Alexander Kukushkin)

    Такие параметры могут быть определены с помощью расширений, где единица не обязательно является строкой. Изменение значения может потребовать перезапуска (например, pg_stat_statements.max).

  • Улучшить обработку исключений при завершении работы (Alexander Kukushkin)

    Во время завершения работы Patroni пытается обновить свой статус в DCS. Если DCS недоступно, может возникнуть исключение. Отсутствие обработки исключений препятствовало остановке потока логгера.


Версия 1.6.3

Выпущено 2019-12-05

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

  • Не раскрывайте пароль при запуске pg_rewind (Alexander Kukushkin)

    Ошибка была внесена в #1301

  • Применить параметры соединения, указанные в postgresql.authentication, к pg_basebackup и использовать собственные методы создания реплик (Alexander Kukushkin)

    Они полагались на строку соединения, похожую на URL, и, следовательно, параметры никогда не применялись.


Версия 1.6.2

Выпущено 2019-12-05

Новые возможности

  • Реализовано patroni --version (Igor Yanchenko)

    Отображает текущую версию Patroni и завершает работу.

  • Установите заголовок user-agent HTTP для всех HTTP-запросов (Alexander Kukushkin)

    Patroni взаимодействует с Consul, etcd и Kubernetes API посредством протокола http. Использование специально разработанного user-agent (например, Patroni/1.6.2 Python/3.6.8 Linux) может быть полезным для отладки и мониторинга.

  • Обеспечить возможность настройки уровня логирования для трассировок исключений (Igor Yanchenko)

    Если вы установите log.traceback_level=DEBUG, то трассировки будут видны только при log.level=DEBUG. По умолчанию поведение остается прежним.

Повышение стабильности

  • Избегайте импорта всех DCS модулей при поиске модуля, требуемого файлом конфигурации (Alexander Kukushkin)

    Не требуется импортировать модули для etcd, Consul и Kubernetes, если нам необходимо только e.g. Zookeeper. Это помогает снизить потребление памяти и решить проблему, связанную с сообщениями INFO и Failed to import smth.

  • Удалено модуль python requests из явных требований (Alexander Kukushkin)

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

  • Улучшить обработку etcd.hosts, представленного в виде строки, разделенной запятыми, вместо массива YAML (Igor Yanchenko)

    Ранее возникали ошибки при записи в формате host1:port1, host2:port2 (пробел после запятой).

Улучшения удобства использования

  • Не заставляйте пользователей выбирать участников из пустого списка в patronictl (Igor Yanchenko)

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

  • Сделайте сообщение об ошибке более информативным, если REST API не могут быть сопоставлены (Igor Yanchenko)

    Для неопытного пользователя может быть сложно понять, в чем заключается проблема, исходя из трассировки стека Python.

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

  • Исправить расчет wal_buffers (Alexander Kukushkin)

    Единица измерения была изменена с 8 kB блоков на байты в PostgreSQL 11.

  • Используйте passfile в primary_conninfo только в PostgreSQL 10+ (Alexander Kukushkin)

    На старых версиях нет гарантии, что passfile будет работать, если установлена последняя версия libpq.


Версия 1.6.1

Выпущено 2019-11-15

Новые возможности

  • Добавлена переменная окружения PATRONICTL_CONFIG_FILE (msvechla)

    Это позволяет настраивать аргумент --config-file для patronictl из окружения.

  • Реализовать patronictl history (Alexander Kukushkin)

    Отображает историю переключений при отказе/планового переключения.

  • Передавайте -c statement_timeout=0 в PGOPTIONS при выполнении pg_rewind (Alexander Kukushkin)

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

  • Разрешить использование более низких значений для конфигурации PostgreSQL (Soulou)

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

  • Предусмотрите возможность аутентификации на основе сертификатов (Jonathan S. Katz)

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

  • Используйте passfile в primary_conninfo вместо пароля (Alexander Kukushkin)

    Это позволяет избежать установки разрешений 600 на postgresql.conf

  • Выполнять pg_ctl reload независимо от изменений конфигурации (Alexander Kukushkin)

    Возможно, некоторые файлы конфигурации не управляются Patroni. Когда кто-либо выполняет перечитывание конфигурации через REST API или отправляет SIGHUP процессу Patroni, обычно ожидается, что будет перечитан и Postgres. Ранее этого не происходило, когда в секции postgresql конфигурации Patroni не было изменений.

  • Сравните все параметры восстановления, включая primary_conninfo (Alexander Kukushkin)

    Ранее метод check_recovery_conf() проверял только, изменилось ли primary_conninfo, не учитывая при этом все остальные параметры восстановления.

  • Обеспечить возможность применения некоторых параметров восстановления без перезапуска (Alexander Kukushkin)

    Начиная с PostgreSQL 12, следующие параметры восстановления можно изменять без перезапуска: archive_cleanup_command, promote_trigger_file, recovery_end_command и recovery_min_apply_delay. В будущих версиях PostgreSQL этот список будет расширен, и Patroni автоматически его поддержит.

  • Обеспечить возможность изменения use_slots в режиме онлайн (Alexander Kukushkin)

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

  • Удалять только переменные окружения, начинающиеся с PATRONI_ при запуске Postgres (Cody Coons)

    Это решит многие проблемы, связанные с работой различных внешних драйверов данных.

Повышение стабильности

  • Используйте LIST и WATCH при работе с K8s API (Alexander Kukushkin)

    Позволяет эффективно получать изменения объектов (поды, эндпоинты, конфигмапы) и снижает нагрузку на узлы-мастера K8s.

  • Улучшить рабочий процесс, когда PGDATA не является пустым во время начальной инициализации (Alexander Kukushkin)

    Согласно исходному коду initdb, он может считать, что значение PGDATA является пустым, когда в нем присутствуют только lost+found и .dotfiles. В настоящее время Patroni делает то же самое. Если PGDATA не является пустым, и при этом не соответствует требованиям pg_controldata, Patroni выдаст ошибку и завершится работу.

  • Следует избегать вызова дорогостоящих операций os.listdir() на каждом цикле обеспечения высокой доступности (Alexander Kukushkin)

    Когда система испытывает нагрузку на ввод-вывод, os.listdir() может занимать несколько секунд (или даже минут), что негативно влияет на цикл отказоустойчивости Patroni. Это может даже привести к исчезновению ключа лидера из DCS из-за отсутствия обновлений. Существует более эффективный и экономичный способ проверить, что PGDATA не пуст. Сейчас мы проверяем наличие файла global/pg_control в PGDATA.

  • Некоторые улучшения в инфраструктуре ведения журнала (Alexander Kukushkin)

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

  • Используйте метод запуска multiprocessing spawn в Python 3.4+ (Maciej Kowalczyk)

    Это известная проблема в Python, что многопоточность и многопроцессорность плохо сочетаются. Переход от стандартного метода fork к spawn является рекомендуемым способом решения. Если этого не сделать, процесс Postmaster может зависнуть, а Patroni будет непрерывно сообщать об ошибке INFO: restarting after failure in progress, в то время как Postgres фактически работает.

Улучшения REST API

  • Обеспечить возможность проверки клиентских сертификатов в REST API (Alexander Kukushkin)

    Если verify_client установлено в required, Patroni будет проверять сертификаты клиентов для всех REST API вызовов. Когда оно установлено в optional, сертификаты клиентов проверяются для всех небезопасных REST API конечных точек.

  • Возвращайте код ответа 503 для запроса проверки работоспособности GET /replica, если PostgreSQL не запущен (Alexander Anikin)

    PostgreSQL может тратить значительное время на восстановление, прежде чем начать принимать соединения от клиентов.

  • Реализуйте конечные точки /history и /cluster (Alexander Kukushkin)

    Конечная точка /history отображает содержимое ключа history в DCS. Конечная точка /cluster отображает всех участников кластера и некоторую информацию о сервисах, такую как запланированные перезапуски или переключения.

Улучшения поддержки Etcd

  • Повторить операцию при внутренней ошибке etcd RAFT (Alexander Kukushkin)

    Когда узел etcd завершает работу, он отправляет response code=300, data='etcdserver: server stopped', что приводило к понижению первичного сервера в Patroni.

  • Не прекращайте попытки повторного запроса к etcd слишком рано (Alexander Kukushkin)

    При возникновении сетевых проблем, Patroni быстро исчерпывал список узлов etcd и отказывался от работы, не используя весь retry_timeout, что потенциально могло привести к понижению первичного сервера.

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

  • Отключить synchronous_commit при предоставлении прав выполнения пользователю pg_rewind (kremius)

    Если начальная инициализация выполняется с использованием synchronous_mode_strict: true, то оператор GRANT EXECUTE оставался в ожидании неопределенно долго из-за того, что узлы были недоступны.

  • Устранить утечку памяти в Python 3.7 (Alexander Kukushkin)

    Patroni использует ThreadingMixIn для обработки запросов REST API и создает потоки на основе python 3.7, которые по умолчанию не являются демонными.

  • Устранить условия гонки в асинхронных операциях (Alexander Kukushkin)

    Существовала вероятность, что patronictl reinit --force может быть перезаписано в результате попытки восстановить остановленный Postgres. Это привело к ситуации, когда Patroni пытался запустить Postgres во время выполнения операции резервного копирования.

  • Исправить условие гонки в методе postmaster_start_time() (Alexander Kukushkin)

    Если метод выполняется из потока REST API, то необходимо создать отдельный объект курсора.

  • Устраните проблему, связанную с отсутствием продвижения резервного сервера, имеющего имя, содержащее заглавные буквы (Alexander Kukushkin)

    Мы преобразовали имя в нижний регистр, поскольку PostgreSQL делало то же самое при сравнении application_name со значением в synchronous_standby_names.

  • Прежде чем запускать новый процесс, завершите все его дочерние процессы, а также процесс, выполняющий обратный вызов (Alexander Kukushkin)

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

  • Устранить проблему «не удалось запустить» (Alexander Kukushkin)

    При определенных условиях состояние Postgres может быть установлено в «неудачное запуск», несмотря на то, что Postgres работает.


Версия 1.6.0

Выпущено 2019-08-05

Эта версия добавляет совместимость с PostgreSQL 12, позволяет запускать pg_rewind без привилегий суперпользователя на PostgreSQL 11 и более новых версиях, а также обеспечивает поддержку IPv6.

Новые возможности

  • Пакет Psycopg2 был удален из списка зависимостей и должен быть установлен отдельно (Alexander Kukushkin)

    Начиная с 2.8.0, psycopg2 было разделено на два различных пакета, psycopg2 и psycopg2-binary, которые можно было установить одновременно в одном месте файловой системы. Чтобы уменьшить проблему зависимостей, мы предоставили пользователю возможность самостоятельно выбирать способ установки. Доступно несколько вариантов, пожалуйста, обратитесь к документации .

  • Совместимость с PostgreSQL 12 (Alexander Kukushkin)

    Начиная с PostgreSQL 12, параметр recovery.conf больше не существует, и все предыдущие параметры восстановления преобразованы в , GUC, . Чтобы защититься от ALTER SYSTEM SET primary_conninfo или подобных ситуаций, Patroni будет анализировать postgresql.auto.conf и удалять все параметры резервного копирования и восстановления из него. Конфигурация Patroni остается обратно совместимой. Например, несмотря на то, что restore_command является GUC, вы все еще можете указать его в разделе postgresql.recovery_conf.restore_command, и Patroni запишет его в postgresql.conf для PostgreSQL 12.

  • Обеспечить возможность использования pg_rewind без прав суперпользователя в PostgreSQL 11 и более новых версиях (Alexander Kukushkin)

    Если вы хотите использовать эту функцию, пожалуйста, определите username и password в разделе postgresql.authentication.rewind конфигурационного файла Patroni. Для уже существующего кластера вам потребуется создать пользователя вручную и предоставить ему GRANT EXECUTE разрешения на несколько функций. Подробную информацию можно найти в документации PostgreSQL .

  • Проведите интеллектуальное сравнение фактических и желаемых значений primary_conninfo на репликах (Alexander Kukushkin)

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

  • Поддержка IPv6 (Alexander Kukushkin)

    Существовали две основные проблемы. Сервис Patroni REST API работал только с адресами 0.0.0.0 и IPv6, а IP-адреса, используемые в api_url и conn_url, не были правильно оформлены.

  • Поддержка Kerberos (Ajith Vilas, Alexander Kukushkin)

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

  • Управление pg_ident.conf (Alexander Kukushkin)

    Эта функциональность работает аналогично pg_hba.conf: если postgresql.pg_ident определено в файле конфигурации или DCS, Patroni запишет его значение в pg_ident.conf, однако, если определено postgresql.parameters.ident_file, Patroni предполагает, что pg_ident управляется извне и не обновляет файл.

Улучшения REST API

  • Добавлен конечный /health (Wilfried Roset)

    Оно вернет код статуса HTTP только в том случае, если PostgreSQL работает

  • Добавлены конечные точки /read-only и /read-write (Julien Riou)

    Конечная точка /read-only обеспечивает сбалансированный доступ к чтению для реплик и первичного сервера. Конечная точка /read-write является псевдонимом для /primary, /leader и /master.

  • Используйте SSLContext для обертывания сокета REST API (Julien Riou)

    Использование ssl.wrap_socket() устарело и все еще позволяло использовать протоколы, которые вскоре будут объявлены устаревшими, такие как TLS и 1.1.

Улучшения ведения журнала

  • Двухэтапное ведение журнала (Alexander Kukushkin)

    Все сообщения журнала сначала записываются в оперативную очередь, а затем асинхронно выгружаются в stderr или файл отдельным потоком. Максимальный размер очереди ограничен (настраивается). Если лимит достигнут, Patroni начнет терять сообщения журнала, что все равно лучше, чем блокировать цикл обеспечения высокой доступности.

  • Включите ведение журнала отладки для вызовов GET/OPTIONS API вместе с задержкой (Jan Tomsa)

    Это поможет в отладке проверок работоспособности, выполняемых HAProxy, Consul или другими инструментами, которые определяют, какой узел является первичным/репликой.

  • Логировать исключения, которые были перехвачены в Retry (Daniel Kucera)

    Записывайте окончательное исключение, когда достигнуто либо количество попыток, либо тайм-аут. Это, вероятно, поможет в отладке некоторых проблем, когда связь с DCS не удается.

Улучшения patronictl

  • Улучшить диалоги для запланированного переключения и перезапуска (Rafia Sabih)

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

  • Проверьте, существует ли файл конфигурации (Wilfried Roset)

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

  • Добавьте резервное значение для EDITOR (Wilfried Roset)

    Когда переменная окружения EDITOR не была определена, patronictl edit-config завершалась с ошибкой PatroniCtlException. Новая стратегия заключается в попытке editor, а затем vi, которые должны быть доступны на большинстве систем.

Улучшения поддержки Consul

  • Предоставьте возможность указать режим согласованности Consul (Jan Tomsa)

    Вы можете узнать больше о режиме согласованности здесь .

  • Перезагрузите конфигурацию Consul SIGHUP (Cameron Daniel Kucera, Alexander Kukushkin)

    Особенно полезно, когда кто-то изменяет значение token.

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

  • Исправить краевой случай при переключении/резервировании (Sharoon Thomas)

    Переменная scheduled_at может быть неопределенной, если REST API недоступны, и мы используем DCS в качестве резервного варианта.

  • Откройте доступ для доверия к localhost pg_hba.conf во время пользовательской начальной инициализации (Alexander Kukushkin)

    Ранее доступ был открыт только для unix_socket, что приводило к большому количеству ошибок: FATAL: no pg_hba.conf entry for replication connection from host "127.0.0.1", user "replicator"

  • Рассматривайте синхронный узел как здоровый, даже когда предыдущий лидер находится впереди (Alexander Kukushkin)

    Если первичный узел теряет доступ к DCS, он перезапускает Postgres в режиме только для чтения, но может случиться, что другие узлы все еще могут получить доступ к старому первичному через REST API. Такая ситуация приводила к тому, что синхронная реплика не продвигалась, поскольку старый первичный сообщал о положении WAL, опережающем синхронную реплику.

  • Исправление ошибок в резервном кластере (Alexander Kukushkin)

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


Версия 1.5.6

Выпущено 2019-08-03

Новые возможности

  • Обеспечить работу с кластером etcd с помощью набора прокси (Alexander Kukushkin)

    Возможно, кластер etcd недоступен напрямую, но через набор прокси. В этом случае Patroni не будет выполнять обнаружение топологии etcd, а будет просто использовать круговую маршрутизацию через хосты прокси. Поведение контролируется etcd.use_proxies.

  • Изменили поведение обратных вызовов при изменении роли на узле (Alexander Kukushkin)

    Если роль была изменена с master или standby_leader на replica или с replica на standby_leader, on_restart не будет вызывать, а вместо этого будет вызывать on_role_change.

  • Измените способ запуска PostgreSQL (Alexander Kukushkin)

    Используйте multiprocessing.Process вместо непосредственного выполнения, и multiprocessing.Pipe для передачи идентификатора процесса postmaster в процесс Patroni. Ранее мы использовали каналы, что приводило к тому, что процесс postmaster терял доступ к стандартному вводу.

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

  • Исправить роль, возвращаемую REST API для резервного лидера (Alexander Kukushkin)

    Оно некорректно возвращало replica вместо standby_leader

  • Дождитесь завершения вызова, если он не может быть завершен (Julien Tachoires)

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

  • Уменьшить время удержания блокировки, затрачиваемое методом dcs.get_cluster (Alexander Kukushkin)

    Из-за того, что блокировка удерживалась, замедлялась работа, что влияло на DCS, вызывая ложные срабатывания проверок REST и API.

  • Улучшить очистку PGDATA, когда pg_wal/pg_xlog\ является символической ссылкой (Julien Tachoires)

    В этом случае Patroni явно удалит файлы из целевой директории.

  • Удалить избыточное использование os.path.relpath (Ants Aasma)

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

  • Не следует применять конкретную версию SSL при взаимодействии с etcd (Alexander Kukushkin)

    Для некоторых неизвестных причин, python3-etcd в Debian и Ubuntu не основан на последней версии пакета и, следовательно, применяет TLSv1, который не поддерживается etcd v3. Мы решили эту проблему на стороне Patroni.


Версия 1.5.5

Выпущено 2019-02-15

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

Новые возможности

  • Добавьте поддержку переменных окружения PATRONI_ETCD_PROTOCOL, PATRONI_ETCD_USERNAME и PATRONI_ETCD_PASSWORD (Étienne M)

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

  • Обеспечить автоматическую перезагрузку предыдущего мастера (Alexander Kukushkin)

    Если pg_rewind отключён или недоступен, прежний мастер может не запуститься в качестве новой реплики из-за расхождения временных шкал. В этом случае единственное решение — очистка каталога данных и повторная инициализация. Это поведение можно изменить, установив postgresql.remove_data_directory_on_diverged_timelines. При установленном параметре Patroni автоматически очистит каталог данных и повторно инициализирует прежнего мастера.

  • Показать информацию о временных шкалах в списке patronictl (Alexander Kukushkin)

    Оно помогает обнаруживать устаревшие реплики. Кроме того, Host будет включать ‘: {порт}’, если значение порта не является стандартным или на одном хосте работает несколько участников.

  • Создайте headless-сервис, связанный с конечной точкой $SCOPE-config (Alexander Kukushkin)

    “config”-ный эндпоинт хранит информацию о конфигурации Patroni и Postgres для всего кластера, историю файлов и, самое главное, содержит ключ initialize. При перезапуске или обновлении узла Kubernetes мастер, он удаляет эндпоинты без сервисов. Головная служба предотвратит это.

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

  • Настройте тайм-аут для запроса, блокирующего ожидание лидер-мониторинга (Alexander Kukushkin)

    Согласно документации Consul, фактический тайм-аут ответа увеличивается на небольшое случайное дополнительное время ожидания, которое добавляется к указанному максимальному времени ожидания, чтобы распределить время пробуждения любых одновременных запросов. Это добавляет wait / 16 дополнительное время к максимальной продолжительности. В нашем случае мы добавляем wait / 15 или 1 секунд, в зависимости от того, что больше.

  • Всегда используйте replication=1 при подключении по протоколу репликации к postgres (Alexander Kukushkin)

    Начиная с Postgres 10, строка в файле pg_hba.conf с указанием database=replication не принимает соединения с параметром replication=database.

  • Не записывайте primary_conninfo в recovery.conf для кластера резервного сервера, использующего только WAL (Alexander Kukushkin)

    Несмотря на отсутствие host и port в конфигурации standby_cluster , Patroni пытался установить primary_conninfo в recovery.conf, что бесполезно и приводит к большому количеству ошибок.


Версия 1.5.4

Выпущено 2019-01-15

Эта версия реализует гибкое ведение журнала и устраняет ряд ошибок.

Новые возможности

  • Улучшения в инфраструктуре ведения журнала (Alexander Kukushkin, Lucas Capistrant, Alexander Anikin)

    Конфигурация ведения журнала может быть настроена не только через переменные окружения, но и через файл конфигурации Patroni. Это позволяет изменять конфигурацию ведения журнала во время выполнения путем обновления конфигурации и перезагрузки или отправки SIGHUP в процесс Patroni. По умолчанию Patroni записывает журналы в stderr, но теперь стало возможным записывать журналы непосредственно в файл и выполнять их ротацию при достижении определенного размера. Кроме того, была добавлена поддержка пользовательского формата даты и возможность тонкой настройки уровня логирования для каждого Python-модуля.

  • Обеспечить возможность учитывать текущую временную шкалу при выборах лидера (Alexander Kukushkin)

    Возможно, узел считает себя самым здоровым, хотя в данный момент он не находится в самой актуальной временной шкале. В некоторых случаях мы хотим избежать продвижения такого узла, что можно осуществить, установив параметр check_timeline на значение true (поведение по умолчанию остается неизменным).

  • Смягченные требования к учетным данным суперпользователя

    Libpq позволяет открывать соединения без явного указания имени пользователя и пароля. В зависимости от ситуации, оно использует либо файл pgpass, либо метод аутентификации “доверие” в pg_hba.conf. Поскольку pg_rewind также использует libpq, оно будет работать аналогично.

  • Реализована возможность настройки интервала проверки регистрации сервиса Consul через переменные окружения (Alexander Kukushkin)

    Регистрация сервиса в Consul была добавлена в 1.5.0, но на данный момент это было возможно только через patroni.yaml.

Повышение стабильности

  • Установите archive_mode в положение «выключено» во время пользовательской начальной инициализации (Alexander Kukushkin)

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

  • Применять задержку в пять секунд при загрузке глобальной конфигурации при запуске (Alexander Kukushkin)

    Это помогает избежать перегрузки DCS при запуске Patroni.

  • Уменьшить количество генерируемых сообщений об ошибках при завершении работы (Alexander Kukushkin)

    Они были безвредными, но довольно назойливыми и иногда пугающими.

  • Явно задать права доступа для чтения/записи recovery.conf при создании (Lucas Capistrant)

    Мы не хотим, чтобы кто-либо, кроме пользователей Patroni/postgres, читал этот файл, поскольку он содержит учетные данные для репликации.

  • Перенаправление исключений HTTPServer в логгер (Julien Riou)

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

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

  • Удалена перенаправка stderr в stdout для процесса pg_ctl (Cody Coons)

    Наследование stderr от основного процесса Patroni позволяет видеть все логи Postgres, а также все логи Patroni. Это очень полезно в контейнерной среде, поскольку логи Patroni и Postgres можно использовать с помощью стандартных инструментов (docker logs, kubectl и т.д.). Кроме того, эта модификация устраняет ошибку, при которой Patroni не мог перехватывать PID postmaster, когда Postgres записывал предупреждения в stderr.

  • Установите тайм-аут отмены проверки сервиса Consul в формате времени Go (Pavel Kirillov)

    Без явной регистрации единицы времени, регистрация завершалась неудачно.

  • Ослабьте проверки standby_cluster кластера (Dmitry Dolgov, Alexander Kukushkin)

    Оно принимало только строки в качестве допустимых значений, и поэтому не было возможно указать порт как целое число и create_replica_methods в виде списка.


Версия 1.5.3

Выпущено 2018-12-03

Совместимость и выпуск с исправлением ошибок.

  • Улучшить стабильность при работе с python3 против zookeeper (Alexander Kukushkin)

    Изменение loop_wait приводило к тому, что Patroni отключался от zookeeper и не восстанавливал соединение.

  • Устранить несовместимость с postgres 9.3 (Alexander Kukushkin)

    При установлении соединения для репликации необходимо указать replication=1, поскольку 9.3 не поддерживает replication=‘database’

  • Убедитесь, что мы обновляем сессию Consul как минимум один раз в каждом цикле отказоустойчивости, и улучшаем обработку исключений, связанных с сессиями Consul (Alexander Kukushkin)

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


Версия 1.5.2

Выпущено 2018-11-26

Совместимость и выпуск с исправлением ошибок.

  • Совместимость с kazoo 2.6.0 (Alexander Kukushkin)

    Чтобы убедиться, что запросы выполняются с соответствующим тайм-аутом, Patroni переопределяет метод create_connection из модуля python-kazoo. Последняя версия kazoo незначительно изменила способ вызова метода create_connection.

  • Исправить сбой Patroni при потере лидерности в кластере Consul (Alexander Kukushkin)

    Происходила авария из-за некорректной реализации touch_member метода, он должен возвращать булево значение и не генерировать исключения.


Версия 1.5.1

Выпущено 2018-11-01

Эта версия реализует поддержку постоянных слотов репликации, добавляет поддержку pgBackRest и устраняет ряд ошибок.

Новые возможности

  • Постоянные слоты репликации (Alexander Kukushkin)

    Постоянные слоты репликации сохраняются при переключении при отказе/плановом переключении, то есть Patroni на новом первичном сервере создаст сконфигурированные слоты репликации сразу после повышения. Слоты можно сконфигурировать с помощью patronictl edit-config. Начальная конфигурация также может быть выполнена в bootstrap.dcs .

  • Добавьте поддержку pgBackRest (Yogesh Sharma)

    pgBackRest может выполнять восстановление в существующую папку $PGDATA, что позволяет ускорить процесс восстановления, поскольку файлы, которые не изменились с момента последней резервной копии, пропускаются. Для поддержки этой функции был введён новый параметр keep_data. Дополнительные примеры см. в разделе метод создания реплики .

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

  • Несколько исправлений ошибок в рабочем процессе с “резервным кластером” (Alexander Kukushkin)

    Пожалуйста, обратитесь к https://github.com/patroni/patroni/pull/823 для получения дополнительной информации.

  • Исправление проверки работоспособности REST API при приостановленном управлении кластером и недоступности DCS (Alexander Kukushkin)

    Ошибку было внесено в https://github.com/patroni/patroni/commit/90cf930036a9d5249265af15d2b787ec7517cf57


Версия 1.5.0

Выпущено 2018-09-20

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

Новые возможности

  • Резервный кластер (Dmitry Dolgov)

    Один или несколько узлов Patroni могут образовать резервный кластер, работающий параллельно с первичным кластером (i.e, в другом центре обработки данных), состоящий из резервных узлов, которые реплицируют данные с мастера в первичном кластере. Все узлы PostgreSQL в резервном кластере являются репликами; одна из этих реплик сама выбирает себя для репликации непосредственно с удалённого мастера, в то время как остальные реплицируют данные от неё по каскадной схеме. Подробное описание этой функции и примеры конфигурации можно найти в здесь .

  • Регистрация сервисов в Consul (Pavel Kirillov, Alexander Kukushkin)

    Если параметр register_service в конфигурации Consul включён, узел зарегистрирует службу с именем scope и тегом master, replica или standby-leader.

  • Экспериментальная поддержка Windows (Pavel Golub)

    С этого момента возможно запустить Patroni в Windows, хотя поддержка Windows является новой и не получила столько практических тестов, как поддержка Linux. Мы приветствуем ваши отзывы!

Улучшения patronictl

  • Добавьте флаг -k/–insecure patronictl и поддержку сертификата для REST API (Wilfried Roset)

    Ранее, если REST API был защищён самоподписными сертификатами, patronictl не мог их проверить. Существовало невозможность отключить эту проверку. Теперь можно настроить patronictl на пропуск проверки сертификатов или указать сертификаты CA и клиента в разделе ctl: конфигурации.

  • Исключить участники, у которых отсутствует тег «nofollower», из вывода patronictl при переключении/переключении при отказе (Alexander Anikin)

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

Повышение стабильности

  • Избегайте парсинга строк вывода, не являющихся ключами-значениями pg_controldata (Alexander Anikin)

    При определенных обстоятельствах pg_controldata генерирует строки без символа двоеточия. Это может вызвать ошибку в коде Patroni, который обрабатывает вывод pg_controldata, скрывая реальную проблему; часто такие строки выводятся в виде предупреждения, отображаемого pg_controldata перед основным выводом, i.e. когда версия бинарного файла не соответствует версии каталога данных PostgreSQL.

  • Добавить имя участника в сообщение об ошибке во время выборов лидера (Jan Mussler)

    Во время выбора лидера, Patroni подключается ко всем известным участникам кластера и запрашивает их статус. Этот статус записывается в лог Patroni и включает в себя имя участника. Ранее, если участник был недоступен, сообщение об ошибке не содержало его имя, а содержало только URL.

  • Немедленно зарезервируйте позицию WAL при создании слота репликации (Alexander Kukushkin)

    Начиная с 9.6, функция pg_create_physical_replication_slot предоставляет дополнительный булевый параметр immediately_reserve. Когда он установлен в false, который также является значением по умолчанию, слот не резервирует позицию WAL до получения первого соединения от клиента, что может привести к потере некоторых сегментов, необходимых клиенту, в течение временного интервала между созданием слота и первым соединением.

  • Исправить ошибку в строгой синхронной репликации (Alexander Kukushkin)

    При работе с synchronous_mode_strict: true, в некоторых случаях Patroni помещает \* в synchronous_standby_names, изменяя состояние синхронизации для большинства соединений репликации на potential. Ранее Patroni не мог выбрать синхронного кандидата в таких обстоятельствах, поскольку он рассматривал только те, у которых состояние было async.


Версия 1.4.6

Выпущено 2018-08-14

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

В этом выпуске исправлена критическая ошибка, при которой конечная точка Patroni API /master возвращала 200 для узла, не являющегося мастером. Это ошибка отчетности, реального разделения мозгов нет, однако в определённых условиях клиенты могут быть направлены на узел только для чтения.

  • Сбросить статус is_leader при понижении (Alexander Kukushkin, Oleksii Kliukin)

    Убедитесь, что участник кластера, пониженный в статусе, перестает отвечать кодом 200 в результате вызова /master API.

  • Добавьте новое поле “cluster_unlocked” в вывод API (Dmitry Dolgov)

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


Версия 1.4.5

Выпущено 2018-08-03

Новые возможности

  • Улучшить ведение журнала при применении новой конфигурации PostgreSQL (Don Seiler)

    Patroni регистрирует изменения в именах и значениях параметров.

  • Совместимость с Python 3.7 (Christoph Berg)

    async является зарезервированным ключевым словом в python3.7

  • Установите состояние на “остановлено” в DCS, когда участник завершает работу (Tony Sorrentino)

    Это демонстрирует состояние участника как “остановлено” в команде “patronictl list”.

  • Улучшить сообщение, которое записывается, когда устаревший postmaster.pid совпадает с работающим процессом (Ants Aasma)

    Предыдущий был совершенно непонятным.

  • Реализовать функциональность перезагрузки patronictl (Don Seiler)

    Ранее это было возможно только путем перезагрузки конфигурации, вызвав REST, API или отправив сигнал SIGHUP процессу Patroni.

  • Возьмите и примените некоторые параметры из controldata при запуске в качестве реплики (Alexander Kukushkin)

    Значение max_connections и некоторые другие параметры, установленные в глобальной конфигурации, могут быть ниже, чем значение, используемое первичным сервером; в этом случае реплика не может запуститься и требует ручной корректировки. Patroni теперь решает эту проблему, считывая и применяя значение из pg_controldata, запуская PostgreSQL и устанавливая флаг pending_restart.

  • Если установлено, использовать LD_LIBRARY_PATH при запуске PostgreSQL (Chris Fraser)

    При запуске Postgres, Patroni передавал переменные окружения PATH, LC_ALL и LANG, если они были установлены. Сейчас он делает то же самое с LD_LIBRARY_PATH. Это может помочь, если PostgreSQL был установлен в нестандартное место.

  • Переименовать create_replica_method в create_replica_methods (Dmitry Dolgov)

    Чтобы было ясно, что это действительно массив. Старое имя по-прежнему поддерживается для обратной совместимости.

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

  • Устранить условие для запуска реплики в случае, когда она находится в состоянии «приостановлено» из-за pg_rewind (Oleksii Kliukin)

    Избегайте запуска реплики, которая уже выполнила pg_rewind ранее.

  • Отвечать 200 на запрос о состоянии только от мастера, если update_lock был выполнен успешно (Alexander Kukushkin)

    Предотвратите, чтобы Patroni считал себя мастером на ранее пониженном сервере, если DCS разделен.

  • Обеспечить совместимость с новым модулем consul (Alexander Kukushkin)

    Начиная с v1.1.0 python-consul изменил внутреннюю реализацию API и начал использовать list вместо dict для передачи параметров запроса.

  • Перехватывать исключения, возникающие в потоках Patroni REST API во время завершения работы (Alexander Kukushkin)

    Эти необработанные исключения продолжали поддерживать работу PostgreSQL при завершении.

  • Восстанавливайте систему только тогда, когда Postgres работает в режиме мастера (Alexander Kukushkin)

    Необходимо, чтобы pg_controldata сообщал о состоянии «в производственной среде», «переводе в режим выключения» или «восстановлении после сбоя». В остальных случаях восстановление не требуется.

  • Улучшить обработку ошибок конфигурации (Henning Jacobs, Alexander Kukushkin)

    Возможно изменить множество параметров во время выполнения (включая restapi.listen), обновив файл конфигурации Patroni и отправив SIGHUP в процесс Patroni. Это исправление устраняет неочевидные исключения из потока ‘restapi’, когда некоторые параметры получают неверные значения.


Версия 1.4.4

Выпущено 2018-05-22

Повышение стабильности

  • Устранить условие гонки в poll_failover_result (Alexander Kukushkin)

    Это напрямую не влияло ни на аварийное, ни на плановое переключение, но в некоторых редких случаях система слишком рано сообщала об успехе, когда прежний лидер освобождал блокировку, выдавая сообщение ‘Failed over to “None”’ вместо ‘Failed over to “desired-node”’.

  • Обращайтесь к параметрам Postgres как к нечувствительным к регистру (Alexander Kukushkin)

    Большинство параметров Postgres имеют snake_case имена, но существуют три исключения из этого правила: DateStyle, IntervalStyle и TimeZone. Postgres принимает эти параметры независимо от регистра (e.g. timezone = ‘some/tzn’); однако Patroni не мог найти соответствия с игнорированием регистра для имён этих параметров в pg_settings и в результате игнорировал такие параметры.

  • Прекратить запуск, если происходит подключение к работающему PostgreSQL и кластер не инициализирован (Alexander Kukushkin)

    Patroni может подключиться к уже работающей инстанции Postgres. Крайне важно начать запуск Patroni на узле-мастере, прежде чем переходить к репликам.

  • Исправьте поведение шаблона patronictl (Alexander Kukushkin)

    Передавайте объект dict в touch_member вместо строки JSON-encoded; реализация DCS сама выполнит её кодирование.

  • Не понижайте мастер, если не удалось обновить ключ лидера в режиме паузы (Alexander Kukushkin)

    Во время обслуживания узел DCS может начать отклонять запросы на запись, продолжая отвечать на запросы на чтение. В этом случае Patroni использовал помещать мастер-узел Postgres в режим только для чтения после того, как не смог обновить блокировку лидера DCS.

  • Синхронизируйте слоты репликации, когда Patroni обнаруживает новый процесс postmaster (Alexander Kukushkin)

    Если PostgreSQL был перезапущен, Patroni должен убедиться, что список слотов репликации соответствует его ожиданиям.

  • Проверьте sysid и слоты репликации после выхода из режима приостановки (Alexander Kukushkin)

    Во время режима maintenance может произойти ситуация, когда каталог данных был полностью переписан, и, следовательно, необходимо убедиться, что Database system identifier принадлежит к нашему кластеру, и слоты репликации находятся в синхронизации с ожиданиями Patroni.

  • Устранить возможную проблему с запуском Postgres в каталоге данных при наличии файла блокировки postmaster (Alexander Kukushkin)

    Обнаружение повторного использования PID из файла блокировки почтового ящика. Вероятность возникновения такой проблемы выше, если вы запускаете Patroni и Postgres в контейнере Docker.

  • Улучшить защиту DCS от случайного удаления (Alexander Kukushkin)

    Patroni содержит значительную логику для предотвращения переключения при отказе в таких случаях; он также может восстановить все ключи; однако, до внесения этого изменения, случайное удаление ключа /config отключало цикл HA для 1.

  • Не выходить, если возникает ошибка с недействительным идентификатором системы (Oleksii Kliukin)

    Не завершайте работу системы, когда идентификатор кластера пуст или не проходит проверку. В этом случае кластер, скорее всего, требует переинициализации; укажите это в сообщении результата. Избегайте завершения работы Patroni, так как в противном случае переинициализация невозможна.

Совместимость с Kubernetes 1.10+

  • Добавлена проверка на пустые подмножества (Cody Coons)

    Kubernetes 1.10.0+ начал возвращать Endpoints.subsets, установленный в None, вместо \[\].

Улучшения начальной инициализации

  • Сделайте удаление recovery.conf необязательным (Brad Nicholson)

    Если bootstrap.<custom_bootstrap_method_name>.keep_existing_recovery_conf определено и установлено в True, Patroni не удаляет существующий recovery.conf файл. Это полезно при начальной инициализации из резервной копии с использованием таких инструментов, как pgBackRest, которые генерируют соответствующие recovery.conf.

  • Предоставьте возможность указывать параметры для встроенного метода built-in в basebackup (Oleksii Kliukin)

    Сейчас возможно указывать параметры для встроенного метода basebackup, определяя раздел basebackup в конфигурации, подобно тому, как это делается для методов создания пользовательских реплик. Различие заключается в формате, который принимает раздел basebackup: поскольку pg_basebackup принимает параметры --key=value и --key, содержимое раздела может быть либо словарем пар ключ-значение, либо списком из словарей с одним элементом или просто ключей (для параметров, которые не принимают значения). Обратитесь к разделу “метод создания реплики” для дополнительных примеров.


Версия 1.4.3

Выпущено 2018-03-05

Улучшения ведения журнала

  • Сделать уровень логирования настраиваемым через переменные окружения (Andy Newton, Keyvan Hedayati)

    PATRONI_LOGLEVEL — устанавливает общий уровень ведения журнала PATRONI_REQUESTS_LOGLEVEL — устанавливает уровень ведения журнала для всех запросов HTTP e.g. Kubernetes API обращается к See документации для Python logging https://docs.python.org/3.6/library/logging.html#levels\ , чтобы узнать имена возможных уровней ведения журнала

Повышение стабильности и исправления ошибок

  • Не переоценивайте топологию кластера etcd при истечении времени ожидания (Alexander Kukushkin)

    Если в конфигурации etcd есть только один узел, и этот узел недоступен, Patroni начинает обнаружение топологии кластера и не может этого сделать. Вместо этого, Patroni должен просто перейти к следующему доступному узлу.

  • Записать содержимое bootstrap.pg_hba в файл pg_hba.conf после выполнения пользовательской начальной инициализации (Alexander Kukushkin)

    Теперь оно ведет себя аналогично обычной начальной инициализации initdb

  • Режим с одним пользователем ожидал ввода от пользователя и никогда не завершался (Alexander Kukushkin)

    Ошибку было внесено в https://github.com/patroni/patroni/pull/576


Версия 1.4.2

Выпущено 2018-01-30

Улучшения patronictl

  • Переименовать запланированное переключение при отказе в запланированное переключение (Alexander Kukushkin)

    Функции переключения при отказе и планового переключения были разделены в версии 1.4, но patronictl list все еще сообщал о Scheduled failover вместо Scheduled switchover.

  • Показать информацию о ожидающих перезапусках (Alexander Kukushkin)

    Для применения некоторых изменений конфигурации иногда необходимо перезапустить PostgreSQL. Patroni уже давал соответствующее предупреждение в REST API, а также при записи статуса узлов в DCS, но не было простого способа отобразить эту информацию.

  • Сделайте использование show-config для работы с cluster_name из конфигурационного файла (Alexander Kukushkin)

    Оно работает аналогично patronictl edit-config

Повышение стабильности

  • Избегайте вызова pg_controldata во время начальной инициализации (Alexander Kukushkin)

    Во время initdb или пользовательской начальной инициализации существует временной интервал, когда pgdata не пуст, но pg_controldata ещё не был записан. В таком случае вызов pg_controldata завершался с сообщениями об ошибках.

  • Обрабатывать исключения, возникающие из-за psutil (Alexander Kukushkin)

    Команда из командной строки считывается и анализируется каждый раз, когда вызывается метод cmdline(). Возможно, что процесс, который рассматривается, уже исчез, в этом случае возникает исключение NoSuchProcess.

Улучшения поддержки Kubernetes

  • Не подавляйте ошибки из k8s API (Alexander Kukushkin)

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

  • Обновите пример Dockerfile для Kubernetes, чтобы установить Patroni из основной ветки (Maciej Szulik)

    Ранее использовалась feature/k8s, но она устарела.

  • Добавьте соответствующий RBAC для запуска Patroni в k8s (Maciej Szulik)

    Добавьте учётную запись, которая назначена для подов кластера, роль, содержащую только необходимые разрешения, и роль-связку, которая связывает учётную запись и роль.


Версия 1.4.1

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

Исправления в patronictl

  • Не отображать текущего лидера в предложенном списке участников для переключения при отказе. (Alexander Kukushkin)

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

  • Сделать patronictl плановым переключением совместимым со старым API Patroni (Alexander Kukushkin)

    Если вызов REST API POST /switchover завершится с кодом состояния 501, он будет повторён, но уже для конечной точки /failover вместо исходной.


Версия 1.4

Выпущено 2018-01-10

Эта версия добавляет поддержку использования Kubernetes в качестве DCS, позволяя запускать Patroni как облачное средство в Kubernetes без каких-либо дополнительных развёртываний etcd, Zookeeper или Consul.

Уведомление об обновлении

Установка Patroni через pip больше не будет автоматически устанавливать зависимости (такие как библиотеки для etcd, Zookeeper, Consul или Kubernetes, или поддержку AWS). Чтобы их включить, необходимо указать их явно в команде pip install, например, pip install patroni\[etcd,kubernetes\].

Поддержка Kubernetes

Реализуйте DCS, основанную на Kubernetes систему. Данные метаданных используются для хранения конфигурации и ключа лидера. Поле метаданных внутри определения подов используется для хранения данных, связанных с участником. Кроме использования Endpoints, Patroni поддерживает ConfigMaps. Вы можете найти дополнительную информацию об этой функции в главе «Kubernetes» документации .

Повышение стабильности

  • Выделить процесс postmaster в отдельный объект (Ants Aasma)

    Этот объект идентифицирует запущенный процесс postmaster по идентификатору процесса и времени запуска, упрощая обнаружение (и устранение) ситуаций, когда postmaster был перезапущен без нашего ведома или когда каталог PostgreSQL исчез из файловой системы.

  • Минимизировать количество SELECT, которое Patroni выпускает на каждом цикле обеспечения высокой доступности (Alexander Kukushkin)

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

  • Удалять ключ «leader» при выключении только тогда, когда у нас есть блокировка (Ants Aasma)

    Безоговорочное удаление приводило к возникновению ненужных и вводящих в заблуждение исключений.

Улучшения patronictl

  • Добавьте команду версии в patronictl (Ants Aasma)

    Отобразит версию установленного Patroni и версии запущенных экземпляров Patroni (если указано имя кластера).

  • Предоставьте возможность указывать необязательный аргумент cluster_name для некоторых команд patronictl (Alexander Kukushkin, Ants Aasma)

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

  • Показать информацию о запланированном переключении и режиме обслуживания (Alexander Kukushkin)

    Ранее эта информация можно было получить только из логов Patroni или непосредственно из DCS.

  • Улучшить patronictl reinit (Alexander Kukushkin)

    Иногда patronictl reinit отказывался продолжать работу, когда Patroni был занят другими действиями, а именно попытками запуска postgres. patronictl не предоставлял никаких команд для отмены таких длительных операций, и единственным (опасным) обходным решением было ручное удаление каталога данных. Новая реализация reinit принудительно отменяет другие длительные операции перед выполнением reinit.

  • Реализовать флаг --wait в patronictl pause и patronictl resume (Alexander Kukushkin)

    Это обеспечит, чтобы patronictl ждал, пока запрошенное действие будет подтверждено всеми узлами в кластере. Такое поведение достигается путем предоставления флага pause для каждого узла в DCS и через REST API.

  • Переименовать patronictl failover в patronictl switchover (Alexander Kukushkin)

    Предыдущая failover была способна только выполнять плановое переключение; она отказывалась продолжать работу в кластере без лидера.

  • Измените поведение patronictl failover (Alexander Kukushkin)

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

Предоставление сведений о временной шкале и истории

  • Отображать текущую временную шкалу в DCS и через API (Alexander Kukushkin)

    Храните информацию о текущей временной шкале для каждого участника кластера. Эта информация доступна через API и хранится в DCS

  • Сохранять историю рекламных акций в ключе /history в DCS (Alexander Kukushkin)

    Кроме того, сохраните историю изменений, обогащенную временной меткой соответствующего продвижения, в ключе /history в DCS, и обновляйте его при каждом продвижении.

Добавлены конечные точки для получения синхронных и асинхронных реплик

  • Добавьте новые конечные точки /sync и /async (Alexander Kukushkin, Oleksii Kliukin)

Эти конечные точки (также доступные как /synchronous и /asynchronous) возвращают 200 только для синхронных и асинхронных реплик соответственно (исключая те, которые помечены как noloadbalance).

Разрешено несколько узлов Etcd

  • Добавьте новый параметр hosts в конфигурацию etcd (Alexander Kukushkin)

    Этот параметр должен содержать начальный список хостов, которые будут использоваться для обнаружения и заполнения списка участников работающего кластера etcd. Если по какой-либо причине в процессе работы этот список обнаруженных хостов исчерпан (нет доступных хостов из этого списка), Patroni вернется к исходному списку из параметра hosts.


Версия 1.3.6

Выпущено 2017-11-10

Повышение стабильности

  • Проверьте время запуска процесса при проверке, запущен ли PostgreSQL. (Ants Aasma)

    После сбоя, который не приводит к очистке postmaster.pid, может появиться новый процесс с тем же идентификатором, что приведет к ложному срабатыванию is_running(), что, в свою очередь, вызовет различные нежелательные последствия.

  • Остановить PostgreSQL перед начальной инициализацией, когда потеряна директория данных (ainlolcat)

    Когда каталог данных на основном сервере удаляется насильственным способом, процесс PostgreSQL может продолжать работать в течение некоторого времени и препятствовать запуску или репликации реплики, созданной на месте бывшего основного сервера. Исправление позволяет Patroni кэшировать PID процесса postmaster и его время запуска, и завершать старый процесс postmaster, если он все еще работает после удаления соответствующего каталога данных.

  • Выполните восстановление после сбоя в режиме однопользовательского режима, если мастер PostgreSQL выходит из строя (Alexander Kukushkin)

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

Улучшения Consul

  • Обеспечить возможность предоставления конфигурации дата-центра для Consul (Vilius Okockis, Alexander Kukushkin)

    Ранее Patroni всегда взаимодействовал с дата-центром хоста, на котором он работал.

  • Всегда отправляйте токен в заголовке HTTP X-Consul-Token (Alexander Kukushkin)

    Если consul.token определено в конфигурации Patroni, мы всегда будем отправлять его в заголовке HTTP ‘X-Consul-Token’. Модуль python-consul пытается быть “согласованным” с Consul REST API, который не принимает токен в качестве параметра запроса для сессии API , но он все равно работает с заголовком ‘X-Consul-Token’.

  • Настроить сеанс TTL, если предоставленное значение меньше минимально допустимого (Stas Fomin, Alexander Kukushkin)

    Возможно, значение TTL, предоставленное в конфигурации Patroni, окажется меньше минимального значения, поддерживаемого Consul. В этом случае агент Consul не может создать новую сессию. Без сессии Patroni не может создать ключи участника и лидера в хранилище Consul KV, что приводит к нездоровому состоянию кластера.

Другие улучшения

  • Определите пользовательский формат логов через переменную окружения PATRONI_LOGFORMAT (Stas Fomin)

    Разрешить отключение временных меток и других аналогичных полей в логах Patroni, если они уже добавлены системным логгером (обычно, когда Patroni работает как сервис).


Версия 1.3.5

Выпущено 2017-10-12

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

  • Установите роль в значение ‘uninitialized’, если каталог данных был удален (Alexander Kukushkin)

    Если узел работал в качестве мастера, это предотвращало переключение при отказе.

Повышение стабильности

  • Попробуйте запустить postmaster в однопользовательском режиме, если мы попытались запустить PostgreSQL, но потерпели неудачу (Alexander Kukushkin)

    Обычно такая проблема возникает, когда узел, работающий в качестве мастера, был завершен, и временные шкалы разошлись. Если recovery.conf определено restore_command, то существует высокая вероятность того, что PostgreSQL завершит запуск и оставит данные конфигурации без изменений. Это делает невозможным использование pg_rewind, которое требует чистого завершения работы.

Улучшения Consul

  • Предусмотреть возможность указания проверок работоспособности при создании сессии (Alexander Kukushkin)

    Если не указано, Consul будет использовать “serfHealth”. С одной стороны, это позволяет быстро обнаружить изолированный мастер; с другой стороны, это делает невозможным для Patroni принятие кратковременных задержек в сети.

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

  • Устранить проблему со сторожевым таймером в Python 3 (Ants Aasma)

    Неправильное понимание интерфейса вызова ioctl(). Если mutable=False, то fcntl.ioctl() фактически возвращает буфер аргументов. Это случайно работало в Python2, поскольку сравнение типов int и str не вызывало ошибку. Отчет об ошибках фактически генерируется путем вызова исключения IOError в Python2 и OSError в Python3.


Версия 1.3.4

Выпущено 2017-09-08

Различные улучшения Consul

  • Передайте токен Consul в качестве заголовка (Andrew Colin Kissa)

    Заголовки теперь являются предпочтительным способом передачи токена в Consul API .

  • Продвинутая конфигурация для Consul (Alexander Kukushkin)

    возможность указать scheme, token, клиентские и CA-сертификаты подробности .

  • совместимость с python-consul-0.7.1 и выше (Alexander Kukushkin)

    Новый модуль python-consul изменил сигнатуру некоторых методов

  • Сообщение «Не удалось получить TTL блокировку» никогда не регистрировалось (Alexander Kukushkin)

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

Заключение synchronous_standby_names в кавычки с помощью quote_ident

  • При записи synchronous_standby_names в postgresql.conf, его значение должно быть заключено в кавычки (Alexander Kukushkin)

    Если запрос не оформлен должным образом, PostgreSQL фактически отключит синхронную репликацию и продолжит работу.

Различные исправления ошибок, связанные с состоянием паузы, в основном, связанные со сторожевым таймером (Александр Кукушкин)

  • Не отправлять сигналы “keepalive”, если сторожевой таймер не активен
  • Избегать активации сторожевого таймера в режиме паузы
  • Установить правильное состояние PostgreSQL в режиме паузы
  • Не пытаться выполнять запросы из API, если PostgreSQL остановлен

Версия 1.3.3

Выпущено 2017-08-04

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

  • синхронное резервное копирование было отключено вскоре после повышения, даже когда synchronous_mode_strict было включено (Alexander Kukushkin)
  • создать пустой файл pg_ident.conf, если он отсутствует после восстановления из резервной копии (Alexander Kukushkin)
  • открыть доступ в pg_hba.conf ко всем базам данных, а не только к PostgreSQL (Franco Bellagamba)

Версия 1.3.2

Выпущено 2017-07-31

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

  • Редактирование конфигурации с помощью Patroni.ctl не работает с ZooKeeper (Alexander Kukushkin)

Версия 1.3.1

Выпущено 2017-07-28

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

  • Переключение при отказе, осуществляемое с помощью API, перестало работать из-за изменений в _MemberStatus (Alexander Kukushkin)

Версия 1.3

Выпущено 2017-07-27

Версия 1.3 добавляет возможность пользовательской начальной инициализации, значительно улучшает поддержку pg_rewind, расширяет поддержку синхронного режима, добавляет возможность редактирования конфигурации через patronictl и реализует поддержку сторожевого таймера в Linux. Кроме того, это первая версия, которая корректно работает с PostgreSQL 10.

Уведомление об обновлении

Существует нет известных проблем совместимости с новой версией Patroni. Конфигурация из версии 1.2 должна работать без каких-либо изменений. Обновление возможно путем установки новых пакетов и последующего перезапуска Patroni (что приведёт к перезапуску PostgreSQL), либо путём сначала перевода Patroni в режим паузы , а затем перезапуска Patroni на всех узлах кластера (Patroni в режиме паузы не будет пытаться остановить/запустить PostgreSQL), после чего возобновления работы из режима паузы.

Пользовательская начальная инициализация

  • Сделайте процесс инициализации кластера настраиваемым (Alexander Kukushkin)

    Разрешить использование пользовательских скриптов начальной инициализации вместо initdb при инициализации первого узла в кластере. Команда начальной инициализации получает имя кластера и путь к каталогу данных. Полученный кластер может быть настроен для выполнения восстановления, что позволяет инициализировать из резервной копии и выполнять восстановление в определенный момент времени. Обратитесь к странице документации для получения более подробного описания этой функции.

Более интеллектуальная поддержка pg_rewind

  • Определите, следует ли запускать pg_rewind, изучив различия во временной шкале по сравнению с текущим мастером (Alexander Kukushkin)

    Ранее Patroni имел фиксированный набор условий для запуска pg_rewind, а именно при запуске бывшего мастера, при переключении на узел, назначенный для каждого узла в кластере, или при наличии реплики с тегом “nofollow”. Все эти случаи имеют общим признаком возможность того, что какая-либо реплика может опережать новый мастер. В некоторых случаях pg_rewind не выполнялся, в других – не работал, когда это было необходимо. Вместо того, чтобы полагаться на этот ограниченный список правил, Patroni должен сравнивать позиции мастера и реплики WAL (используя протокол потоковой репликации), чтобы надежно определить, требуется ли перемотка для реплики.

Строгий режим синхронной репликации

  • Улучшить поддержку синхронной репликации путем добавления режима строгой проверки (James Sewell, Alexander Kukushkin)

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

Редактирование конфигурации с помощью patronictl

  • Добавьте возможность редактирования конфигурации через patronictl (Ants Aasma, Alexander Kukushkin)

    Добавьте возможность редактирования динамической конфигурации кластера, хранящейся в DCS, с использованием patronictl. Поддерживайте указание параметров/значений из командной строки, вызов $EDITOR, или применение конфигурации из файла YAML.

Поддержка сторожевого таймера Linux

  • Реализуйте поддержку сторожевого таймера для Linux (Ants Aasma)

    Поддержка программного сторожевого таймера Linux позволяет перезагрузить узел, на котором не работает Patroni или на который не отвечает (e.g, например, из-за высокой нагрузки). Программный сторожевой таймер Linux перезагружает неработающий узел. Можно настроить устройство сторожевого таймера (/dev/watchdog по умолчанию) и режим (on, automatic, off) в разделе watchdog конфигурации Patroni. Дополнительную информацию можно найти в документации по сторожевому таймеру .

Добавлена поддержка PostgreSQL 10

  • Patroni совместим со всеми выпущенными ранее бета-версиями PostgreSQL 10, и мы ожидаем, что он будет совместим с PostgreSQL 10, когда она будет выпущена.

Небольшие улучшения, связанные с PostgreSQL

  • Определите pg_hba через файл конфигурации Patroni или динамическую конфигурацию в DCS (Alexander Kukushkin)

    Разрешить определение содержимого pg_hba.conf в подразделе pg_hba раздела postgresql конфигурации. Это упрощает управление pg_hba.conf на нескольких узлах, поскольку необходимо определить его только один раз в DCS вместо ведения журнала на каждом узле, ручного изменения и перезагрузки конфигурации.

    Когда определено, содержимое этого раздела полностью заменит текущее pg_hba.conf. Patroni игнорирует его, если параметр PostgreSQL hba_file установлен.

  • Поддержка подключения через сокет UNIX к локальному кластеру PostgreSQL (Alexander Kukushkin)

    Добавьте опцию use_unix_socket в раздел postgresql конфигурации Patroni. При установке в значение true и при условии, что опция PostgreSQL unix_socket_directories не пуста, Patroni использует первое значение из неё для подключения к локальному кластеру PostgreSQL. Если unix_socket_directories не определено, Patroni предполагает его значение по умолчанию и полностью опускает параметр host в строке подключения к PostgreSQL.

  • Поддержка изменения учетных данных суперпользователя и репликации при перезагрузке (Alexander Kukushkin)

  • Поддержка хранения файлов конфигурации вне каталога данных PostgreSQL (@jouir)

    Добавьте новый параметр конфигурации postgresql config_dir. По умолчанию он указывает на каталог данных и должен быть доступен для записи Patroni.

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

  • Обрабатывать исключения EtcdEventIndexCleared и EtcdWatcherCleared (Alexander Kukushkin)

    Более быстрое восстановление при завершении операции наблюдения etcd, избегая ненужных повторных попыток.

  • Устранить вращение индикатора ошибки при сбое etcd и уменьшить количество шума в логах (Ants Aasma)

    Избегайте немедленных повторных попыток и вывода трассировок в лог при повторных сбоях соединения с etcd на втором и последующих этапах.

  • Экспортируйте переменные локали при создании процессов PostgreSQL (Oleksii Kliukin)

    Избегайте postmaster became multithreaded during startup критической ошибки при использовании неанглийских локалей для PostgreSQL, собранной с NLS.

  • Дополнительные проверки при удалении слота репликации (Alexander Kukushkin)

    В некоторых случаях Patroni не может удалить слот репликации из-за WAL.

  • Укоротить имя слота репликации до 63 символов (NAMEDATALEN – 1) для соответствия правилам именования PostgreSQL (Nick Scott)

  • Устранить ситуацию гонки, в результате которой Patroni открывает избыточные соединения к кластеру PostgreSQL (Alexander Kukushkin)

  • Освободите ключ лидера, когда узел перезапускается с пустой директорией данных (Alex Kerney)

  • Установить состояние “занято” для асинхронного исполнителя при выполнении начальной инициализации без лидера (Alexander Kukushkin)

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

  • Улучшить способ создания WAL-E реплик (Joar Wandborg, Alexander Kukushkin).

    • Используйте csv.DictReader при обработке базовой резервной копии WAL-E, принимая даты ISO в формате с разделением даты и времени пробелом.
    • Поддержка получения текущей позиции WAL с реплики для оценки объёма WAL, подлежащего восстановлению. Ранее код вызывал системные функции информации, доступные только на основном узле.

Версия 1.2

Выпущено 2016-12-13

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

Синхронная репликация

  • Добавьте поддержку синхронной репликации. (Ants Aasma)

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

Повышение надёжности

  • Не пытайтесь обновлять положение лидера, хранящееся в ключе leader optime, когда PostgreSQL не находится в состоянии 100% здоровья. Немедленно понижайте при неудаче обновления ключа лидера. (Alexander Kukushkin)

  • Исключить нездоровые узлы из списка целевых для клонирования новой реплики. (Alexander Kukushkin)

  • Реализуйте стратегию повторных попыток и тайм-аута для Consul, аналогичную той, которая используется для etcd. (Alexander Kukushkin)

  • Применить --dcs и --config-file ко всем опциям в patronictl . (Alexander Kukushkin)

  • Запишите все параметры PostgreSQL в postgresql.conf. (Alexander Kukushkin)

    Оно позволяет запустить PostgreSQL, настроенный с помощью Patroni, используя только pg_ctl.

  • Избегайте исключений, когда в конфигурации нет пользователей. (Kirill Pushkin)

  • Разрешить приостановку неработоспособного кластера. До этого исправления patronictl завершался с ошибкой, если узел, на котором выполнялась команда приостановки, был неработоспособным. (Alexander Kukushkin)

  • Улучшить функциональность мониторинга лидера. (Alexander Kukushkin)

    Ранее реплики постоянно следили за ключом лидера (ожидая истечения тайм-аута или изменения ключа лидера). С этой модификацией они отслеживают состояние только тогда, когда PostgreSQL реплики находится в состоянии running, а не когда PostgreSQL останавливается/запускается или перезапускается.

  • Избегайте возникновения гонок состояний при обработке SIGCHILD как PID 1. (Alexander Kukushkin)

    Ранее могла возникать ситуация гонки при работе внутри контейнеров Docker, поскольку один и тот же процесс в Patroni одновременно создавал новые процессы и обрабатывал сигналы от них. Эта модификация использует fork/exec для Patroni и оставляет исходный процесс SIGCHILD PID 1 ответственным за обработку сигналов от дочерних процессов.

  • Исправить WAL-E восстановление. (Oleksii Kliukin)

    Ранее WAL-E восстановление использовало флаг no_master для полного избегания обращения к мастеру, что заставляло Patroni всегда выбирать восстановление из WAL через pg_basebackup. Данное изменение возвращает no_master исходное значение, а именно: восстановление WAL-E может быть выбрано в качестве метода репликации, если мастер не запущен. Проверка этого условия осуществляется путём анализа строки соединения, переданной методу. Кроме того, механизм повторных попыток стал более устойчивым, а также обрабатываются и другие нюансы.

  • Реализуйте асинхронный DNS кэш для разрешения. (Alexander Kukushkin)

    Избегайте сбоев, когда DNS временно недоступен (например, из-за чрезмерного трафика, поступающего на узел).

  • Реализовать начальное состояние и тайм-аут запуска мастера. (Ants Aasma, Alexander Kukushkin)

    Ранее pg_ctl ждал истечения таймаута и затем считал, что PostgreSQL работает. Это приводило к тому, что PostgreSQL отображался как работающий, хотя на самом деле он был не активен, и вызывало гонку, в результате которой происходило либо переключение при отказе, либо восстановление, либо восстановление, прерванное переключением, и пропуск операции перемотки. Этот изменения добавляет параметр master_start_timeout и вводит новое состояние для основного цикла HA: starting. Когда master_start_timeout имеет значение 0, мы немедленно переключаемся на резервный сервер при отказе основного сервера, как только появляется кандидат на переключение. В противном случае Patroni будет ожидать после попытки запуска PostgreSQL на основном сервере в течение таймаута; при истечении таймаута, если это возможно, происходит переключение. Ручные запросы на переключение будут выполнены даже при отказе основного сервера до истечения таймаута.

    Внедрите параметр timeout в конечную точку restart, API и patronictl . Когда он установлен, и перезапуск занимает больше времени, чем тайм-аут, PostgreSQL считается нездоровым, и другие узлы становятся доступными для получения блокировки лидера.

  • Исправить поведение pg_rewind в режиме паузы. (Ants Aasma)

    Избегайте необоснованных перезапусков в режиме паузы, когда Patroni считает необходимым выполнить откат, но откат невозможен (i.e. pg_rewind отсутствует). Возвращайтесь к значениям по умолчанию libpq для superuser (пользователь ОС по умолчанию), если отсутствует аутентификация superuser в разделе конфигурации Patroni, связанном с pg_rewind.

  • Сериализовать выполнение обратного вызова. Завершить предыдущий обратный вызов того же типа перед запуском нового. Устранить проблему возникновения “зомби” процессов при выполнении обратных вызовов. (Alexander Kukushkin)

  • Не рекомендуется назначать прежнего лидера, когда ключ лидера установлен в DCS, но обновление до этого ключа не удается. (Alexander Kukushkin)

    Это позволяет избежать ситуации, когда текущий мастер продолжает выполнять свою роль, даже когда он разделен вместе с небольшим количеством узлов в etcd и других DCS, которые позволяют “несогласованные чтения”.

Разное

  • Добавьте опцию post_init конфигурации на начальной инициализации. (Alejandro Martínez)

    Patroni вызовет аргумент скрипта этой опции сразу после выполнения initdb и запуска PostgreSQL для нового кластера. Скрипт получает соединение URL с superuser и устанавливает PGPASSFILE для указания на файл .pgpass, содержащий пароль. Если скрипт завершится неудачно, инициализация Patroni также завершится неудачно. Это полезно для добавления новых пользователей или создания расширений в новом кластере.

  • Реализовать поддержку PostgreSQL 9.6. (Alexander Kukushkin)

    Используйте wal_level = replica в качестве синонима для hot_standby, избегая флага pending_restart при переключении между ними. (Александр Кукушкин)

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

  • Добавьте диаграмму основного цикла работы Patroni loop workflow diagram . (Alejandro Martínez, Alexander Kukushkin)

  • Улучшить README, добавив Helm-шаблон и ссылки на примечания к релизу. (Lauri Apple)

  • Переместите документацию Patroni в Read the Docs. Актуальная документация доступна по адресу . (Oleksii Kliukin)

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

  • Перенесите пакет в систему версионирования по семантике. (Oleksii Kliukin)

    Patroni будет следовать схеме major.minor.patch версий, чтобы избежать выпуска новой версии с небольшими, но критическими исправлениями ошибок. Мы будем публиковать только примечания к выпуску для этой версии, которые будут включать все исправления.


Версия 1.1

Выпущено 2016-09-07

Этот выпуск улучшает управление кластером Patroni путем введения режима паузы, улучшает обслуживание с помощью запланированных и условных перезапусков, делает взаимодействие Patroni с etcd или Zookeeper более надежным и значительно улучшает patronictl.

Уведомление об обновлении

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

Режим паузы

  • Внедрите режим паузы для временного отсоединения Patroni от управления экземпляром PostgreSQL (Murat Kabilov, Alexander Kukushkin, Oleksii Kliukin).

    Ранее, для остановки Patroni без завершения работы PostgreSQL, необходимо было отправить сигнал SIGKILL. Новый режим паузы отключает Patroni от кластера PostgreSQL без завершения работы Patroni. Он аналогичен режиму обслуживания в Pacemaker. Patroni по-прежнему отвечает за обновление ключей участника и лидера DCS, но не будет запускать, останавливать или перезапускать сервер PostgreSQL в процессе. Существуют некоторые исключения, например, ручные переключения, перезагрузки и перезапуски все еще разрешены. Вы можете ознакомиться с подробным описанием этой функции .

Кроме того, patronictl поддерживает новые команды pause и resume для переключения режима паузы.

Запланированные и условные перезапуски

  • Добавьте условия к команде перезапуска API (Oleksii Kliukin)

    Эта модификация улучшает перезапуск Patroni путем добавления нескольких условий, которые можно проверить для выполнения перезапуска. Среди этих условий — перезапуск, когда роль PostgreSQL является либо мастером, либо репликой, проверка номера версии PostgreSQL или перезапуск только в случае необходимости применения изменений конфигурации.

  • Добавьте запланированные перезапуски (Oleksii Kliukin)

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

  • Добавить поддержку условных и запланированных перезапусков для patronictl (Мурат Кабилов).

    patronictl restart поддерживает несколько новых опций. Также существует команда patronictl flush для очистки запланированных действий.

Надёжное взаимодействие с DCS

  • Установите значения тайм-аута для Kazoo в соответствии с loop_wait (Alexander Kukushkin)

    Изначально значения ping_timeout и connect_timeout рассчитывались на основе согласованного таймаута сессии. Patroni loop_wait не учитывался. В результате, одно повторное выполнение операции могло занять больше времени, чем таймаут сессии, что приводило к тому, что Patroni отпускал блокировку и понижал уровень.

    Данный набор изменений устанавливает значения тайм-аута для операций ping и соединения равными половине значения loop_wait, что ускоряет обнаружение проблем с соединением и оставляет достаточно времени для повторной попытки соединения, прежде чем потеряется блокировка.

  • Обновлять топологию etcd только после успешного выполнения исходного запроса (Alexander Kukushkin)

    Отложите обновление топологии кластера, известной клиенту, до завершения исходного запроса. При получении топологии кластера, реализуйте тайм-ауты повторных попыток, в зависимости от известного количества узлов в кластере etcd. Это позволяет нашему клиенту отдавать предпочтение получению результатов запроса, а не актуальному списку узлов.

    Оба изменения делают соединения Patroni с DCS более надежными в условиях проблем с сетью.

Patronictl, мониторинг и конфигурация

  • Предоставлять информацию о потоковых репликах через API (Feike Steenbergen)

Ранее не существовало надёжного способа запросить у Patroni сведения об экземплярах PostgreSQL, которым не удаётся передавать изменения потоком, например из-за проблем с соединением. Теперь содержимое pg_stat_replication предоставляется через конечную точку /patroni REST API.

  • Добавить команду Patroni-ctl scaffold (Oleksii Kliukin)

    Добавьте команду для создания структуры кластера в etcd. Кластер создается с использованием указанного пользователем sysid и лидера, а также ключи “лидер” и “участник” становятся постоянными. Эта команда полезна для создания конфигураций, называемых “мастер-мене”, где кластер Patroni, состоящий только из реплик, реплицируется от внешнего мастер-узла, который не использует Patroni. Впоследствии можно удалить ключ “лидер”, повысив один из узлов Patroni и заменив исходный мастер-узел кластером Patroni с высокой доступностью.

  • Добавьте опцию конфигурации bin_dir для определения местоположения исполняемых файлов PostgreSQL (Ants Aasma)

    Будет полезно указывать местоположение исполняемых файлов PostgreSQL явно, когда используются дистрибутивы Linux, поддерживающие одновременную установку нескольких версий PostgreSQL.

  • Разрешить переопределение пути к файлу конфигурации с помощью custom_conf (Alejandro Martínez)

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

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

  • Сделайте Patroni совместимым с новой схемой версии в PostgreSQL 10 и выше (Feike Steenbergen)

    Убедитесь, что Patroni правильно распознает номера версий в формате 2 при выполнении условного перезапуска на основе версии PostgreSQL.

  • Используйте pkgutil для поиска DCS модулей (Alexander Kukushkin)

    Используйте специализированный модуль Python вместо ручного обхода каталогов для поиска DCS модулей.

  • Всегда вызывайте функцию обратного вызова on_start при запуске Patroni (Alexander Kukushkin)

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

  • Не удаляйте активные слоты репликации (Murat Kabilov, Oleksii Kliukin)

    Избегайте удаления активных слотов репликации на основном сервере. PostgreSQL не может удалить такие слоты. Эта модификация позволяет запускать реплики/потребителей, управляемые не Patroni, на основном сервере.

  • Закрывайте соединения Patroni при запуске экземпляра PostgreSQL (Alexander Kukushkin)

    Принуждает Patroni закрывать все предыдущие соединения при запуске узла PostgreSQL. Предотвращает ситуацию, когда старые соединения используются повторно, если процесс postmaster был завершен SIGKILL.

  • Заменять недопустимые символы при создании имен слотов на основе имен участников (Ants Aasma)

    Убедитесь, что имена резервных серверов, которые не соответствуют правилам именования слотов, не приводят к неудаче создания слота и запуска резервного сервера. Замените дефисы в именах слотов на подчеркивания, а все остальные символы, не разрешенные в именах слотов, на их Unicode-коды.


Версия 1.0

Выпущено 2016-07-05

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

Уведомление об обновлении

При обновлении с версии v0.90 или ниже, всегда обновляйте все реплики перед основным сервером. Поскольку мы больше не храним учетные данные для репликации в DCS, старая реплика не сможет подключиться к новому основному серверу.

Динамическая конфигурация

  • Реализуйте динамическую глобальную конфигурацию (Alexander Kukushkin)

    Внедрите новый конечный REST API эндпоинт /config для предоставления параметров конфигурации PostgreSQL и Patroni, которые должны быть установлены глобально для всего кластера HA (мастера и всех реплик). Эти параметры устанавливаются в DCS и, во многих случаях, могут быть применены без нарушения работы PostgreSQL или Patroni. Patroni устанавливает специальный флаг под названием “ожидающий перезапуск”, который отображается через API, когда некоторые значения требуют перезапуска PostgreSQL. В этом случае, перезапуск следует инициировать вручную через API.

    Patroni SIGHUP или POST для /reload заставит перечитать файл конфигурации.

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

    Формат файла конфигурации изменился с v0.90. Patroni по-прежнему совместим с устаревшими файлами конфигурации, но для использования параметров начальной инициализации необходимо их изменить. Пользователям рекомендуется обновить файлы, обратившись к странице документации по динамической конфигурации .

Более гибкая конфигурация*

  • Сделайте конфигурацию PostgreSQL и имя базы данных, к которой подключается Patroni, настраиваемыми (Misja Hoebe)

    Внедрите параметры database и config_base_name конфигурации. В частности, это позволяет запускать Patroni с PipelineDB и другими версиями PostgreSQL.

  • Реализовать возможность настраивать некоторые параметры конфигурации Patroni через переменные окружения (Alexander Kukushkin)

    Сюда входят область действия, имя узла и пространство имён, а также секреты, что упрощает запуск Patroni в динамической среде, i.e. Kubernetes. Подробности см. в поддерживаемых переменных среды .

  • Обновите встроенный контейнер Patroni, чтобы использовать конфигурацию, основанную на окружении (Feike Steenbergen).

  • Добавьте поддержку Zookeeper в образе Docker Patroni (Alexander Kukushkin)

  • Разделите параметры конфигурации Zookeeper и Exhibitor (Alexander Kukushkin)

  • Сделайте, чтобы patronictl использовал код из Patroni для чтения конфигурации (Alexander Kukushkin)

    Это позволяет patronictl использовать конфигурацию, основанную на окружении.

  • Установите имя приложения равным имени узла в primary_conninfo (Alexander Kukushkin)

    Это упрощает идентификацию и настройку синхронной репликации для данного узла.

Повышение стабильности, безопасности и удобства использования

  • Сбросьте sysid и не вызывайте pg_controldata во время восстановления резервной копии (Alexander Kukushkin)

    Эта модификация уменьшает количество шума, генерируемого проверками состояния Patroni API во время длительной инициализации данного узла из резервной копии.

  • Исправить ряд краевых случаев pg_rewind (Alexander Kukushkin)

    Избегайте запуска pg_rewind, если исходный кластер не является мастером.

    Кроме того, избегайте удаления каталога данных при неудачной перемотке, если параметр remove_data_directory_on_rewind_failure не установлен в значение true. По умолчанию он установлен в значение false.

  • Удалите пароли из строки соединения для репликации DCS (Alexander Kukushkin)

    Ранее Patroni всегда использовал учетные данные для репликации из Postgres URL в DCS. Теперь используется учетные данные, указанные в конфигурации Patroni. Секреты (имя пользователя и пароль для репликации) больше не хранятся в DCS.

  • Устраните асинхронные механизмы, связанные с вызовом demote (Alexander Kukushkin)

    Функция Demote теперь полностью асинхронно выполняется, не блокируя DCS взаимодействия.

  • Убедитесь, что patronictl всегда отправляет заголовок авторизации, если это настроено (Alexander Kukushkin)

    Это позволяет patronictl отправлять “защищенные” запросы, i.e, а также перезапускать или переинициализировать Patroni, когда Patroni настроен на требование авторизации для этих операций.

  • Обрабатывать исключение SystemExit корректно (Alexander Kukushkin)

    Избегает проблем, связанных с неправильным завершением работы Patroni при получении SIGTERM

  • Образцы конфигурационных файлов для confd (Alexander Kukushkin)

    Генерирует и динамически изменяет конфигурацию HAProxy на основе состояния Patroni, используя Confide DCS

  • Улучшить и перестроить документацию, чтобы она была более понятной для новых пользователей (Lauri Apple)

  • API необходимо сообщать значение role=master во время остановки pg_ctl (Alexander Kukushkin)

    Делает вызовы обратного вызова более надежными, особенно в случае остановки кластера. Кроме того, вводит опцию pg_ctl_timeout для установки тайм-аута для вызовов старта, остановки и перезапуска через pg_ctl.

  • Исправьте логику повторных попыток в etcd (Alexander Kukushkin)

    Сделайте повторные попытки более предсказуемыми и надежными.

  • Сделайте код Zookeeper более устойчивым к кратковременным проблемам в сети (Alexander Kukushkin)

    Уменьшите время ожидания соединения, чтобы делать попытки соединения с Zookeeper чаще.


Версия 0.90

Выпущено 2016-04-27

Этот выпуск добавляет поддержку Consul, включает новую метку noloadbalance, изменяет поведение метки clonefrom, улучшает обработку pg_rewind и улучшает контроль программы patronictl.

Поддержка Consul

  • Реализовать поддержку Consul (Alexander Kukushkin)

    Patroni работает с Consul, а также с etcd и Zookeeper. Параметры соединения можно настроить в файле YAML.

Новые и улучшенные теги

  • Реализовать тег noloadbalance (Alexander Kukushkin)

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

  • Измените реализацию тега clonefrom (Alexander Kukushkin)

    Ранее требовалось указывать имя узла для команды clonefrom, что приводило к тому, что тегированная реплика клонировалась именно с указанного узла. Новая реализация делает clonefrom булевым тегом: если он установлен в значение true, реплика становится кандидатом для клонирования с других реплик. При наличии нескольких кандидатов, реплики выбирают один случайным образом.

Повышение стабильности и безопасности

  • Множество улучшений в области надежности (Alexander Kukushkin)

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

  • Улучшить скрипт системы, чтобы избежать завершения процессов Patroni при остановке (Jan Keirse, Alexander Kukushkin)

    Ранее, при остановке Patroni, systemd также отправлял сигнал в PostgreSQL. Поскольку Patroni также пытался остановить PostgreSQL самостоятельно, это приводило к отправке различных запросов на завершение работы (умное завершение, за которым следовало быстрое завершение). Это приводило к преждевременному отключению реплик и невозможности восстановления бывшего мастера после понижения. Исправление, предложенное Jan, с предварительными исследованиями Александра.

  • Устранить некоторые случаи, когда предыдущий мастер не мог вызвать pg_rewind перед повторным присоединением в качестве реплики (Oleksii Kliukin)

    Ранее мы вызывали pg_rewind только в случае, когда предыдущий мастер вышел из строя. Измените это, чтобы всегда запускать pg_rewind для предыдущего мастера, при условии, что pg_rewind присутствует в системе. Это устраняет ситуацию, когда мастер завершается до того, как реплики получают последние изменения (i.e во время “умного” завершения работы).

  • Значительные улучшения в тестах, включая тесты для единиц и приемки, в частности, позволяют использовать Zookeeper и Consul (Александр Кукушкин).

  • Сделать Travis CI более быстрым и реализовать поддержку выполнения тестов против Zookeeper (Exhibitor) и Consul (Alexander Kukushkin)

    Оба теста, проверки соответствия и приемки, выполняются автоматически против etcd, Zookeeper и Consul при каждой коммитке или запросе на слияние.

  • Убедитесь, что переменные окружения установлены правильно, прежде чем выполнять команды PostgreSQL через Patroni (Feike Steenbergen)

    Это предотвращает возможность чтения системных переменных окружения при подключении к кластеру PostgreSQL, управляемому Patroni.

Изменения конфигурации и управления

  • Объединить конфигурацию patronictl и Patroni (Feike Steenbergen)

    patronictl может использовать ту же конфигурацию, что и Patroni.

  • Включить Patroni для чтения конфигурации из переменных окружения (Oleksii Kliukin)

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

  • Включите идентификатор системы баз данных в информацию, возвращаемую API (Feike Steenbergen)

  • Реализуйте delete_cluster для всех доступных кластеров (Alexander Kukushkin)

    Включает поддержку DCS, отличных от etcd, в patronictl.


Версия 0.80

Выпущено 2016-03-14

Этот выпуск добавляет поддержку распределенной репликации и упрощает управление Patroni, предоставляя плановое переключение. Можно использовать более старые версии Patroni (в частности, 0.78) в сочетании с этой, чтобы перейти на новую версию. Примечание: функции, связанные с плановым переключением и распределенной репликацией, будут работать только с Patroni 0.80 и выше.

Каскадная репликация

  • Добавить поддержку тегов replicatefrom и clonefrom для узла Patroni (Олексий Клиукин).

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

  • Добавить поддержку запуска методов репликации для инициализации реплики даже без активного соединения для репликации (Олексий Клиукин).

Это полезно для создания реплик из снимков, хранящихся в S3 или FTP. Метод репликации, который не требует активного соединения для репликации, должен содержать no_master: true в конфигурации YAML. Эти скрипты будут вызываться, если соединение для репликации присутствует.

Улучшения Patronictl, API и DCS

  • Реализуйте запланированные переключения при отказе (Feike Steenbergen).

    Переключения при отказе могут быть запланированы на определённое время в будущем с помощью patronictl или вызовов API.

  • Добавьте поддержку параметров dbuser и password в команде patronictl (Feike Steenbergen).

  • Добавить версию PostgreSQL в вывод проверки работоспособности (Feike Steenbergen).

  • Улучшить поддержку Zookeeper в patronictl (Oleksandr Shulgin)

  • Перейти на python-etcd 0.43 (Alexander Kukushkin)

Конфигурация

  • Добавить пример скрипта конфигурации для Patroni (Jan Keirse).
  • Исправить проблему, при которой Patroni игнорирует имя суперпользователя, указанное в файле конфигурации для соединений с базой данных (Alexander Kukushkin).
  • Исправить обработку CTRL-C путем создания отдельного идентификатора сессии и группы процессов для postmaster, запущенного Patroni (Alexander Kukushkin).

Тесты

  • Добавьте тесты на приемлемость с использованием behave, чтобы проверить реальные сценарии работы Patroni (Александр Кукушкин, Алексей Клиукин).

    Тесты можно запускать вручную с помощью команды behave. Они также запускаются автоматически для запросов на слияние и после коммитов.

    Информация о выпуске для некоторых старых версий может быть найдена на странице проекта в GitHub .