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

Поддержка сторожевых таймеров

примечание

Эта страница переведена при помощи нейросети GigaChat.

Наличие нескольких серверов PostgreSQL, работающих в качестве основных, может привести к потере транзакций из-за расхождения временных рамок. Эта ситуация также называется проблемой «split-brain». Чтобы этого избежать, Patroni должен убедиться, что PostgreSQL не примет никаких подтверждений транзакций после истечения срока действия ключа лидера в системе управления конфигурацией (DCS). В обычных условиях Patroni попытается добиться этого, остановив PostgreSQL при сбое обновления блокировки лидера по любой причине. Однако это может не произойти по разным причинам:

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

Чтобы гарантировать правильное поведение в этих условиях, Patroni поддерживает функциональность сторожевых таймеров. Сторожевые таймеры представляют собой программные или аппаратные механизмы, которые будут перезагружать всю систему, если они не получат сигнал поддержания активности в течение заданного периода времени. Это добавляет дополнительный уровень защиты от сбоев в случае отказа обычных механизмов защиты из-за «split-brain» Patroni.

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

По умолчанию Patroni настроит сторожевой таймер так, чтобы он истекал за 5 секунд до истечения срока действия TTL. С настройками по умолчанию для loop_wait=10 и ttl=30 это дает петле HA не менее 15 секунд (ttl - safety_margin - loop_wait) для завершения перед тем, как система будет принудительно сброшена. По умолчанию доступ к DCS настроен со временем ожидания 10 секунд. Это означает, что когда DCS недоступен, например из-за проблем с сетью, у Patroni и PostgreSQL будет хотя бы 5 секунд (ttl - safety_margin - loop_wait - retry_timeout) для перехода в состояние, при котором все клиентские соединения будут завершены.

Запас прочности – это время, которое Patroni резервирует между обновлением ключа лидера и активацией сторожевого таймера. Patroni попытается отправить подтверждение сразу после подтверждения обновления лидерского ключа. Если процесс Patroni приостановлен на длительное время именно в нужный момент, отправка подтверждения может быть задержана более чем на запас времени без срабатывания сторожевого таймера. В результате получается окно времени, в течение которого сторожевой таймер не сработает до истечения срока действия лидерского ключа, что делает гарантию недействительной. Чтобы быть абсолютно уверенным в том, что сторожевой таймер сработает при любых обстоятельствах, настройте его на срабатывание через половину TTL, установив safety_margin равным -1, чтобы установить время ожидания сторожевого таймера на ttl // 2. Если требуется такая гарантия, рекомендуется увеличить значение ttl и/или уменьшить параметры loop_wait и retry_timeout.

В настоящее время поддерживаются только сторожевые таймеры, использующие интерфейс устройства сторожевого таймера Linux.

Настройка программного сторожевого таймера в Linux

Конфигурация Patroni по умолчанию попытается использовать /dev/watchdog в Linux, если она доступна для Patroni. Для большинства случаев использования встроенного программного сторожевого таймера ядра Linux достаточно безопасно.

Чтобы включить программный сторожевой таймер, выполните следующие команды от имени root перед запуском Patroni:

modprobe softdog
# Replace postgres with the user you will be running patroni under
chown postgres /dev/watchdog

Для тестирования может быть полезно отключить перезагрузку, добавив soft_noboot=1 в командную строку modprobe. В этом случае сторожевой таймер просто зарегистрирует строку в кольцевом буфере ядра, видимый через dmesg.

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