Драйвер PostgreSQL не нашёл ведущий сервер базы
«Could not find a server with specified targetServerType: primary» в журнале Keycloak и других Java-приложений: в строке подключения перечислены несколько серверов PostgreSQL, и ни один не принимает запись. Обычно это переключение мастера или кластер без ведущего узла.
Что это значит
Строку подключения JDBC можно задать сразу на несколько серверов PostgreSQL с параметром targetServerType=primary: драйвер перебирает адреса и выбирает тот, что принимает запись. Если ни один сервер не ответил как ведущий, приходит эта ошибка. Рядом в журнале Keycloak обычно видны The connection attempt failed и This connection has been closed, а при работе в кластере ошибки JDBC_PING о невозможности прочитать данные из базы.
Типичная картина: идёт переключение ведущего узла, бывший мастер уже не принимает запись, новый ещё не назначен. Или кластер остался без мастера вовсе.
Как проверить
- Какой из серверов сейчас ведущий:
psql -h pg01 -c "SELECT pg_is_in_recovery();"
psql -h pg02 -c "SELECT pg_is_in_recovery();"
f у ведущего, t у реплик.
- Строка подключения приложения: все ли узлы кластера в ней перечислены и доступны ли их порты с сервера приложения.
- Журнал менеджера кластера (Patroni, pgpool, свои скрипты): было ли переключение в это время.
Что сделать
- Если переключение завершилось, приложение обычно восстанавливает соединения само. Если ошибки продолжаются, перезапустить приложение.
- Если ведущего нет, разбираться с кластером СУБД: это авария базы, а не приложения.
- Вместо списка серверов можно подключать приложения через общий адрес, который всегда указывает на ведущий узел: виртуальный IP или прокси.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать