sql >> Databáze >  >> NoSQL >> MongoDB

Chyba výběru serveru docker a mongo-go-driver

Důvodem je nevyřešený hostname z hostitele Docker. V Dockeru jsou instance mongo1 , mongo2 a mongo3 jsou pod těmito jmény dosažitelné. Tato jména však nejsou dostupná z hostitele Docker. To je zřejmé z tohoto řádku:

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

Ovladač MongoDB se pokusí server discovery z daného členu(ů) sady replik; najde všechny ostatní uzly v sadě replik (přes rs.conf ). Problém je v tom, že sada replik je nastavena na název mongo<N> , ovladač (spuštěný v hostiteli Docker) nebude schopen tyto názvy přeložit. Můžete to potvrdit pokusem o ping mongo1 z hostitele Docker.

Můžete buď zkusit spustit aplikaci z jiné instance Docker sdílející stejnou síť Docker jako sada replik. Nebo upravte síť Docker jako takovou, aby umožňovala rozlišitelné názvy hostitelů.

AKTUALIZACE:

Pokud jde o váš komentář, proč používat mongo shell nebo PyMongo funguje.

To je způsobeno rozdílem v režimu připojení. Při zadávání jednoho uzlu, tj. mongodb://node1:27017 v shellu nebo PyMongu se zjišťování serveru neprovádí. Místo toho se pokusí připojit k tomuto jedinému uzlu (nikoli jako součást sady replik). Háček je v tom, že se pro zápis musíte připojit k primárnímu uzlu sady replik (musíte vědět, který). Pokud se chcete připojit jako sada replik, musíte definovat název sady replik.

Na rozdíl od mongo-go-driver , ve výchozím nastavení provede zjišťování serveru a pokusí se připojit jako sadu replik. Pokud se chcete připojit jako jeden uzel, musíte zadat connect=direct v URI spojení. Viz také Přímý příklad připojení




  1. Jak se Mongolab REST API ověřuje

  2. MongoRepository findByCreatedAtBetween nevrací přesné výsledky

  3. Šifrování databáze MongoDB

  4. Jak porovnat řetězec obsahující speciální znak, jako je pomlčka a mezery