Ошибки записи в MongoDB элемент набора основных / основных реплик из Java с использованием драйвера Mongo
У меня проблема с переносом приложения на более распределенную архитектуру. В частности, я недавно начал миграцию приложения в набор репликации MongoDB, где все участники общаются, используя локальную подсеть в виртуальном облаке. Набор replicaSet прекрасно работает при распространении данных, записанных из первичного уровня во вторичные. Существует два сервера приложений Java, которые в основном выполняют операции чтения, однако им также иногда необходимо выполнять операции записи. Каждый сервер, на котором размещены серверы приложений Java, также содержит свой собственный дополнительный экземпляр mongodb, работающий локально.
В частности, у меня есть проблема, касающаяся Java с использованием драйвера MongoDB, который упакован с Jongo. я использую MongoClientOptions.Builder()
установить readPreference(ReadPreference.nearest());
который обычно должен читать с экземпляра mongodb, работающего на локальной машине, так как он будет иметь наименьшую задержку. Несмотря на это, операции чтения прекрасно работают на этих двух серверах Java, и rs.status()
Команда возвращает исправную конфигурацию.
При попытке выполнить операцию записи происходит сбой, и моя ошибка показывает:
{"timestamp":1427131553387,"status":500,"error":"Internal Server Error","exception":"com.mongodb.CommandFailureException","message":"{ \"serverUsed\" : \"localhost:27017\" , \"note\" : \"from execCommand\" , \"ok\" : 0.0 , \"errmsg\" : \"not master\"}", ...}
Предполагается, что он пытается выполнить операцию записи на локальном экземпляре mongodb (вторичный член в replicaSet). Насколько я понимаю, при подключении к любому члену реплики MongoDB, что операции записи будут автоматически отправлены участнику, помеченному как Master/Primary?
Больше деталей:
MongoDB - это версия 2.6.7
Настройки взяты из простого файла YAML
application.yml
mapserver.mongo:
database: "maps"
port: 27017
host: "localhost"
Затем в приложении создается экземпляр с вызовом:return new MongoClient(new ServerAddress(this.getHost(), this.getPort()), this.getOptions());
Возможно, я упускаю что-то в настройке, что необходимо для драйвера Java MongoDB (и / или Jongo), чтобы определить членов в replicaSet и их роль, и направить операции записи на текущий мастер в наборе? Для пояснения, существует серверная часть NodeJS, которая является отдельным экземпляром сервера от любого из этих серверов Java/Seconday-MongoDB и отделена от экземпляра первичного MongoDB, однако она может правильно записывать данные в основной / основной без проблем, поэтому она не должна проблема брандмауэра. Любые идеи или помощь приветствуется.