Соединения с состоянием SD между HAproxy и Postgres

Вопрос или проблема

У меня возникла проблема с подключением между моей базой данных PostgreSQL (кластер управляется Patroni) и HAProxy. Все в приложении, использующем базу данных, работает нормально, и я не вижу никаких проблем, но HAProxy генерирует множество беспокоящих логов:

2025-02-21T15:27:07.368101+01:00 haproxy-psql-01 haproxy[391178]: xx.xx.xx.xx:37806 [21/Feb/2025:15:27:07.314] postgres_front postgres_back/psql-01 1/0/53 131982 SD 43/43/42/42/0 0/0
2025-02-21T15:27:07.368197+01:00 haproxy-psql-01 haproxy[391178]: xx.xx.xx.xx:37806 [21/Feb/2025:15:27:07.314] postgres_front postgres_back/psql-01 1/0/53 131982 SD 43/43/42/42/0 0/0
2025-02-21T15:27:10.440445+01:00 haproxy-psql-01 haproxy[391178]: xx.xx.xx.xx:37826 [21/Feb/2025:15:27:10.380] postgres_front postgres_back/psql-01 1/0/59 134940 SD 44/44/43/43/0 0/0
2025-02-21T15:27:10.440669+01:00 haproxy-psql-01 haproxy[391178]: xx.xx.xx.xx:37826 [21/Feb/2025:15:27:10.380] postgres_front postgres_back/psql-01 1/0/59 134940 SD 44/44/43/43/0 0/0
2025-02-21T15:27:10.451244+01:00 haproxy-psql-01 haproxy[391178]: xx.xx.xx.xx:37816 [21/Feb/2025:15:27:10.377] postgres_front postgres_back/psql-01 1/0/74 159457 SD 43/43/42/42/0 0/0
2025-02-21T15:27:10.451296+01:00 haproxy-psql-01 haproxy[391178]: xx.xx.xx.xx:37816 [21/Feb/2025:15:27:10.377] postgres_front postgres_back/psql-01 1/0/74 159457 SD 43/43/42/42/0 0/0
2025-02-21T15:27:12.477624+01:00 haproxy-psql-01 haproxy[391178]: xx.xx.xx.xx:37832 [21/Feb/2025:15:27:12.382] postgres_front postgres_back/psql-01 1/0/95 172320 SD 43/43/42/42/0 0/0

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

Иногда я получаю эту ошибку только в логах приложения:

[Z3005] query failed: [0] PGRES_FATAL_ERROR:SSL SYSCALL error: EOF detected

Вот конфигурация HAProxy:

global
    maxconn 6000
    log /dev/log    local0
#    log /dev/log    local1 notice
    log /dev/log    local1 info
    chroot      /var/lib/haproxy
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    log global
    option log-health-checks
    mode tcp
    option tcplog
    option tcpka
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s
    timeout queue 1m
    log global
    maxconn 3000

frontend stats
    mode http
    bind *:8404
    stats enable
    stats uri /stats
    stats refresh 10s

frontend postgres_front
    bind *:5432
    mode tcp
    default_backend postgres_back

backend postgres_back
    mode tcp
    option tcp-check
    option httpchk GET /primary
    http-check expect status 200
    default-server inter 3s fall 5 rise 2 on-marked-down shutdown-sessions
    server psql-01 xx.xx.xx.xx:5432 maxconn 1000 check port 8008 check-ssl verify none
    server psql-02 xx.xx.xx.xx:5432 maxconn 1000 check port 8008 check-ssl verify none
    server psql-03 xx.xx.xx.xx:5432 maxconn 1000 check port 8008 check-ssl verify none

Версия HAProxy: HAProxy version 2.8.5-1ubuntu3.2 2024/12/02

Знаете ли вы, как решить эту проблему, стоит ли беспокоиться по поводу этого вывода лога?

Я пробовал отправлять SSL-сертификаты и даже создавать новые, но это не помогает. Когда я обхожу HAProxy, все работает нормально (использую IP-адрес активного узла базы данных), ошибок в логах приложения нет. Кроме того, когда я отключаю SSL на PostgreSQL, все состояния завершаются в желаемом состоянии.

с уважением

Ответ или решение

В вопросе, представленном вам, описана проблема с состояниями подключений между базой данных PostgreSQL, управляемой Patroni, и балансировщиком нагрузки HAProxy. Основная проблема заключается в том, что многие подключения заканчиваются со статусом «SD» в логах HAProxy при включенном режиме SSL на PostgreSQL. После отключения SSL эти состояния переходят в «–», что считается нормальным.

Теория (Theory)

Чтобы понять, что означает статус подключения «SD», необходимо обратиться к процессу логирования в HAProxy. В статусе подключения HAProxy символы обозначают различные состояния. Конкретно «SD» расшифровывается следующим образом:

  • S: Сервер инициализировал закрытие соединения (Server abort).
  • D: HAProxy обнаружил завершение передачи данных или сам закрыл соединение (Data Transfer Detected).

Такой статус часто встречается, когда есть какие-то проблемы с безопасным соединением (SSL/TLS), что могут быть вызваны ручным завершением сессии сервером, возможными тайм-аутами или ошибками в шифровании.

Пример (Example)

Рассмотрим пример. При включенном SSL приложение использует шифрованное соединение для взаимодействия с вашей базой данных PostgreSQL через HAProxy. В случаях, когда SSL неправильно конфигурирован или снабжен неверными сертификатами, HAProxy может регистрировать закрытие соединений со статусом "SD". Это может быть связано с:

  • Неправильными сертификатами SSL.
  • Ошибками в настройках шифрования.
  • Другими проблемами, связанными с безопасностью соединения.

Ошибка приложения PGRES_FATAL_ERROR:SSL SYSCALL error: EOF detected указывает на преждевременное завершение безопасного соединения. Это также часто связано с проблемами в настройке SSL.

Применение (Application)

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

  1. Проверка SSL сертификатов: Необходимо убедиться, что используемые серверные сертификаты для PostgreSQL корректны и доверенные. Это предполагает проверку их валидности и соответствие всем необходимым стандартам. Убедитесь, что не используются просроченные или само подписанные сертификаты, если это противоречит политике безопасности.

  2. Конфигурация HAProxy:

    • Убедитесь, что используемые настройки для SSL в HAProxy совпадают с настройками в PostgreSQL. Это включает наличие одинаковых протоколов и стандартов шифрования.
    • Проверьте и, возможно, пересмотрите настройки check-ssl и verify none в конфигурации HAProxy. Как правило, рекомендуется избегать verify none и использовать проверку подлинности, если это возможно.
  3. Диагностика временных интервалов:

    • Проверьте временные интервалы соединения, такие как timeout client, timeout server, и измените их, если это необходимо, чтобы избежать принудительного закрытия соединений из-за тайм-аута.
  4. Обновление ПО:

    • Убедитесь, что используемые версии HAProxy и PostgreSQL актуальны и поддерживают все последние исправления уязвимостей и багов, связанных с SSL/TLS подключениями и общими соединениями.
  5. Журналы и мониторинг:

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

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

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

Оцените материал
Добавить комментарий

Капча загружается...