MongoDB + Azure + Android: com.mongodb.WriteConcernException err: «не мастер» код: «10058»

Фон:

Привет! Я запускаю реплику MongoDB, установленную в Azure, и подключился к ней удаленно из приложения Android. Я'Мы получили чтение, чтобы отлично работать со всех экземпляров (Обновлено: потому что им разрешено чтение на первичном и вторичном узлах). Но записи в базу данных по-прежнему имеют периодические ошибки со следующей ошибкой, поскольку записи должны выполняться только на первичном узле.

Кроме того, если бы вы могли предоставить более конкретные ресурсы для решения этой проблемы, это также было бы очень полезно. Я'Мы уже просмотрели большинство документов и довольно долго искали эту ошибку.

Вопрос:

Как предотвратить эту ошибку и разрешить запись 100% времени?

E/AndroidRuntime(): com.mongodb.WriteConcernException: {
        "serverUsed" : "/:27017" , "err" : "not master" , 
        "code" : 10058 , "n" : 0 , "lastOp" : { "$ts" : 0 , "$inc" : 0} , 
        "connectionId" : 1918 , "ok" : 1.0}

Трассировки стека:

E/AndroidRuntime(13731): FATAL EXCEPTION: Thread-7629
E/AndroidRuntime(13731): Process: com.myapplication.examplemongodb, PID: 13731
E/AndroidRuntime(13731): com.mongodb.WriteConcernException: { "serverUsed" : "/:27017" , "err" : "not master" , "code" : 10058 , "n" : 0 , "lastOp" : { "$ts" : 0 , "$inc" : 0} , "connectionId" : 1918 , "ok" : 1.0}
E/AndroidRuntime(13731):    at com.mongodb.CommandResult.getException(CommandResult.java:77)
E/AndroidRuntime(13731):    at com.mongodb.CommandResult.throwOnError(CommandResult.java:110)
E/AndroidRuntime(13731):    at com.mongodb.DBTCPConnector._checkWriteError(DBTCPConnector.java:102)
E/AndroidRuntime(13731):    at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:142)
E/AndroidRuntime(13731):    at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:115)
E/AndroidRuntime(13731):    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:248)
E/AndroidRuntime(13731):    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:204)
E/AndroidRuntime(13731):    at com.mongodb.DBCollection.insert(DBCollection.java:76)
E/AndroidRuntime(13731):    at com.mongodb.DBCollection.insert(DBCollection.java:60)
E/AndroidRuntime(13731):    at com.mongodb.DBCollection.insert(DBCollection.java:105)
E/AndroidRuntime(13731):    at com.myapplication.examplemongodb.ActivityMain$1.run(ActivityMain.java:83)
E/AndroidRuntime(13731):    at java.lang.Thread.run(Thread.java:841)

Заметки:

я используюmongo-java-driver v2.11.3.Я использовалмонго-лазурная библиотека чтобы помочь создать набор реплик MongoDB с двумя рабочими ролями.(Если у вас есть еще ресурсы для этого, тогда яЯ хотел бы прочитать это. Я'Вы уже прочитали readme о GitHub,этот,этоти несколько других вещей, не связанных с MongoDB / Azure. Но эти ресурсы не обновляются и не детализируются.)

Возможные решения:

Я думаю, что это как-то связано с набором реплик.Я не уверен, что это происходит, потому что у меня есть набор реплик только двух экземпляров (один основной и один дополнительный), и они борются (читай: голосование) за то, кто хочет быть основным. Возможно, требуется арбитр? Но я не знаю, как это сделать в настоящее время.

Обновить:

Благодаря помощи @David Makogon, яЯ уверен, что проблема заключается в том, как я настроил соединение с Azure и как я получаю доступ к рабочим ролям. Так вот's мои обновленные заметки о том, как настроена система:Две рабочие роли (MongoDB.WindowsAzure.MongoDBRole), к которым я подключаюсь напрямую черезTCP Input Endpoint порт 27017 из приложения для Android. Как сказал @David, в настоящее время я не могу контролировать, к какому экземпляру подключен.Одна веб-роль (MongoDB.WindowsAzure.Manager), которую я неничего не делать, имеет одинHTTP Input Endpoint на порту 80. Это было сделано по умолчанию с помощью библиотеки mongo-azure, о которой я упоминал выше. Я'Я не уверен, что я должен что-то делать с этим.

Ответы на вопрос(1)

Ваш ответ на вопрос