Om instanserna alla sitter bakom en enda lastbalanserad Input
slutpunkt (t.ex. 27017), och varje gång din klientdator ansluter till slutpunkten kommer den att anslutas till potentiellt olika noder i replikuppsättningsklustret (och du skulle inte ha någon kontroll över vilken instans du gick till). Detta kan förklara varför du ibland försöker skriva till icke-mastern och får ett fel, men ändå fungerar alla dina läsningar (eftersom du förmodligen har ställt in MongoDB-klustret för att tillåta läsningar på sekundära noder).
Arbetarroller stöder också InstanceInput
slutpunkter, som låter dig ställa in ett externt vänt portintervall (t.ex. 27017-27019), mappa till en enda port på själva arbetarinstanserna (t.ex. 27017). Om du gör detta kan din klientapp nu ansluta till alla tre instanserna direkt (27017, 27018, 27019). Många drivrutiner stöder replikuppsättningsanslutningar, så den skulle kunna ta reda på vilken nod som är mastern och dirigera alla skrivningar till den. Jag vet inte om drivrutinen du använder på Android stöder replikuppsättningar. Om drivrutinen inte stöder replikauppsättningar, kommer du förmodligen att överväga att lägga upp en API-nivå som sedan gör all kommunikation till databasen (en bra praxis att följa i allmänhet, i alla fall, och du kan titta på Azures mobiltjänster för ett snabbt sätt att implementera detta).
Så... om ditt replikuppsättningsklusters slutpunkt är konfigurerad som Input
, detta förklarar sannolikt problemet du ser, som borde kunna lösas genom att byta slutpunktstyp till InstanceInput
.