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

Připojení MongoDB k Ruby pomocí certifikátů s vlastním podpisem pro SSL

Vzhledem k popularitě našeho příspěvku o propojení MongoDB SSL s certifikáty s vlastním podpisem v Node.js jsme se rozhodli napsat návod na propojení MongoDB s Ruby. V tomto blogu vám ukážeme, jak se připojit k serveru MongoDB nakonfigurovanému s certifikáty s vlastním podpisem pro SSL pomocí ovladače Ruby MongoDB a oblíbeného mongoidu Object-Document-Mapper (ODM).

ScaleGrid aktuálně používá pro SSL certifikáty s vlastním podpisem při vytváření uzlů pro nový cluster. Kromě toho vám také poskytujeme možnost zakoupit si vlastní certifikáty SSL a nakonfigurovat je na serveru MongoDB a můžete se o této nabídce dozvědět více na adrese [email protected].

Připojení k sadě replik pomocí ovladače Ruby MongoDB

Pro tento příklad použijeme nejnovější stabilní ovladač Ruby MongoDB verze 2.8. Verze ovladače 2.5.x mají známou chybu, která jim brání v práci s nasazením ScaleGrid. Verze Ruby použitá v obou níže uvedených příkladech je 2.6.3.

Možnosti připojení dostupné pro ovladač jsou zdokumentovány zde a možnosti, které budeme potřebovat, jsou:

  • :ssl
  • :ssl_verify
  • :ssl_ca_cert .

Nejprve najděte a zkopírujte svůj řetězec připojení MongoDB ze stránky s podrobnostmi o clusteru na konzole ScaleGrid:

Soubor certifikátu CA je také k dispozici ke stažení na stránce s podrobnostmi o clusteru. Stáhněte a uložte soubor certifikátu na umístění, které je pro aplikaci dostupné:
Zde je úryvek ukazující, jak se připojit k sadě replik MongoDB od Ruby:

vyžadovat 'mongo'Mongo::Logger.logger.level =::Logger::DEBUGMONGODB_CA_CERT ="/cesta/k/ca_cert.pem"MONGODB_CONN_URL ="mongodb://testuser:@SG-example- 17026.servers.mongodirector.com:27017,SG-example-17027.servers.mongodirector.com:27017,SG-example-17028.servers.mongodirector.com:27017/test?replicaSet=RS-example-0&ssl options ={ ssl:true, ssl_verify:true, :ssl_ca_cert => MONGODB_CA_CERT }client =Mongo::Client.new(MONGODB_CONN_URL, options)db =client.databasecollections =db.collection_namesputs "db #{s #db.name} má kolekci {collections}"client.close

Aby byl příklad jednoduchý, zadali jsme připojovací řetězec a cestu k souboru cert přímo ve fragmentu kódu – obecně byste je vložili do souboru yaml nebo je uvedli jako proměnné prostředí. V příkladu je také nastavena úroveň protokolu na DEBUG takže případné problémy s připojením lze odladit. Jakmile budou vyřešeny problémy s připojením, měla by být změněna na méně podrobnou úroveň.

Jak připojit MongoDB k aplikaci Ruby pomocí SSLClick To Tweet

Připojení pomocí Mongoid

Mongoidní verze, kterou použijeme v našem příkladu, je nejnovější stabilní verze – 7.0.2. K poskytnutí konfigurace mongoidu použijeme soubor yaml a podrobnosti o takovém konfiguračním souboru jsou zdokumentovány zde. Možnosti konfigurace specifické pro SSL, které budeme potřebovat pro připojení k naší sadě replik, jsou:

  • ssl
  • ssl_verify
  • ssl_ca_cert

Náš soubor yml:

vývoj:# Nakonfigurujte dostupné databázové klienty. (povinné) klienti:# Definujte výchozího klienta. (vyžadováno) výchozí:# Pro klienta může být definováno uri:# uri:'mongodb://user:[email protected]:27017/my_db' # Podrobnosti naleznete v dokumentaci ovladače. Alternativně můžete definovat následující:# # Definovat název výchozí databáze, ke které se Mongoid může připojit. # (Požadované). databáze:test # Poskytněte hostitele, ke kterým se může výchozí klient připojit. Musí být pole # párů hostitel:port. (povinné) hostitelé:- SG-example-17026.servers.mongodirector.com:27017 - SG-example-17027.servers.mongodirector.com:27017 - SG-example-17028.servers.mongodirector.com:4710  možnosti:# Jméno uživatele pro ověření. uživatel:'testuser' # Heslo uživatele pro ověření. heslo:'pwd' # Databázové role uživatele. role:- 'readWrite' # Změňte výchozí mechanismus ověřování. Platné možnosti jsou::scram, # :mongodb_cr, :mongodb_x509 a :plain. (výchozí na 3.0 je :scram, výchozí # na 2.4 a 2.6 je :plain) auth_mech::scram # Databáze nebo zdroj, proti kterému se má uživatel ověřit. (výchozí:admin) auth_source:test # Vynuťte ovladač, aby se připojil specifickým způsobem namísto automatického # zjišťování. Může být jeden z::direct, :replica_set, :sharded. Při připojování ke skrytým členům sady replik nastavte na :direct #. connect::replica_set ... ... # Název sady replik, ke které se má připojit. Servery poskytnuté jako semena, která # nepatří do této sady replik, budou ignorovány. množina_replik:RS-example-0 # Zda se připojit k serverům přes ssl. (výchozí:false) ssl:true # Zda provést ověření rovnocenné certifikace či nikoli. (výchozí:true) ssl_verify:true # Soubor obsahující sadu zřetězených certifikací certifikačních autorit # sloužící k ověření certifikátů předávaných z druhého konce připojení. ssl_ca_cert:/cesta/k/ca_cert.pem # Nakonfigurujte specifické možnosti Mongoidu. (volitelné) možnosti:# Nastavte úrovně protokolu ovladače Mongoid a Ruby. (výchozí::info) log_level::debug

Příklad připojení:

gem 'mongoid', '7.0.2'vyžaduje 'mongoid'Mongoid.load!("/cesta/k/mongoid.yml", :development)# Nepoužívám žádnou z funkcí ODM – stačí načíst základní mongo klienta a pokuste se připojitclient =Mongoid::Clients.defaultdb =client.databasecollections =db.collection_namesputs "db #{db.name} má kolekce #{collections}"Mongoid::Clients.disconnect

V produkčních aplikacích Ruby on Rails bude cesta k souboru yaml získána z proměnných prostředí.

Testování chování při selhání při selhání

Stejně jako ostatní ovladače MongoDB je i ovladač Ruby MongoDB navržen tak, aby interně rozpoznával změny v topologii způsobené událostmi, jako je převzetí služeb při selhání. Je však dobré otestovat a ověřit chování ovladače při selhání, abyste se vyhnuli překvapením ve výrobě.

Stejně jako můj předchozí příspěvek na MongoDB PyMongo můžeme napsat program pro testování trvalého psaní, abychom mohli sledovat chování ovladače při přepnutí při selhání.

Nejjednodušší způsob, jak vyvolat převzetí služeb při selhání, je spustit příkaz rs.stepDown():

RS-example-0:PRIMARY> rs.stepDown()2019-04-18T19:44:42.257+0530 E QUERY [thread1] Chyba:chyba při zadávání dotazu:selhalo:chyba sítě při pokusu o spuštění příkazu 'replSetStepDown' na hostiteli 'SG-example-1.servers.mongodirector.com:27017' :DB.prototype.runCommand@src/mongo/shell/db.js:168:1DB.prototype.adminCommand@src/mongo/shell/db. js:185:1rs.stepDown@src/mongo/shell/utils.js:1305:12@(shell):1:12019-04-18T19:44:42.261+0530 I SÍŤ [thread1] se pokouším znovu připojit k příkladu SG -1.servers.mongodirector.com:27017 (X.X.X.X) se nezdařilo 2019-04-18T19:44:43.267+0530 I SÍŤ [vlákno1] znovu připojte SG-example-1.servers.mongodirector.com:27017 (X.RS-X.X. 0:SECONDARY>

Zde jsou relevantní části našeho testovacího kódu:

vyžadovat 'mongo'...logger =Logger.new(STDOUT)logger.level =Logger::INFOMONGODB_CA_CERT ="/cesta/k/ca_cert.pem"MONGODB_CONN_URL ="mongodb://testuser:@ SG-example-17026.servers.mongodirector.com:27017,SG-example-17027.servers.mongodirector.com:27017,SG-example-17028.servers.mongodirector.com:27017/test?replicaSet-RS-example 0&ssl=true"options ={ ssl:true, ssl_verify:true, :ssl_ca_cert => MONGODB_CA_CERT }begin logger.info("Pokus o připojení...") client =Mongo::Client.new(MONGODB_CONN_URL, možnosti) i =0 loop do db =client.database collection =db[:test] begin doc ={"idx":i, "date":DateTime.now, "text":SecureRandom.base64(3) } result =collection.insert_one( doc) logger.info("Záznam vložen - id:#{result.inserted_id}") i +=1 spánek(3) záchrana Mongo::Error => e logger.error("Chyba Mong:#{e.message }") logger.error(e.backtrace) logger.i nfo("Retrying...") end end logger.info("Hotovo") záchrana => err logger.error("Byla zjištěna výjimka:#{err.message}") logger.error(err.backtrace)zajistit klienta. zavřít, pokud client.nil?end

Toto průběžně zapisuje položky jako tyto do testovací kolekce v testovací databázi:

RS-test-0:PRIMARY> db.test.find(){ "_id" :ObjectId("5cf50ff1896cd172a4f7c6ee"), "idx" :0, "date" :ISODate("2019-06-03T12:17" :53.008Z"), "text" :"HTvd" }{ "_id" :ObjectId("5cf50ff6896cd172a4f7c6ef"), "idx" :1, "datum" :ISODate("2019-06-03T12:197:58". ), "text" :"/e5Z" }{ "_id" :ObjectId("5cf50ff9896cd172a4f7c6f0"), "idx" :2, "date" :ISODate("2019-06-03T12:18:01.940Z"), " text" :"quuw" }{ "_id" :ObjectId("5cf50ffd896cd172a4f7c6f1"), "idx" :3, "date" :ISODate("2019-06-03T12:18:05.194Z"), "text" gTyY" }{ "_id" :ObjectId("5cf51000896cd172a4f7c6f2"), "idx" :4, "date" :ISODate("2019-06-03T12:18:08.442Z"), "text" :}{ "VDXX" "_id" :ObjectId("5cf51003896cd172a4f7c6f3"), "idx" :5, "datum" :ISODate("2019-06-03T12:18:11.691Z"), "text" :"UY87" }... před> 

Podívejme se na chování během převzetí služeb při selhání:

I, [2019-06-03T17:53:25.079829 #9464] INFO -- :Pokus o připojení...I, [2019-06-03T17:53:30.577099 #9464] INFO -- :Záznam vložen - id:5cf5113f896cd124f8f31062I, [2019-06-03T17:53:33.816528 #9464] INFO -- :Vložený záznam - id:5cf51145896cd124f31926 Záznam 04:07:03926 Záznam 06555039261706553.816528 #9464 5cf51148896cd124f8f31064I, [2019-06-03T17:53:40.281537 #9464] INFO -- :Record inserted - id:5cf5114c896cd124f8f31065I, [2019-06-03T17:53:43.520010 #9464] INFO -- :Record inserted - id:5cf5114f896cd124f8f31066I, [2019-06-03T17:53:46.747080 #9464] INFO -- :Záznam vložen - id:5cf51152896cd124f8f31067I, [2019-06-03T17:53:49.994645557 Záznam vložený #01 -INFO < 

Je evidentní, že pokud jsou zachyceny správné chyby a opakováno čtení/zápis, ovladač automaticky detekuje změnu topologie a znovu se připojí k novému masteru. Pro zápisy možnost :retry_writes zajistěte, aby se ovladač jednou sám pokusil znovu, než aplikaci upozorní na chybu.

Existuje také několik časových limitů ovladače, které lze vyladit na základě přesného chování a latence, které vidíte ve svém nastavení. Ty jsou zdokumentovány zde.

Odstraňování problémů

Pokud máte potíže s připojením k nasazení MongoDB s povoleným SSL, zde je několik tipů pro ladění:

  • Nejprve ověřte, že se skutečně můžete připojit k serveru MongoDB ze serveru, na kterém běží vaše aplikace. Nejjednodušší způsob, jak toho dosáhnout, je nainstalovat mongo shell na klientský počítač. V systému Linux byste nemuseli instalovat celý server MongoDB – můžete se rozhodnout nainstalovat shell samostatně. Jakmile bude shell k dispozici, zkuste se pokusit připojit k serveru pomocí „syntaxe příkazového řádku“, kterou poskytujeme.
  • Pokud se nemůžete připojit přes mongo shell, znamená to, že klientský počítač nemůže dosáhnout portu 27017 serverů MongoDB. Podívejte se na nastavení firewallu Security Group, VPC a ScaleGrid, abyste se ujistili, že mezi klientskými a serverovými počítači existuje konektivita.
  • Pokud je připojení k síti správné, další věcí, kterou je třeba zkontrolovat, je, že používáte verze Ruby, mongoid a mongo gem, které jsou kompatibilní s verzí vašeho serveru MongoDB.
  • Pokud jste potvrdili, že verze ovladače jsou správné, zkuste na IRB spustit ukázkový skript Ruby, podobný příkladu, který jsme uvedli výše. Spuštění krok za krokem může ukázat, kde je problém.
  • Pokud testovací skript běží správně, ale stále se nemůžete připojit k mongoidu, zkuste spustit jednoduchý testovací skript, jako je příklad, který jsme uvedli výše .
  • Pokud máte stále potíže s připojením ke své instanci, napište nám na adresu [email protected] s podrobnými výsledky výše uvedených kroků pro odstraňování problémů a s přesné verze ovladače Ruby, mongoid a mongo, které používáte. Gemfile.lock vám poskytne přesné verze.

Pokud jste ve ScaleGrid noví a chcete si tento výukový program vyzkoušet, zaregistrujte se k bezplatné 30denní zkušební verzi, abyste mohli platformu prozkoumat a vyzkoušet připojení MongoDB k vaší aplikaci Ruby.


  1. Selhalo spuštění redis.service:Jednotka redis-server.service je maskovaná

  2. Redis Pub/Sub se spolehlivostí

  3. Jak nastavit časový limit čtení na klientovi node redis?

  4. MongoDB - odlišné od dotazu nepoužívá indexy