Что это значит

Строку подключения JDBC можно задать сразу на несколько серверов PostgreSQL с параметром targetServerType=primary: драйвер перебирает адреса и выбирает тот, что принимает запись. Если ни один сервер не ответил как ведущий, приходит эта ошибка. Рядом в журнале Keycloak обычно видны The connection attempt failed и This connection has been closed, а при работе в кластере ошибки JDBC_PING о невозможности прочитать данные из базы.

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

Как проверить

  1. Какой из серверов сейчас ведущий:
psql -h pg01 -c "SELECT pg_is_in_recovery();"
psql -h pg02 -c "SELECT pg_is_in_recovery();"

f у ведущего, t у реплик.

  1. Строка подключения приложения: все ли узлы кластера в ней перечислены и доступны ли их порты с сервера приложения.
  2. Журнал менеджера кластера (Patroni, pgpool, свои скрипты): было ли переключение в это время.

Что сделать

  1. Если переключение завершилось, приложение обычно восстанавливает соединения само. Если ошибки продолжаются, перезапустить приложение.
  2. Если ведущего нет, разбираться с кластером СУБД: это авария базы, а не приложения.
  3. Вместо списка серверов можно подключать приложения через общий адрес, который всегда указывает на ведущий узел: виртуальный IP или прокси.