Примечания к выпускам
Версия 4.1.5
Выпущено 2026-08-12
Улучшения совместимости
Совместимость с PostgreSQL 14.24, 15.19, 16.15, 17.11, 18.6 (Alexander Kukushkin)
Добавьте новый
output_plugin_librariesGUC, который ограничивает вывод плагинов логического декодирования.
Улучшения
Записывать 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в уведомление systemdRELOADING=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
/clusterendpoint и команда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 в конечную точку
/metricsREST API (Ivan Filianin)Информация о состоянии экземпляра PostgreSQL теперь доступна в формате выходных данных Prometheus от
/metricsREST 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, если атрибутpyinstallertocотсутствует.Устранить проблемы с поддержкой 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_changecallback для первичного сервера, который не смог запуститься после сбоя, чтобы увеличить вероятность выполнения 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 NULLxmin, которое распространяется на новый первичный сервер. Это приводит к тому, что горизонтxminне перемещается вперед, и невозможно выполнить очистку мертвых записей. С этой поправкой Patroni создает физические слоты репликации, которые должны быть неактивными, но имеют значениеNOT NULLxmin.Устранить не обработанные
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. - Конечная точка
/metricsREST API больше не будет отчитываться о метрикеpatroni_master. - Команда patronictl
больше не принимает опцию
--masterни для одной команды. Вместо этого следует использовать опции--leaderили--primary. - Опция
no_masterв декларативной конфигурации методов создания пользовательских реплик больше не рассматривается как специальная опция, используйте вместо неёno_leader. - Скрипт
patroni_wale_restoreбольше не принимает опцию--no_master. - Скрипт
patroni_barmanбольше не принимает опцию--role=master. - Все скрипты обратного вызова выполняются с опцией
role=primary, вместоrole=master.
- На Kubernetes Patroni по умолчанию устанавливает метку
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 /failsafeREST 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_tablespacesGUC (Polina Bungina)allow_in_place_tablespacesне только было добавлено в PostgreSQL 15, но также было применено патчинг к PostgreSQL 10-14.
Версия 3.3.0
Выпущено 2024-04-04
Все более старые версии Partoni несовместимы с ydiff>=1.3.
Существуют следующие варианты решения проблемы:
- обновите Patroni до последней версии
- установите
ydiff<1.3после установки Patroni - установите модуль
cdiff
Новые возможности
Добавьте возможность передачи
auth_dataв клиент Zookeeper (Aras Mumcuyan)Оно позволяет указать учетные данные для аутентификации, которые необходимо использовать для соединения.
Добавьте скрипт из дополнения для интеграции с
Barman(Israel Barth Rubio)Предоставьте приложение
patroni_barman, которое позволяет выполнятьBarmanоперации удаленно и может использоваться в качестве пользовательской начальной инициализации/пользовательского метода реплики или в качествеon_role_changecallback. Пожалуйста, ознакомьтесь с здесь для получения дополнительной информации.Поддержка формата журнала
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_namesGUC из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 в течение неопределенного времени.
Разрешить
etcd3URL в опции--dcs-urlкоманды patronictl (Israel Barth Rubio)Если пользователи попытаются передать
etcd3URL через опцию--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)
Опция
insecureCtl не работала должным образом, когда использовались клиентские сертификаты для 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 с старого первичного сервера, что сделает невозможным его запуск в качестве резервного. Архивируя файлыreadyWAL, мы не только решаем эту проблему, но и в целом улучшаем процесс непрерывного архивирования.Игнорировать ошибки
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)
boto2.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)
- Patroni не будет вызывать метод
bootstrap, если каталогPGDATAотсутствует или пуст. - Patroni не завершит работу при несовпадении sysid в режиме паузы, а только запишет предупреждение.
- Узел не будет пытаться захватить ключ лидера в режиме паузы, если Postgres работает не в режиме восстановления (принимает записи), но sysid не совпадает с ключом initialize.
- Patroni не будет вызывать метод
Применять
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и 13channel_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о необходимости её использования.
Новые возможности
Реализована поддержка Patroni на чистом RAFT (Alexander Kukushkin)
Это позволяет запускать Patroni без сторонних зависимостей (3rd party), таких как Etcd, Consul или Zookeeper. Для высокой доступности потребуется либо три узла Patroni, либо два узла Patroni и один узел с
patroni_raft_controller. Дополнительные сведения приведены в документации .Реализована поддержка протокола 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)
При выполнении
reinitPatroni уже удалял не только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 13pg_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 /asyncREST 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)
Избыточное имя кластера больше не будет отображаться в каждой строке, только в заголовке таблицы.
Выдавать ошибку, если указан файл конфигурации, но он не найден (Kaarel Moppel)
Ранее patronictl сообщал только об одном
DEBUGсообщении.Устранена проблема с непроинициализированным K8s-подом, приводящим к сбоям patronictl (Alexander Kukushkin)
Patroni опирается на определенные аннотации для контейнеров в K8s. Когда один из контейнеров Patroni останавливается или запускается, соответствующих аннотаций еще нет, и patronictl выдавал исключение.
Повышение стабильности
Применить задержку 1 при неудаче вызова сервера K8s LIST API (Alexander Kukushkin)
В основном необходимо избегать перегрузки логов, но также это помогает предотвратить зависание основного потока.
Повторите попытку, если возвращается
retry-afterHTTP заголовок от 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.confPatroni непрерывно перезапускал реплику, если
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)
- Все скрипты оболочки, используемые для интеграционных тестов, переписываются на Python.
- Команда
pg_ctl killбудет использоваться для остановки PostgreSQL на не-POSIX системах. - Не пытайтесь использовать сокеты 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-agentHTTP для всех 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 игнорирует его, если параметр PostgreSQLhba_fileустановлен.Поддержка подключения через сокет UNIX к локальному кластеру PostgreSQL (Alexander Kukushkin)
Добавьте опцию
use_unix_socketв разделpostgresqlконфигурации Patroni. При установке в значение true и при условии, что опция PostgreSQLunix_socket_directoriesне пуста, Patroni использует первое значение из неё для подключения к локальному кластеру PostgreSQL. Еслиunix_socket_directoriesне определено, Patroni предполагает его значение по умолчанию и полностью опускает параметрhostв строке подключения к PostgreSQL.Поддержка изменения учетных данных суперпользователя и репликации при перезагрузке (Alexander Kukushkin)
Поддержка хранения файлов конфигурации вне каталога данных PostgreSQL (@jouir)
Добавьте новый параметр конфигурации
postgresqlconfig_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 .