Što je MongoDB šišanje i najbolje prakse?

Kako skalirati MongoDB? Koje su najbolje prakse štrajkanja?


Iako je fleksibilna shema način na koji se većina ljudi upoznaje s MongoDB, ona je i jedna od najboljih baza podataka (možda čak i najbolja kada su u pitanju svakodnevni programi) za rukovanje vrlo, veoma velikim skupima podataka. Premda opravdanje ove argumentacije zahtijeva čitav članak sam po sebi (nadam se da ću jednog dana pronaći vremena za to!), Opća je ideja da rješenja koja se temelje na SQL-u ne podržavaju oštrenje i teško ih nadograđuju..

Najbolje čemu se možete nadati je stvaranje klastera (koji usput nema nikakve veze sa zaoštravanjem) ili traženje upravljanog rješenja poput Amazonovog RDS-a ili Googleovog Cloud SQL-a, koji postaju neizmjerno skuplji kako podaci povećavaju.

U ovom ćemo članku pogledati jednu od bitnih tehnika za horizontalno skaliranje baze podataka: pooštrenje, za MongoDB, i preporučiti neke najbolje prakse za iste. Međutim, smatram da je bolje započeti s osnovama izoštravanja, jer mnogi ljudi koji žele skalirati MongoDB možda nisu baš vrlo dobro upoznati s tim.

Ako ste svjesni oštrenja, slobodno prođite kroz sljedeći odjeljak.

Osnove izoštravanja

Možda ste primijetili uporabu riječi “vodoravno” u posljednjem stavku iz prethodnog odjeljka. Bez pokretanja u još jedan ogroman obilazak, želim to pitanje brzo pokazati. Skaliranje je dvije vrste: dobivate moćniji stroj s većim kapacitetom skladištenja (vertikala) ili povežete nekoliko manjih računala i formirate kolekciju (vodoravan).

Budući da čak i trenutno najbolji serveri nemaju više od 256 GB RAM-a ili 16 TB tvrdog diska, uskoro ćete pogoditi zid od opeke kada pokušavate okomito skalirati (ili “skalirati gore”, kako terminologija ide). Međutim, možete povezati što više pojedinačnih strojeva zajedno (barem teoretski) i zaobići to ograničenje lako.

Naravno, sada je izazov koordinirati među svim tim strojevima.

Oštrenje baze podataka

Izraz “izoštravanje” općenito se odnosi na baze podataka, a ideja je da jedan stroj nikada ne može biti dovoljan za čuvanje svih podataka. Prilikom oštrenja baza podataka se “razbije” na odvojene dijelove koji se nalaze na različitim strojevima. Jednostavni primjer može biti: pretpostavimo da tvrtka ima strojeve koji mogu pohraniti do 2 milijuna podataka o klijentima. Sada posao doseže tu granicu i uskoro će nadmašiti 2,5 milijuna korisnika. Dakle, odluče podijeliti svoju bazu na dva:

I čarobno, kapacitet sustava se sada udvostručuje!

Pa, kad bi samo život bio tako jednostavan! ��

Izazovi u obradi baze podataka

Čim ste malo duboko razmišljali o izoštrenju, neki gadni izazovi odmahuju im ružnu glavu.

Nema primarnih ključeva

Čim izađete iz jedne baze podataka, primarni ključevi gube svoje značenje. Primjerice, ako su vaši primarni ključevi automatski povećani, a polovicu podataka premjestite u drugu bazu podataka, sada ćete imati dvije različite podatkovne stavke za svaki primarni ključ.

Nema stranih ključeva

Budući da u bazama podataka nema podrške koja bi upućivala na subjekte izvan trenutne baze podataka (dobro, čak i drugačija baza podataka na istom stroju nije podržana, pa zaboravite na bazu podataka na drugom računalu), koncept stranih ključeva vrijedi za bacanje kao dobro. Odjednom, baza podataka postaje “glupa”, a integritet podataka je vaš problem.

Čudne pogreške podataka

Ako jedan stroj ugasi, krajnjem korisniku može se prikazati “Ups, nešto se pokvarilo!” stranice, što će bez sumnje smetati, ali život će se dogoditi nakon nekog vremena.

Sada razmotrite što se događa u podijeljenoj bazi podataka. Pretpostavimo da je podijeljena baza podataka u našem ranijem primjeru bankarska baza podataka, a jedan klijent šalje novac drugom. Pretpostavimo da podaci o prvom kupcu žive u prvom dijelu, dok podaci o drugom kupcu žive u drugom dijelu (vidite gdje idem s tim ?!). Ako stroj koji sadrži drugi dio ostane u kvaru, možete li zamisliti u kakvom će se stanju nalaziti sustav? Kamo će ići novac od transakcije? Što će prvi korisnik vidjeti? Što će drugi korisnik vidjeti? Što će obojica vidjeti kada su se krhotine ponovno povezale?

Upravljanje transakcijama

Razmotrimo i uvijek kritični slučaj upravljanja transakcijama. Ovaj put pretpostavimo da sustav radi 100% u redu. Sada dvije osobe (A i B) izvršavaju uplatu trećoj (C). Vrlo je vjerojatno da će obje transakcije istovremeno čitati stanje računa C, što uzrokuje ovu zbrku:

  • Stanje računa C = 100 USD.
  • Transakcija glasi na saldo C: 100 USD.
  • Na transakciji B piše se saldo C: 100 USD.
  • Transakcija dodaje 50 USD i ažurira stanje: 100 + 50 + 150 = 150 USD.
  • Transakcija B dodaje 50 USD i ažurira saldo: 100 $ + 50 = 150 USD.

Proklet! 50 dolara upravo je nestalo u zraku!

Tradicionalni SQL sustavi štede vas od toga pružajući ugrađeno upravljanje transakcijama, ali čim izađete iz jednog stroja, nazdravljate.

Ističe se što je s takvim sustavima lako naići na probleme korupcije podataka od kojih se nije moguće vratiti. Povlačenje kose također neće pomoći! ��

MongoDB šišanje

Za softverske arhitekte, uzbuđenje zbog MongoDB-a nije bilo toliko u njegovoj fleksibilnoj shemi, koliko u njegovoj ugrađenoj podršci. Sa samo nekoliko jednostavnih pravila i strojeva spojenih, bili ste spremni pokrenuti usitnjeni MongoDB klaster ni u kojem trenutku.

Slika ispod pokazuje kako to izgleda u tipičnoj implementaciji web aplikacija.

Kreditna slika: mongodb.com

Najbolji dio MongoDB šišanja je taj da je čak i balansiranje dijelova automatsko. To jest, ako imate pet komada, a dvije su gotovo prazne, možete reći MongoDB-u da uravnoteži stvari na način da su sve komadići jednako pune.

Kao programer ili administrator, ne morate se brinuti puno, jer MongoDB iza kulisa većinom diže teška vremena. Isto vrijedi i za djelomični neuspjeh čvorova; ako ste pravilno konfigurirali skupove replika i radili na vašem klasteru, djelomični prekidi neće utjecati na produženje rada sustava.

Cijelo bi objašnjenje postalo poprilično kratko, tako da ću zatvoriti ovaj odjeljak rekavši da MongoDB ima nekoliko ugrađenih alata za izoštravanje, replikaciju i oporavak, što programerima olakšava izradu velikih aplikacija. Ako želite opširniji vodič za MongoDB-ove mogućnosti izoštravanja, službeni dokumenti mjesto su koje treba biti.

Možda će vas i ovo zanimati cjeloviti vodič za razvojne programere.

Najbolji prakse prakse MongoDB Sharding

Dok MongoDB “samo radi” izvan okvira za oštrenje, to ne znači da možemo odmarati na lovorikama. Oštrenje može zauvijek učiniti vaš projekt ili slomiti, ovisno o tome koliko je dobro ili loše izvedeno.

Nadalje, ima mnogo sitnih detalja koje se moraju uzeti u obzir, osim toga, nije rijetkost vidjeti kako se projekti urušavaju. Namjera vas nije prestrašiti, već istaknuti potrebu za planiranjem i biti vrlo oprezni čak i kod malih odluka.

Sharding tipka neizbježno kontrolira oštrenje u MongoDB-u, pa je idealno da se s tim započne naše istraživanje.

Visoka kardinalnost

Kardinalnost znači količinu varijacije. Na primjer, zbirka omiljene zemlje od milijun ljudi imat će male varijacije (na svijetu postoji samo toliko zemalja!), Dok će zbirka njihovih adresa e-pošte imati (savršeno) visoku kardinalnost. Zašto je to važno? Pretpostavimo da odaberete naivnu shemu koja izoštrava podatke na temelju korisnikovog imena.

Ovdje imamo prilično jednostavan raspored; dolazni dokument skenira se za korisničko ime, a ovisno o tome gdje se prvo slovo nalazi na engleskom pismu, slijeće se u jedno od tri krhotina. Slično je, potraženje dokumenta jednostavno: detalji za, primjerice, “Peter” naći će se u drugom dijelu sigurno.

Sve zvuči dobro, ali poanta je u tome što mi ne kontroliramo imena korisnika dolaznih dokumenata. Što ako većinu vremena dobijemo samo imena u rasponu B do F? Ako je to slučaj, imat ćemo ono što se naziva „jumbo“ komad u shard1: većina podataka o sustavu bit će prepuna tamo, učinkovito pretvarajući postavljanje u jedinstveni sustav baze podataka.

Lijek?

Odaberite ključ s velikom kardinalnošću – na primjer, adresu e-pošte korisnika ili čak možete pronaći složeni ključ za dijeljenje, koji je kombinacija više polja.

Monotonično se mijenja

Česta greška kod MongoDB izoštravanja je korištenje monotonih povećavajućih (ili automatski povećavajućih, ako hoćete) tipki kao ključa.

Općenito se koristi primarni ključ dokumenta. Ideja je dobronamjerna, naime, kako se novi dokumenti nastave, oni će ravnomjerno pasti u jedan od dostupnih komada. Nažalost, takva konfiguracija je klasična pogreška. To je zbog toga što se, ako se ključ oštrice stalno povećava, nakon što će se bodočni podaci početi gomilati na komadićima velike vrijednosti, uzrokujući neravnotežu u sustavu.

Kreditna slika: mongodb.com

Kao što vidite na slici, nakon što smo prošli niz 20, svi dokumenti počinju se skupljati u Chunk C, što uzrokuje monolit tamo. Rješenje je potražiti shemu raspršenog ključa, koja stvara ključ za izoštravanje raspršivanjem jednog od ponuđenih polja i pomoću njega za određivanje komada.

Kreditna slika: Mongodb.com

Ključ usitnjenog sjenka izgleda ovako:

{
"_iskaznica" :"6b85117af532da651cc912cd"
}

. . . a mogu se kreirati u Mongovoj ljusci klijenta koristeći:

db.collection.createIndex ({_id: hashedValue})

Ošišan rano

Jedan od najkorisnijih savjeta izravno iz rovova je rano šišanje, čak i ako završite s malom skupom s dva komada. Jednom kada podaci pređu 500 GB ili nešto slično, izoštravanje postaje neuredan proces u MongoDB-u i trebali biste biti spremni za gadna iznenađenja. Osim toga, proces ponovne uravnoteženosti troši vrlo velike količine mrežnog pojasa, što može prigušiti sustav ako niste pažljivi.

Nisu, međutim, svi oštri. Kao zanimljiv primjer (učenje je stvarno u komentarima) pogledajte ovu lijepu Perconu blog.

Trčanje ravnoteže

Još jedna dobra ideja je nadzirati vaše prometne obrasce i pokretati instrument za uravnoteživanje dijelova samo u vrijeme s malo prometa. Kao što sam već napomenuo, samo uravnoteživanje zahtijeva znatnu širinu pojasa, što bi moglo brzo dovesti čitav sustav. Zapamtite, neuravnotežene komade nisu razlog za trenutnu paniku. Pustite samo da normalno korištenje i dalje traje, pričekajte prilike s malim prometom i pustite balans da radi ostalo!

Evo kako to možete postići (pod pretpostavkom da imate nizak promet od 3 ujutro do 5 sati ujutro):

koristi config
db.settings.update (
{ _iskaznica: "ekvilibrista" },
{$ set: {activeWindow: {početak: "03:00", stani: "05:00" }}},
{upsert: true}
)

Zaključak

Oštrenje i skaliranje bilo koje baze podataka težak je posao, ali srećom MongoDB čini upravljivijom od ostalih popularnih baza podataka.

Doista je bilo razdoblja kad MongoDB nije bio pravi izbor za bilo koji projekt (zahvaljujući nekoliko kritičnih problema i zadanih ponašanja), ali takvih je već odavno. Uz izoštravanje, ponovno uspostavljanje ravnoteže, automatsko komprimiranje, raspodjelu zaključavanja na razini agregata i mnoge takve značajke, MongoDB je napredovao danas je danas prvi izbor softverskog arhitekta.

Nadam se da je ovaj članak uspio rasvijetliti što je oštrenje u MongoDB-u i na što programer mora voditi računa kada ide u razmjere. Da biste saznali više, ovo možete dobiti online tečaj za savladavanje MongoDB.

OZNAKE:

  • Baza podataka

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map