sql >> Databasteknik >  >> NoSQL >> MongoDB

Docker och mongo-go-driver servervalsfel

Detta beror på olöst hostname från Docker-värd. I Docker, instanserna mongo1 , mongo2 och mongo3 kan nås med dessa namn. Dessa namn är dock inte tillgängliga från Docker-värden. Detta framgår av denna rad:

Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host

MongoDB-drivrutinen kommer att försöka server discovery från en given replikuppsättningsmedlem; den kommer att hitta alla andra noder inom replikuppsättningen (via rs.conf ). Problemet här är att replikuppsättningen är satt med namnet mongo<N> , skulle drivrutinen (körs i Docker-värden) inte kunna lösa dessa namn. Du kan bekräfta detta genom att försöka pinga mongo1 från Docker-värd.

Du kan antingen prova att köra programmet från en annan Docker-instans som delar samma Docker-nätverk som replikuppsättningen. Eller ändra Docker-nätverket som sådant för att tillåta lösbara värdnamn.

UPPDATERING:

Angående din kommentar om varför du använder mongo shell, eller PyMongo Arbetar.

Detta beror på skillnaden i anslutningsläge. När du anger en enskild nod, dvs. mongodb://node1:27017 i shell eller PyMongo görs inte serverupptäckt. Istället kommer den att försöka ansluta till den enda noden (inte som en del som en replikuppsättning). Haken är att du måste ansluta till replikuppsättningens primära nod för att skriva (du måste veta vilken). Om du vill ansluta som en replikuppsättning måste du definiera replikuppsättningens namn.

I motsats till mongo-go-driver , som standard skulle den utföra serverupptäckt och försöka ansluta som en replikuppsättning. Om du vill ansluta som en enda nod måste du ange connect=direct i anslutnings-URI. Se även Example Connect Direct




  1. mongodb samlade inbäddade dokumentvärden

  2. Returnerar underdokumentarray genom Meteor / Mongo

  3. Varför skapar mongoDB Node-drivrutinen oönskade anslutningar?

  4. Återanvända databasanslutningar med Azure-funktioner med hjälp av Javascript