Patroni REST API
Patroni предоставляет обширный REST API. Сам Patroni использует его во время выбора лидера, инструмент patronictl — для аварийных и плановых переключений, повторной инициализации, перезапусков и перезагрузки конфигурации, а HAProxy и другие балансировщики — для проверок работоспособности HTTP. API также можно применять для мониторинга. Ниже перечислены конечные точки REST API Patroni.
Конечные точки проверки работоспособности
На все запросы проверки GET Patroni возвращает документ JSON с состоянием узла и код состояния HTTP. Если документ JSON не нужен, вместо GET можно использовать метод HEAD или OPTIONS.
Следующие запросы REST API Patroni возвращают код HTTP 200, только когда узел Patroni работает как первичный сервер и владеет блокировкой лидера:
GET /GET /primaryGET /read-write
GET /standby-leader: возвращает код HTTP 200, только когда узел Patroni является лидером резервного кластера .GET /leader: возвращает код HTTP 200, когда узел Patroni владеет блокировкой лидера. Главное отличие от двух предыдущих конечных точек — не учитывается, работает ли PostgreSQL какprimaryилиstandby_leader.GET /replica: конечная точка проверки реплики. Возвращает код HTTP 200, только когда узел Patroni находится в состоянииrunning, его роль —replica, а тегnoloadbalanceне задан.GET /replica?replication_state=<required state>: конечная точка проверки реплики. Помимо проверокreplicaона проверяет соответствие состояния репликации требуемому. Особенно полезна сreplication_state=streaming, чтобы исключить реплики, которые ещё догоняют кластер при восстановлении из архива.GET /replica?lag=<max-lag>: конечная точка проверки реплики. Помимо проверокreplicaона проверяет отставание репликации и возвращает код 200, только если оно меньше заданного значения. Для повышения производительности ключ cluster.last_leader_operation из DCS используется как позиция wal лидера при вычислении отставания реплики. max-lag задаётся в байтах целым числом или понятным человеку значением, например 16kB, 64MB, 1GB.GET /replica?lag=1048576GET /replica?lag=1024kBGET /replica?lag=10MBGET /replica?lag=1GB
GET /replica?tag_key1=value1&tag_key2=value2: конечная точка проверки реплики. Дополнительно проверяет пользовательские тегиkey1иkey2и их значения в разделе tags конфигурации yaml. Если тег не определён для экземпляра или его значение не совпадает со значением запроса, возвращается код HTTP 503.В следующих запросах проверяется состояние leader или standby-leader, поэтому Patroni игнорирует все пользовательские теги.
GET /?tag_key1=value1&tag_key2=value2GET /leader?tag_key1=value1&tag_key2=value2GET /primary?tag_key1=value1&tag_key2=value2GET /read-write?tag_key1=value1&tag_key2=value2GET /standby_leader?tag_key1=value1&tag_key2=value2GET /standby-leader?tag_key1=value1&tag_key2=value2
GET /read-only: аналогична предыдущей конечной точке, но также включает первичный сервер.GET /synchronousилиGET /sync: возвращает код HTTP 200, только когда узел Patroni работает как синхронный резервный сервер.GET /read-only-sync: аналогична предыдущей конечной точке, но также включает первичный сервер.GET /quorum: возвращает код HTTP 200, только когда этот узел Patroni указан как узел кворума вsynchronous_standby_namesпервичного сервера.GET /read-only-quorum: аналогична предыдущей конечной точке, но также включает первичный сервер.GET /asynchronousилиGET /async: возвращает код HTTP 200, только когда узел Patroni работает как асинхронный резервный сервер.GET /asynchronous?lag=<max-lag>илиGET /async?lag=<max-lag>: конечная точка проверки асинхронного резервного сервера. Помимо проверокasynchronousилиasyncона проверяет отставание репликации и возвращает код 200, только если оно меньше заданного значения. Для повышения производительности ключ cluster.last_leader_operation из DCS используется как позиция wal лидера при вычислении отставания реплики. max-lag задаётся в байтах целым числом или понятным человеку значением, например 16kB, 64MB, 1GB.GET /async?lag=1048576GET /async?lag=1024kBGET /async?lag=10MBGET /async?lag=1GB
GET /health: возвращает код HTTP 200, только когда PostgreSQL запущен и работает.GET /liveness: возвращает код HTTP 200, если цикл сигналов активности Patroni работает правильно, и 503, если последняя итерация на первичном сервере была болееttlсекунд назад или более2*ttlназад на реплике. Можно использовать дляlivenessProbe.GET /readiness?lag=<max-lag>&mode=apply|write: возвращает код HTTP 200, когда узел Patroni является лидером либо когда PostgreSQL запущен, реплицируется и не слишком отстаёт от лидера. Параметр lag задаёт допустимое отставание резервного сервера и по умолчанию равенmaximum_lag_on_failover. Lag можно указать в байтах или понятных человеку значениях, например 16kB, 64MB или 1GB. Mode определяет, должен ли WAL быть воспроизведён (apply) или только получен (write). По умолчанию используется apply.При использовании как
readinessProbeKubernetes конечная точка допускает готовность недавно запущенных подов только после того, как они догнали лидера. В сочетании с PodDisruptionBudget это защищает от слишком раннего завершения лидера при скользящем перезапуске узлов. Кроме того, не успевающие за репликацией реплики не обслуживают трафик только для чтения. Конечную точку можно использовать дляreadinessProbe, когда конечные точки Kubernetes нельзя применять для выборов лидера (OpenShift).
Конечная точка liveness очень легковесна и не выполняет SQL. Проверки следует настроить так, чтобы они начинали завершаться ошибкой примерно к моменту истечения ключа лидера. При значении ttl по умолчанию 30s пример выглядит так:
Конечная точка мониторинга
Patroni использует GET /patroni при выборе лидера. Её также может использовать система мониторинга. Создаваемый этой конечной точкой документ JSON имеет ту же структуру, что и документы конечных точек проверки работоспособности.
Пример: исправный кластер
Пример: кластер без блокировки
Пример: кластер без блокировки с включённым отказоустойчивым режимом DCS
Пример: кластер с включённым режимом паузы
Получите метрики Patroni в формате Prometheus через конечную точку GET /metrics.
Значения состояния PostgreSQL
Метрика patroni_postgres_state предоставляет числовое представление текущего состояния экземпляра PostgreSQL. Это полезно системам мониторинга и оповещений, отслеживающим изменения состояния во времени. Числовые значения создаются статическим методом PostgresqlState.get_metrics_description().
| Значение | Имя состояния | Описание |
|---|---|---|
| 0 | initdb | Инициализация нового кластера |
| 1 | initdb_failed | Ошибка инициализации нового кластера |
| 2 | custom_bootstrap | Выполнение пользовательского сценария инициализации |
| 3 | custom_bootstrap_failed | Ошибка пользовательского сценария инициализации |
| 4 | creating_replica | Создание реплики с первичного сервера |
| 5 | running | PostgreSQL работает нормально |
| 6 | starting | PostgreSQL запускается |
| 7 | bootstrap_starting | Запуск после пользовательской инициализации |
| 8 | start_failed | Ошибка запуска PostgreSQL |
| 9 | restarting | PostgreSQL перезапускается |
| 10 | restart_failed | Ошибка перезапуска PostgreSQL |
| 11 | stopping | PostgreSQL останавливается |
| 12 | stopped | PostgreSQL остановлен |
| 13 | stop_failed | Ошибка остановки PostgreSQL |
| 14 | crashed | PostgreSQL аварийно завершился |
Значения состояния PostgreSQL
Эти числовые значения фиксированы и никогда не изменятся для сохранения обратной совместимости с существующими системами мониторинга. Новым состояниям будут назначаться новые числа без изменения существующих.
Конечные точки состояния кластера
- Конечная точка
GET /clusterсоздаёт документ JSON с текущей топологией и состоянием кластера:
- Конечная точка
GET /historyпоказывает историю плановых и аварийных переключений кластера. Формат очень похож на содержимое файлов истории в каталогеpg_wal; единственное отличие — поле времени создания новой временной шкалы.
Конечная точка конфигурации
GET /config: получить текущую версию динамической конфигурации:
PATCH /config: изменить существующую конфигурацию.
Приведённый вызов REST API изменяет существующую конфигурацию и возвращает новую.
Проверим, что узел обработал конфигурацию. Сначала он должен начать выводить строки журнала каждые 5 секунд (loop_wait=5). Изменение “max_connections” требует перезапуска, поэтому должен появиться флаг “pending_restart”:
Удаление параметров:
Чтобы удалить или сбросить параметр, измените его на null:
Приведённый вызов удаляет postgresql.parameters.max_connections из динамической конфигурации.
PUT /config: также можно безусловно полностью перезаписать существующую динамическую конфигурацию:
Конечные точки планового и аварийного переключения
Плановое переключение
Конечная точка /switchover работает только в исправном кластере с лидером. Она также позволяет запланировать переключение на заданное время.
При вызове /switchover кандидата можно указать, но, в отличие от /failover, это не обязательно. Если кандидат не задан, после понижения лидера в выборах участвуют все подходящие узлы кластера.
В теле JSON запроса POST необходимо указать поле leader. Поля candidate и scheduled_at необязательны и позволяют запланировать переключение на определённое время.
В зависимости от ситуации запросы возвращают разные коды и тела HTTP. Код 200 означает успешное завершение планового или аварийного переключения. При успешном планировании Patroni возвращает код HTTP 202. При ошибке возвращается один из кодов 400, 412 или 503 с подробностями в теле ответа.
DELETE /switchover удаляет текущее запланированное переключение.
Пример: переключение на любой исправный резервный сервер
Пример: переключение на определённый узел
Пример: запланировать переключение с лидера на любой другой исправный резервный сервер кластера в определённое время.
Аварийное переключение
Конечная точка /failover выполняет ручное аварийное переключение при отсутствии исправных узлов, например на асинхронный резервный сервер, если все синхронные недостаточно исправны для повышения. Однако отсутствие лидера не является обязательным условием: аварийное переключение можно запустить и в исправном кластере.
В теле JSON запроса POST необходимо указать поле candidate. Если задано поле leader, вместо этого запускается плановое переключение.
Пример:
Будьте предельно осторожны при использовании этой конечной точки: в некоторых ситуациях она может привести к потере данных. В большинстве случаев потребности администратора удовлетворяет конечная точка планового переключения .
Конечные точки POST /switchover и POST /failover используются соответственно patronictl_switchover
и patronictl_failover
.
DELETE /switchover используется командой patronictl flush cluster-name switchover
.
| Аварийное переключение | Плановое переключение | |
|---|---|---|
| Требуется указать лидера | нет | да |
| Требуется указать кандидата | да | нет |
| Можно выполнить в паузе | да | да (только на заданного кандидата) |
| Можно запланировать | нет | да (если кластер не на паузе) |
Сравнение аварийного и планового переключения
Исправный резервный сервер
Чтобы участвовать в выборах лидера при плановом переключении или стать лидером как кандидат аварийного либо планового переключения, участник должен пройти несколько проверок:
- быть доступным через API Patroni;
- не иметь тег
nofailover, равныйtrue; - иметь полностью работоспособный сторожевой таймер, если того требует конфигурация;
- при плановом переключении в исправном кластере или автоматическом аварийном переключении не превышать максимальное отставание репликации (параметр конфигурации
maximum_lag_on_failover); - при плановом переключении в исправном кластере или автоматическом аварийном переключении не иметь номер временной шкалы меньше шкалы кластера, если параметр конфигурации
check_timelineравенtrue; - в синхронном режиме
:
- при плановом переключении с кандидатом или без него быть перечисленным среди участников ключа
/sync; - при аварийном переключении как в исправном, так и в неисправном кластере эта проверка пропускается.
- при плановом переключении с кандидатом или без него быть перечисленным среди участников ключа
При ручном аварийном переключении в кластере без лидера кандидату разрешается повышение, даже если при включённом синхронном режиме его нет среди участников ключа /sync, его отставание превышает допустимый максимум или номер временной шкалы меньше последней известной шкалы кластера.
Конечная точка перезапуска
POST /restart: перезапускает Postgres на определённом узле вызовомPOST /restart. В теле JSON запросаPOSTможно необязательно указать условия перезапуска:- restart_pending: логическое значение; при
truePatroni перезапускает PostgreSQL только при ожидающем перезапуске для применения изменений конфигурации. - role: выполнять перезапуск, только если текущая роль узла совпадает с ролью запроса POST.
- postgres_version: выполнять перезапуск, только если текущая версия postgres меньше указанной в запросе POST.
- timeout: время ожидания начала приёма соединений PostgreSQL. Переопределяет
primary_start_timeout. - schedule: временная метка с часовым поясом для планирования перезапуска в будущем.
- restart_pending: логическое значение; при
DELETE /restart: удаляет запланированный перезапуск
Конечные точки POST /restart и DELETE /restart используются соответственно patronictl_restart
и patronictl flush cluster-name restart
.
Конечная точка перезагрузки конфигурации
Вызов POST /reload требует от Patroni повторно прочитать и применить файл конфигурации. Это эквивалентно отправке процессу Patroni сигнала SIGHUP. Если изменены параметры Postgres, требующие перезапуска, например shared_buffers, Postgres всё равно нужно явно перезапустить через конечную точку POST /restart или patronictl_restart
.
Конечная точка перезагрузки используется patronictl_reload .
Конечная точка повторной инициализации
POST /reinitialize: повторно инициализирует каталог данных PostgreSQL на заданном узле. Разрешено выполнять только на репликах. Вызов удаляет каталог данных и запускает pg_basebackup либо другой метод создания реплики
.
Вызов может завершиться ошибкой, если Patroni циклически пытается восстановить или перезапустить отказавший Postgres. Чтобы обойти проблему, укажите {"force":true} в теле запроса.
В теле запроса можно указать {“from-leader”:true}, чтобы получить basebackup непосредственно с узла-лидера. Это полезно при повторной инициализации после отказа всех узлов-реплик.
Конечная точка повторной инициализации используется patronictl_reinit .