Hoe om MongoDB te skaal? Wat is die beste afskuurpraktyke??


Terwyl buigsame skema is hoe die meeste mense vertroud raak met MongoDB, is dit ook een van die beste databasisse (miskien selfs die beste as dit kom by alledaagse toepassings) vir die hantering van baie, baie groot datastelle. Terwyl die regverdiging van hierdie argument ‘n hele artikel op sigself vra (ek hoop dat ek eendag tyd daarvoor kan vind!), Is die algemene idee dat SQL-gebaseerde oplossings nie die afskerming ondersteun nie, en dit op u harde werk bou..

Die beste waarop u kan hoop, is om ‘n groepering te skep (wat niks te make het met die afsny van die vorm nie, of om na ‘n bestuurde oplossing soos Amazon se RDS of Google’s Cloud SQL te gaan, wat buitensporig duur raak namate u data groei).

In hierdie artikel sal ons kyk na een van die belangrikste tegnieke vir horisontale databasisskaal: afskerming, vir MongoDB, en beveel ‘n paar beste praktyke daarvoor aan. Ek voel egter dat dit beter is om met die grondbeginsels van afskuur te begin, want baie mense wat MongoDB wil skaal, is miskien nie baie vertroud daarmee nie.

As u egter bewus is van afskuur, moet u die volgende gedeelte deurblaai.

Afskuurbasis

U het miskien die gebruik van die woord “horisontaal” in die laaste paragraaf uit die vorige afdeling opgemerk. Sonder om weer op ‘n reuse-omweg te begin, wil ek hierdie punt vinnig ophaal. Skaalvermoë oorweeg dit om twee soorte te wees: jy kry óf ‘n kragtiger masjien met ‘n hoër bergingskapasiteit (vertikale), of u verbind kleiner rekenaars en vorm ‘n versameling (horisontale).

Gegewe dat selfs die beste bedieners op die oomblik nie meer as 256 GB RAM of 16 TB hardeskyf het nie, slaan u binnekort ‘n baksteenmuur wanneer u probeer om vertikaal te skaal (of “opskaal”, soos die terminologie gebruik). U kan egter soveel as een masjien (ten minste teoreties) aanmekaar koppel en hierdie beperking maklik omseil.

Natuurlik is die uitdaging nou om tussen al hierdie masjiene te koördineer.

Databeskerming

Die term “afskuur” is meestal van toepassing op databasisse, met die idee dat ‘n enkele masjien nooit genoeg kan wees om al die data te besit nie. By die skeer word die databasis “opgebreek” in afsonderlike stukke wat op verskillende masjiene woon. ‘N Eenvoudige voorbeeld kan wees: dink dat ‘n onderneming masjiene het wat tot 2 miljoen klante-gegewens kan stoor. Nou bereik die onderneming daardie deurbraakpunt en sal dit waarskynlik binnekort 2,5 miljoen gebruikers oortref. Dus besluit hulle om hul databasis in twee op te deel:

En magies genoeg is die stelselkapasiteit nou verdubbel!

Wel, as die lewe net so eenvoudig was! ��

Uitdagings in databasisafskerming

Sodra u ‘n bietjie diep daaraan gedink het om te skeer, trek ‘n paar afwykende uitdagings hul lelike kop.

Geen primêre sleutels nie

Sodra u uit ‘n enkele databasis stap, verloor primêre sleutels hul betekenis. As ‘n voorbeeld, as u primêre sleutels op outomatiese inkremente gestel is, en u die helfte van die data na ‘n ander databasis skuif, sal u nou twee verskillende gegewensitems hê vir elke primêre sleutel.

Geen vreemde sleutels nie

Aangesien daar geen ondersteuning in databasisse is om na entiteite buite die huidige databasis te wys nie (ja, selfs ‘n ander databasis op dieselfde masjien word nie ondersteun nie; vergeet dus nie ‘n databasis op ‘n ander masjien nie), maar die konsep van buitelandse sleutels word ook gebruik goed. Skielik word die databasis ‘dom’, en data-integriteit is u probleem.

Vreemde datafoute

As ‘n enkele masjien uitgaan, kan die eindgebruiker ‘Oeps, iets het gebreek!’ bladsy, wat ongetwyfeld irriterend sal wees, maar die lewe sal na ‘n geruime tyd op koers wees.

Oorweeg nou wat in ‘n beskadigde databasis gebeur. Gestel die beskadigde databasis in ons vorige voorbeeld is ‘n bankdatabasis en die een kliënt stuur geld na die ander. Laat ons ook veronderstel dat die eerste kliëntedata in die eerste skerf woon, terwyl die data van die tweede kliënt in die tweede skerf woon (sien jy waarheen ek op pad is ?!). As u ‘n masjien met die tweede skeraf misluk, kan u u voorstel in watter toestand die stelsel gaan wees? Waarheen gaan die transaksiegeld? Wat sal die eerste gebruiker sien? Wat sal die tweede gebruiker sien? Wat sal hulle albei sien as die skerwe weer aanlyn is?

Transaksiebestuur

Laat ons ook die kritieke geval van transaksiebestuur oorweeg. Veronderstel hierdie keer dat die stelsel 100% goed werk. Twee mense (A en B) betaal nou aan ‘n derde (C). Dit is baie waarskynlik dat albei die transaksies die rekeningbalans van C gelyktydig sal lees, wat hierdie verwarring veroorsaak:

  • C se rekeningsaldo = $ 100.
  • A se transaksie lui die saldo van C: $ 100.
  • Die transaksie van B lui die saldo van C: $ 100.
  • A se transaksie voeg $ 50 by en bywerkingsaldo: $ 100 + 50 = $ 150.
  • B se transaksie voeg $ 50 by en bywerkingsaldo: $ 100 + 50 = $ 150.

Damn! $ 50 het net in die lug verdwyn!

Tradisionele SQL-stelsels bespaar u hiervan deur ingeboude transaksiebestuur te bied, maar sodra u uit ‘n enkele masjien stap, rooster u.

Die feit is dat dit met sulke stelsels maklik is om probleme rakende datakorrupsie waaruit dit onmoontlik is om te herstel. Om jou hare te trek, sal dit ook nie help nie! ��

MongoDB Sharding

Vir sagteware-argitekte was die opgewondenheid oor MongoDB nie soveel in sy buigsame skema soos in die ingeboude beskutting nie. Met net ‘n paar eenvoudige reëls en masjiene gekoppel, was u gereed om binnekort ‘n afgekapte MongoDB-groep te bestuur.

Die onderstaande afbeelding wys hoe dit lyk by ‘n tipiese webapp-implementering.

Beeldkrediet: mongodb.com

Die beste deel van MongoDB-afskerming is dat selfs die balansering van skerwe outomaties is. As u vyf skerwe het en twee daarvan byna leeg is, kan u MongoDB sê om dinge te herbalanseer op ‘n manier dat alle skerwe ewe vol is..

As ‘n ontwikkelaar of administrateur hoef u nie veel te bekommer nie, aangesien MongoDB agter die skerms die meeste van die swaar opheffings doen. Dieselfde geld vir gedeeltelike mislukking van nodusse; as u replika-stelle korrek gekonfigureer en op u cluster uitgevoer het, sal gedeeltelike onderbrekings nie die uptyd van die stelsel beïnvloed nie.

Die volledige uiteensetting sal redelik kort wees, dus ek sal hierdie gedeelte afsluit deur te sê dat MongoDB verskeie ingeboude instrumente het vir afskorting, replikasie en herstel, wat ontwikkelaars baie maklik maak om grootskaalse toepassings te bou. As u ‘n meer omvattende gids wil hê vir die afskafvermoëns van MongoDB, kan die amptelike dokumente is die plek om te wees.

U mag ook hierin belangstel volledige ontwikkelaarsgids.

Beste praktyke vir die beskerming van MongoDB

Terwyl MongoDB net uit die boks werk om te skeer, beteken dit nie dat ons op ons louere kan rus nie. Afskerming kan u projek vir ewig maak of breek, afhangend van hoe goed of sleg dit gedoen is.

Boonop is daar baie klein besonderhede om mee rekening te hou, maar dit is nie ongewoon om projekte te laat ineenstort nie. Die bedoeling is nie om jou bang te maak nie, maar om die behoefte aan beplanning uit te lig en om uiters versigtig te wees, selfs met klein besluite.

Die Sharding-sleutel beheer onvermydelik die afskilfering in MongoDB, so dit is ideaal dat ons daarmee begin.

Hoë kardinaliteit

Kardinaliteit beteken die hoeveelheid variasie. Byvoorbeeld, ‘n versameling van ‘n gunsteling land van 1 miljoen mense sal min variasies hê (daar is net soveel lande in die wêreld!), Terwyl ‘n versameling van hul e-posadresse (perfek) ‘n hoë kardinaliteit het. Waarom maak dit saak? Gestel jy kies ‘n naïewe skema wat data verdeel op grond van die gebruiker se voornaam.

Hier het ons ‘n redelik eenvoudige reëling; die inkomende dokument word gesoek vir gebruikersnaam, en afhangend van waar die eerste letter in die Engelse alfabet lê, beland dit in een van die drie skerwe. Net so is dit maklik om na ‘n dokument te soek: die besonderhede van ‘Peter’, byvoorbeeld, sal sekerlik in die tweede skerf wees.

Dit klink alles goed, maar die punt is dat ons nie die name van die inkomende dokumentgebruikers beheer nie. Wat as ons die meeste van die tyd slegs name in die B tot F-reeks kry? As dit die geval is, sal ons ‘n ‘jumbo’-stuk in die skerf1 hê: die meeste van die stelseldata sal daar oorvol wees, wat die opstelling effektief in ‘n enkele databasisstelsel sal omskep.

Die kuur?

Kies ‘n sleutel met ‘n hoë kardinaliteit – byvoorbeeld, die e-posadres van die gebruikers, of u kan selfs ‘n saamgestelde skeersleutel soek, wat ‘n kombinasie van veelvuldige velde is.

Monotonies verander

‘N Algemene fout in die afskerming van MongoDB is om monotonies toenemende (of outomaties toenemende, as jy wil) gebruik te maak as die skeersleutel.

Oor die algemeen word die primêre sleutel van die dokument gebruik. Die idee hier is goed bedoelend, namate die aanhou skep van nuwe dokumente, sal hulle eweredig in een van die beskikbare skerwe val. Ongelukkig is so ‘n konfigurasie ‘n klassieke fout. Dit is so, want as die skeersleutel altyd toeneem, sal die data na ‘n punt in die hoëwaardekant van die skerwe ophoop, wat ‘n wanbalans in die stelsel veroorsaak.

Beeldkrediet: mongodb.com

Soos u op die foto kan sien, sal alle dokumente, sodra ons die 20-reeks verby is, versamel in Chunk C, wat ‘n monoliet daar veroorsaak. Die oplossing is om te gaan na hash-afskerm-sleutelskema, wat ‘n skeersleutel skep deur een van die velde wat voorsien word te haas en dit te gebruik om die stuk te bepaal.

Beeldkrediet: Mongodb.com

‘N Snywiel-sleutel lyk so:

{
"_id" :"6b85117af532da651cc912cd"
}

. . . en kan in die Mongo-kliëntedop geskep word deur die volgende te gebruik:

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

Shard Vroeg

Een van die nuttigste raad wat direk vanaf die loopgrawe is, is om vroeg te kap, selfs al eindig u met ‘n klein groepie met twee dele. Sodra die data 500 GB of iets oorskry het, word afskilfering ‘n morsige proses in MongoDB, en u moet gereed wees vir nare verrassings. Boonop verbruik die herbalanseringsproses baie groot hoeveelhede netwerkbandwydte, wat die stelsel kan verstik as u nie versigtig is nie.

Nie almal is egter besig om te beskerm nie. As ‘n interessante voorbeeld (die leer is regtig in die kommentaar), sien hierdie lekker Percona blog.

Begin die balanseerder

Nog ‘n goeie idee is om u verkeerspatrone te monitor en die skerwebalanseerder slegs op lae verkeer te laat loop. Soos ek reeds genoem het, neem herbalansering self aansienlike bandwydte in, wat die hele stelsel vinnig tot ‘n kruip kan bring. Onthou dat ongebalanseerde skerwe nie dadelik paniek veroorsaak nie. Laat net die normale gebruik voortduur, wag vir geleenthede met ‘n lae verkeer en laat die balanseerder die res doen!

Dit is hoe u dit kan regkry (as u van 3 uur tot 5 uur ‘n lae verkeer het):

gebruik config
db.settings.update (
{_id: "balancer" },
{$ stel: {activeWindow: {begin: "03:00", stop: "05:00" }}},
{upsert: true}
)

Afsluiting

Die beskutting en skaal van enige databasis is ‘n moeilike onderneming, maar gelukkig maak MongoDB dit meer hanteerbaar as ander gewilde databasisse daar buite.

Daar was inderdaad ‘n tyd toe MongoDB nie die regte keuse vir enige projek was nie (danksy die verskillende kritieke probleme en standaardgedrag), maar dit is lankal weg. Tesame met afskilfering, herbalansering, outokompressie, gesamentlike vlak verspreide slot en vele sulke funksies, is MongoDB kilometers ver vooruit, is die eerste sagteware-argitek die eerste keuse.

Ek hoop dat hierdie artikel ‘n bietjie lig kan werp op wat in MongoDB afskuur is, en waarvoor die ontwikkelaar moet sorg as hy vir skaal gaan. Om meer te wete te kom, kan u dit kry aanlynkursus om MongoDB te bemeester.

Tags:

  • databasis

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me