Поддержка watchdog
Эта страница переведена при помощи нейросети GigaChat.
Наличие нескольких серверов PostgreSQL, работающих как первичные, может привести к потере транзакций из-за расхождения временных шкал. Эта ситуация также называется проблемой split-brain. Чтобы избежать split-brain, Patroni должен гарантировать, что PostgreSQL не будет принимать фиксацию каких-либо транзакций после истечения срока действия ключа лидера в DCS. При нормальных обстоятельствах Patroni попытается добиться этого, останавливая PostgreSQL, когда обновление блокировки лидера не удается по любой причине. Однако это может не произойти по различным причинам:
- Patroni завершается аварийно из-за ошибки, условия нехватки памяти или случайного завершения системным администратором.
- Завершение работы PostgreSQL происходит слишком медленно.
- Patroni не получает возможности выполниться из-за высокой нагрузки на систему, приостановки виртуальной машины гипервизором или других проблем инфраструктуры.
Для гарантии корректного поведения в этих условиях Patroni поддерживает устройства watchdog. Watchdog — это программные или аппаратные механизмы, которые перезагрузят всю систему, если не получат heartbeat-сигнал в течение заданного промежутка времени. Это добавляет дополнительный уровень защиты на случай, если обычные механизмы предотвращения split-brain в Patroni не сработают.
Patroni попытается активировать watchdog перед повышением PostgreSQL до первичного узла. Если активация watchdog не удалась и режим watchdog установлен в required, узел откажется становиться лидером. При принятии решения об участии в выборах лидера Patroni также проверит, позволит ли конфигурация watchdog ему вообще стать лидером. После понижения PostgreSQL (например, из-за ручного failover) Patroni снова отключит watchdog. Watchdog также будет отключен, пока Patroni находится в состоянии паузы.
По умолчанию Patroni настроит watchdog на истечение срока действия за 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), чтобы перейти в состояние, где все клиентские подключения будут завершены.
Safety margin — это количество времени, которое Patroni резервирует для интервала между обновлением ключа лидера и heartbeat watchdog. Patroni попытается отправить heartbeat немедленно после подтверждения обновления ключа лидера. Если процесс Patroni будет приостановлен на продолжительное время в точно нужный момент, heartbeat может быть задержан более чем на safety margin без срабатывания watchdog. Это создает временное окно, когда watchdog не сработает до истечения срока действия ключа лидера, что нарушает гарантию. Чтобы быть абсолютно уверенным, что watchdog сработает при любых обстоятельствах, настройте watchdog на истечение срока действия после половины TTL, установив safety_margin в -1, чтобы установить тайм-аут watchdog в ttl // 2. Если требуется такая гарантия, вероятно, следует увеличить ttl и/или уменьшить loop_wait и retry_timeout.
В настоящее время watchdog поддерживаются только с использованием интерфейса устройства watchdog Linux.
Настройка программного сторожевого таймера в Linux
Конфигурация Patroni по умолчанию попытается использовать /dev/watchdog в Linux, если он доступен для Patroni. Для большинства случаев использования программного watchdog, встроенного в ядро Linux, достаточно безопасно.
Чтобы включить программный watchdog, выполните следующие команды от имени root перед запуском Patroni:
modprobe softdog
# Замените postgres на пользователя, под которым запускается patroni
chown postgres /dev/watchdog
Для тестирования может быть полезно отключить перезагрузку, добавив soft_noboot=1 в командную строку modprobe. В этом случае watchdog просто запишет строку в кольцевой буфер ядра, видимую через dmesg.
Patroni будет логировать информацию о watchdog, когда он будет успешно включен.