MongoDB + Azure + Android: com.mongodb.WriteConcernException err: „nie master” kod: „10058”
tło:
Cześć, używam repliki MongoDB ustawionej na platformie Azure i zdalnie łączyłem się z nią z poziomu aplikacji na Androida. Otrzymałem odczyty, które działają świetnie ze wszystkich instancji (zaktualizowane: ponieważ mogą czytać na węzłach podstawowym i pomocniczym). Jednak zapisy do bazy danych wciąż mają sporadyczne błędy z następującym błędem, ponieważ zapisy muszą być wykonywane tylko w węźle podstawowym.
Ponadto, jeśli mógłbyś podać jakieś bardziej konkretne zasoby do radzenia sobie z tym problemem, to również byłoby bardzo pomocne. Przeszedłem już przez większość dokumentów i przeszukałem trochę tego błędu.
Pytanie:
Jak zapobiec temu błędowi i zezwolić na zapis w 100% przypadków?
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}
Ślad stosu:
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)
Uwagi:
ja używammongo-java-driver v2.11.3.Użyłembiblioteka mongo-azure aby pomóc w utworzeniu repliki MongoDB z dwiema rolami roboczymi.(Jeśli masz więcej zasobów, to chciałbym to przeczytać. Już przeczytałem readme GitHub,to, toi kilka innych rzeczy niezwiązanych z MongoDB / Azure. Ale te zasoby nie są aktualizowane ani szczegółowe.)Możliwe rozwiązania:
Myślę, że ma coś wspólnego z posiadaniem zestawu replik.Nie jestem pewien, czy to się dzieje, ponieważ mam tylko zestaw dwóch replik (jeden podstawowy i jeden zapasowy) i walczą (czytaj: głosowanie) o to, kto chce być podstawowym. Może potrzebny jest arbiter? Ale obecnie nie wiem, jak to zrobić.Aktualizacja:
Dzięki pomocy @David Makogon jestem pewien, że problem leży w tym, jak skonfigurowałem połączenie z Azure i jak uzyskuję dostęp do ról roboczych. Oto moje zaktualizowane uwagi dotyczące konfiguracji systemu:Dwie role robotnicze (MongoDB.WindowsAzure.MongoDBRole), z którymi łączę się bezpośrednio z viaTCP Input Endpoint
port 27017 z aplikacji na Androida. Jak powiedział @David, obecnie nie mam kontroli nad tym, do której instancji jest podłączony.Jedna rola internetowa (MongoDB.WindowsAzure.Manager), z którą nic nie robię, ma jednąHTTP Input Endpoint
na porcie 80. Zostało to wykonane domyślnie z biblioteką mongo-azure, o której wspomniałem powyżej. Nie jestem pewien, czy powinienem coś z tym zrobić.