MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Docker- und Mongo-Go-Driver-Serverauswahlfehler

Dies liegt an einem nicht aufgelösten hostname vom Docker-Host. In Docker sind die Instanzen mongo1 , mongo2 und mongo3 sind unter diesen Namen erreichbar. Diese Namen sind jedoch vom Docker-Host aus nicht erreichbar. Dies wird durch diese Zeile deutlich:

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

Der MongoDB-Treiber versucht die server discovery von einem oder mehreren Replikat-Set-Mitgliedern; Es findet alle anderen Knoten innerhalb des Replikatsatzes (über rs.conf ). Das Problem hier ist, dass der Replikatsatz mit dem Namen mongo<N> festgelegt ist , wäre der Treiber (der im Docker-Host ausgeführt wird) nicht in der Lage, diese Namen aufzulösen. Sie können dies bestätigen, indem Sie versuchen, mongo1 zu pingen vom Docker-Host.

Sie können entweder versuchen, die Anwendung von einer anderen Docker-Instanz aus auszuführen, die dasselbe Docker-Netzwerk wie der Replikatsatz nutzt. Oder ändern Sie das Docker-Netzwerk als solches, um auflösbare Hostnamen zuzulassen.

AKTUALISIEREN:

In Bezug auf Ihren Kommentar, warum Sie Mongo verwenden Shell oder PyMongo funktioniert.

Dies ist auf den Unterschied im Verbindungsmodus zurückzuführen. Bei Angabe eines einzelnen Knotens, d. h. mongodb://node1:27017 in Shell oder PyMongo wird keine Servererkennung durchgeführt. Stattdessen wird versucht, eine Verbindung zu diesem einzelnen Knoten herzustellen (nicht als Teil eines Replikatsatzes). Der Haken ist, dass Sie zum Schreiben eine Verbindung zum primären Knoten des Replikatsatzes herstellen müssen (Sie müssen wissen, welcher). Wenn Sie sich als Replica-Set verbinden möchten, müssen Sie den Replica-Set-Namen definieren.

Im Gegensatz zum mongo-go-driver , würde es standardmäßig eine Servererkennung durchführen und versuchen, eine Verbindung als Replikatgruppe herzustellen. Wenn Sie sich als einzelner Knoten verbinden möchten, müssen Sie connect=direct angeben in der Verbindungs-URI. Siehe auch Beispiel Connect Direct