MongoDB + Azure + Android: com.mongodb.WriteConcernException err: código "não mestre": "10058"

fundo:

Oi, Estou executando uma réplica do MongoDB definida no Azure e conectei-a remotamente a partir de um aplicativo Android. Eu consegui leituras para trabalhar muito bem de todas as instâncias (atualizado: porque eles têm permissão para ler em nós primários e secundários). Mas, as gravações no banco de dados ainda apresentam erros intermitentes com o seguinte erro, porque as gravações devem ser feitas somente no nó primário.

Além disso, se você pudesse fornecer mais recursos específicos para lidar com esse problema, isso também seria muito útil. Já passei pela maioria dos documentos e procurei bastante por esse erro.

Questão:

Como evitar esse erro e permitir gravações 100% do tempo?

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

Rastreamento de pilha:

E/AndroidRuntime(13731): FATAL EXCEPTION: Thread-7629
E/AndroidRuntime(13731): Process: com.myapplication.examplemongodb, PID: 13731
E/AndroidRuntime(13731): com.mongodb.WriteConcernException: { "serverUsed" : "/<my-remote-ip>: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)

Notas:

estou usandomongo-java-driver v2.11.3.Eu usei obiblioteca mongo-azul para ajudar a criar a réplica do MongoDB configurada com duas funções de trabalho.(Se você tem mais recursos para isso, então eu adoraria lê-lo. Eu já li o readme do GitHub,isto, istoe algumas outras coisas não relacionadas ao MongoDB / Azure. Mas esses recursos não são atualizados nem detalhados.

Soluções possíveis:

Tem algo a ver com ter um conjunto de réplicas, eu acho.Eu não tenho certeza se isso está acontecendo porque eu tenho apenas um conjunto de réplicas de duas instâncias (uma primária e uma secundária) e elas estão lutando (leia-se: votação) sobre quem quer ser primário. Talvez um árbitro seja necessário? Mas eu não sei como fazer isso atualmente.

Atualizar:

Graças à ajuda do @David Makogon, tenho certeza de que o problema está em como eu configurei a conexão com o Azure e como eu acesso as funções de trabalho. Então, aqui estão minhas notas atualizadas sobre como o sistema está configurado:Duas funções de trabalho (MongoDB.WindowsAzure.MongoDBRole), às quais me conecto diretamente viaTCP Input Endpoint porta 27017 a partir do aplicativo Android. Como @David disse, atualmente não tenho controle sobre qual instância está conectada.Uma função web (MongoDB.WindowsAzure.Manager), com a qual eu não faço nada, tem umHTTP Input Endpoint na porta 80. Isso foi feito apenas por padrão com a biblioteca mongo-azul que eu mencionei acima. Não tenho certeza se há algo que eu deveria estar fazendo com isso.

questionAnswers(1)

yourAnswerToTheQuestion