У нас есть микросервисы Spring, работающие в кластере Azure Kubernetes и подключенные к набору реплик MongoDB (3 узла). После правильной работы в течение некоторого времени мы получаем следующую ошибку:
.Timed out after 30000 ms while waiting for a server that matches
ReadPreferenceServerSelector{readPreference=primary}.
Client view of cluster state is
{type=REPLICA_SET, servers=[
{address=mongo01.myhost.cloud:27017, type=UNKNOWN,
state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket},
caused by {java.net.SocketTimeoutException: connect timed out}},
{address=mongo02.myhost.cloud:27017, type=REPLICA_SET_SECONDARY,
roundTripTime=2.2 ms, state=CONNECTED},
{address=mongo03.myhost.cloud:27017, type=REPLICA_SET_SECONDARY,
roundTripTime=1.2 ms, state=CONNECTED}];
Как видно из журнала ошибок, основной узел не может подключиться, в то время как два дополнительных узла подключены.
- Я не могу понять, почему эта ошибка возникает после успешного запуска приложения в течение некоторого времени?
- Что можно исправить?
Если я подключаюсь к тому же набору реплик MongoDB через приложение, работающее в моей локальной системе, я не сталкиваюсь с этой проблемой.
Я ссылался на некоторые другие ресурсы, такие как Springboot дает сбой, даже если один член реплики выходит из строя и JIRA-MongoDB: MongoSocketOpenException: Exception opens socket
Как вы настроили кластер Kuberenetes? Bare-metal или какое-то облачное решение? Как вы развернули приложения MongoDB в Kubernetes — не могли бы вы поделиться инструкцией, которую вы использовали? Не могли бы вы поделиться некоторыми логами из сломанного модуля с помощью команды
kubectl logs {broken-pod}
(как я понимаю, это то, что вы имеете в виду под узлом?). Пожалуйста, добавьте недостающую информацию в свой пост.@Mikolaj Это облачное решение Azure. Сообщение об ошибке, которым я поделился, взято из журналов сломанного модуля. Я попытался сохранить четкость и не оставлять здесь весь стек ошибок. Когда я говорю узел, я на самом деле имею в виду узел, как в «узлах в наборе реплик MongoDB», а не сервисные модули в Kubernetes.
Не могли бы вы проверить статус неработающего модуля — это состояние
running
или что-то другое? Не могли бы вы подтвердить, что вы можете запустить сломанный модуль и выполнить некоторые основные команды, проверить пинг и т. д.?@Mikolaj Да, я могу запустить сломанный модуль и запустить команды netstat. И этот модуль находится в состоянии
running
.