Wat is MongoDB Sharding en de best practices?

Hoe MongoDB schalen? Wat zijn de beste shardingspraktijken?


Hoewel flexibel schema de meeste mensen vertrouwd maakt met MongoDB, is het ook een van de beste databases (misschien zelfs de beste als het gaat om alledaagse toepassingen) voor het verwerken van zeer grote datasets. Hoewel de rechtvaardiging van dit argument op zichzelf een heel artikel vereist (ik hoop dat ik er ooit tijd voor kan vinden!), Is het algemene idee dat SQL-gebaseerde oplossingen sharding niet ondersteunen en het op je sucks hard bouwen.

Het beste waarop u kunt hopen, is om een ​​cluster te maken (wat trouwens niets te maken heeft met fundamenteel sharding) of te kiezen voor een beheerde oplossing zoals Amazon’s RDS of Google’s Cloud SQL, die onbetaalbaar worden naarmate uw gegevens groeien.

In dit artikel bekijken we een van de essentiële technieken voor horizontale database-schaling: sharding, voor MongoDB, en beveel hiervoor enkele praktische tips aan. Ik denk echter dat het beter is om te beginnen met de basis van sharding, omdat veel mensen die MongoDB willen schalen er misschien niet zo bekend mee zijn.

Als u echter bewust bent van sharding, bladert u gerust door de volgende sectie.

Basisprincipes van sharding

Het is u misschien opgevallen dat het woord ‘horizontaal’ werd gebruikt in de laatste alinea van de vorige sectie. Zonder opnieuw een enorme omweg te maken, wil ik dit punt snel ter sprake brengen. Schalen wordt beschouwd als twee soorten: u krijgt ofwel een krachtigere machine met een hogere opslagcapaciteit (verticaal), of u verbindt meerdere kleinere computers en vormt een verzameling (horizontaal).

Aangezien zelfs de beste servers op dit moment niet meer dan 256 GB RAM of 16 TB harde schijf hebben, raak je al snel een bakstenen muur wanneer je probeert verticaal te schalen (of “opschalen”, zoals de terminologie luidt). U kunt echter zoveel afzonderlijke machines met elkaar verbinden (althans theoretisch) en deze beperking gemakkelijk omzeilen.

Natuurlijk is de uitdaging nu om tussen al deze machines te coördineren.

Database Sharding

De term “sharding” is over het algemeen van toepassing op databases, met het idee dat één enkele machine nooit genoeg kan zijn om alle gegevens te bewaren. Bij sharding wordt de database “opgesplitst” in afzonderlijke delen die zich op verschillende machines bevinden. Een eenvoudig voorbeeld kan zijn: stel dat een bedrijf machines heeft die tot 2 miljoen klantgegevens kunnen opslaan. Nu bereikt het bedrijf dat breekpunt en zal het binnenkort 2,5 miljoen gebruikers overtreffen. Dus besluiten ze hun database in tweeën te splitsen:

En magisch is de systeemcapaciteit nu verdubbeld!

Nou, als het leven maar zo eenvoudig was! ��

Uitdagingen bij het sharden van databases

Zodra je een beetje diep over sharding nadacht, steken enkele snode uitdagingen hun lelijke kop omhoog.

Geen primaire sleutels

Zodra u uit een enkele database stapt, verliezen primaire sleutels hun betekenis. Als uw primaire sleutels bijvoorbeeld zijn ingesteld op automatisch verhogen en u de helft van de gegevens naar een andere database verplaatst, heeft u nu twee verschillende gegevensitems voor elke primaire sleutel.

Geen externe sleutels

Aangezien er geen ondersteuning is in databases om te verwijzen naar entiteiten buiten de huidige database (nou ja, zelfs een andere database op dezelfde machine wordt niet ondersteund, dus vergeet een database op een andere machine), het concept van buitenlandse sleutels gaat voor een toss als goed. Plots wordt de database ‘dom’ en is gegevensintegriteit uw probleem.

Rare gegevensfouten

Als een enkele machine uitvalt, kan de eindgebruiker een “Oeps, er is iets kapot!” pagina, die ongetwijfeld zal irriteren, maar het leven zal na verloop van tijd op schema komen.

Bedenk nu wat er gebeurt in een shard-database. Stel dat de shard-database in ons eerdere voorbeeld een bankdatabase is en de ene klant geld naar de andere stuurt. Laten we ook aannemen dat de eerste klantgegevens in de eerste scherf leven, terwijl de gegevens van de tweede klant in de tweede scherf leven (zie je waar ik hiermee naartoe ga ?!). Als de machine met de tweede scherf niet werkt, kun je je dan voorstellen in welke staat het systeem verkeert? Waar gaat het transactiegeld naartoe? Wat ziet de eerste gebruiker? Wat ziet de tweede gebruiker? Wat zullen ze allebei zien als de scherven weer online zijn?

Transactiebeheer

Laten we ook eens kijken naar het altijd kritieke geval van transactiebeheer. Stel deze keer dat het systeem 100% goed werkt. Nu betalen twee mensen (A en B) aan een derde (C). Het is zeer waarschijnlijk dat beide transacties tegelijkertijd het rekeningsaldo van C zullen lezen, waardoor deze verwarring ontstaat:

  • C-accountsaldo = $ 100.
  • De transactie van A geeft het saldo van C aan: $ 100.
  • De transactie van B luidt het saldo van C: $ 100.
  • De transactie van A voegt $ 50 toe en werkt het saldo bij: $ 100 + 50 = $ 150.
  • De transactie van B voegt $ 50 toe en werkt het saldo bij: $ 100 + 50 = $ 150.

Verdomme! $ 50 is net in het niets verdwenen!

Traditionele SQL-systemen besparen u hiervan door ingebouwd transactiebeheer te bieden, maar zodra u uit één machine stapt, proost u.

Het punt is dat het met dergelijke systemen gemakkelijk is om problemen met gegevensbeschadiging tegen te komen waarvan het onmogelijk is om te herstellen. Je haar trekken helpt ook niet! ��

MongoDB Sharding

Voor software-architecten was de opwinding over MongoDB niet zozeer in het flexibele schema, maar in de ingebouwde ondersteuning voor sharding. Met slechts een paar simpele regels en aangesloten machines, was je in een mum van tijd klaar om een ​​shard MongoDB-cluster te draaien.

De onderstaande afbeelding laat zien hoe dit eruitziet bij een typische implementatie van een webapp.

Afbeelding tegoed: mongodb.com

Het beste van MongoDB-sharding is dat zelfs het balanceren van shards automatisch is. Dat wil zeggen, als je vijf scherven hebt en twee bijna leeg zijn, kun je MongoDB vertellen om dingen opnieuw in evenwicht te brengen op een manier dat alle scherven even vol zijn.

Als ontwikkelaar of beheerder hoeft u zich geen zorgen te maken, aangezien MongoDB achter de schermen het meeste zware werk doet. Hetzelfde geldt voor gedeeltelijk falen van knooppunten; Als u replicasets correct heeft geconfigureerd en op uw cluster draait, hebben gedeeltelijke uitval geen invloed op de systeemuptime.

De hele uitleg zou nogal beknopt zijn, dus ik sluit dit gedeelte af door te zeggen dat MongoDB verschillende ingebouwde tools heeft voor sharding, replicatie en herstel, waardoor ontwikkelaars heel gemakkelijk grootschalige applicaties kunnen bouwen. Als u een uitgebreidere gids wilt voor de sharding-mogelijkheden van MongoDB, dan is de officiële documenten zijn de place to be.

Mogelijk bent u hierin ook geïnteresseerd complete handleiding voor ontwikkelaars.

MongoDB Best practices voor sharding

Hoewel MongoDB ‘gewoon werkt’ uit de doos voor sharding, betekent dit niet dat we op onze lauweren kunnen rusten. Sharding kan uw project voor altijd maken of breken, afhankelijk van hoe goed of slecht het is gedaan.

Bovendien zijn er veel kleine details om rekening mee te houden, en als dat niet het geval is, is het niet ongebruikelijk dat projecten instorten. De bedoeling is niet om je bang te maken, maar om de noodzaak van planning te benadrukken en om uiterst voorzichtig te zijn, zelfs bij kleine beslissingen.

De Sharding Key controleert onvermijdelijk sharding in MongoDB, dus het is ideaal dat we onze enquête daarmee beginnen.

Hoge kardinaliteit

Kardinaliteit betekent de hoeveelheid variatie. Zo zal een verzameling van een favoriet land van 1 miljoen mensen weinig variaties hebben (er zijn maar zoveel landen in de wereld!), Terwijl een verzameling van hun e-mailadressen (perfect) hoge kardinaliteit zal hebben. Waarom maakt dat uit? Stel dat u een naïef schema kiest dat gegevens opslaat op basis van de voornaam van een gebruiker.

Hier hebben we een vrij eenvoudige opstelling; het binnenkomende document wordt gescand op gebruikersnaam en, afhankelijk van waar de eerste letter in het Engelse alfabet ligt, komt het terecht in een van de drie scherven. Evenzo is het zoeken naar een document eenvoudig: de details voor “Peter” zullen bijvoorbeeld zeker in de tweede scherf staan.

Het klinkt allemaal goed, maar het punt is dat we geen controle hebben over de namen van de inkomende documentgebruikers. Wat als we meestal alleen namen in het bereik B tot F krijgen? Als dat zo is, hebben we een zogenaamde ‘jumbo’-brok in scherf1: de meeste systeemgegevens worden daar overvol, waardoor de installatie in feite verandert in een enkel databasesysteem.

De oplossing?

Kies een sleutel met een hoge kardinaliteit – bijvoorbeeld het e-mailadres van de gebruikers, of u kunt zelfs kiezen voor een samengestelde shard-sleutel, een combinatie van meerdere velden.

Monotoon veranderend

Een veelgemaakte fout bij MongoDB-sharding is het gebruik van monotoon toenemende (of automatisch toenemende) toetsen als shard-sleutel.

Over het algemeen wordt de primaire sleutel van het document gebruikt. Het idee hier is goedbedoeld, namelijk, aangezien er steeds nieuwe documenten worden gecreëerd, zullen ze gelijkmatig in een van de beschikbare scherven vallen. Helaas is zo’n configuratie een klassieke fout. Dit komt omdat als de scherfsleutel altijd toeneemt, na een punt de gegevens zich gaan verzamelen aan de hoogwaardige kant van de scherven, waardoor een onbalans in het systeem ontstaat.

Afbeelding tegoed: mongodb.com

Zoals je op de afbeelding kunt zien, worden alle documenten, zodra we het bereik van 20 overschrijden, verzameld in Chunk C, waardoor er een monoliet ontstaat. De oplossing is om te gaan voor een hash-sharding-sleutelschema, dat een sharding-sleutel maakt door een van de opgegeven velden te hashen en die te gebruiken om het stuk te bepalen.

Afbeelding tegoed: Mongodb.com

Een hashed shard-sleutel ziet er als volgt uit:

{
"_ID kaart" :"6b85117af532da651cc912cd"
}

. . . en kan worden gemaakt in de Mongo-clientshell met behulp van:

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

Scherf vroeg

Een van de handigste adviezen direct vanuit de loopgraven is om vroeg te scherpen, zelfs als je een kleine cluster met twee delen krijgt. Zodra gegevens 500 GB of zo zijn overschreden, wordt sharding een rommelig proces in MongoDB en moet u klaar zijn voor vervelende verrassingen. Bovendien verbruikt het proces voor het opnieuw in evenwicht brengen zeer grote hoeveelheden netwerkbandbreedte, wat het systeem kan verstikken als je niet oppast.

Niet iedereen is echter pro-sharding. Als een interessant voorbeeld (het leren staat echt in de comments), zie deze leuke Percona blog.

De balancer uitvoeren

Een ander goed idee is om uw verkeerspatronen te controleren en de shard-balancer alleen op tijden met weinig verkeer uit te voeren. Zoals ik al zei, kost het opnieuw balanceren zelf een aanzienlijke bandbreedte, wat het hele systeem snel tot een crawl zou kunnen brengen. Onthoud dat onevenwichtige scherven geen reden zijn voor onmiddellijke paniek. Laat het normale gebruik gewoon doorgaan, wacht op mogelijkheden met weinig verkeer en laat de balancer de rest doen!

Hier ziet u hoe u dit kunt bereiken (ervan uitgaande dat u van 03.00 uur tot 05.00 uur weinig verkeer heeft):

gebruik config
db.settings.update (
{ _ID kaart: "balancer" },
{$ set: {activeWindow: {start: "03:00", hou op : "05:00" }}},
{upsert: true}
)

Conclusie

Elke database sharden en schalen is een lastige onderneming, maar gelukkig maakt MongoDB het beter beheersbaar dan andere populaire databases die er zijn.

Er was inderdaad een tijd dat MongoDB niet de juiste keuze was voor elk project (dankzij de verschillende kritieke problemen en standaardgedrag), maar die zijn allang verdwenen. Naast sharding, rebalancing, auto-compressie, gedistribueerd slot op aggregatieniveau en veel van dergelijke functies, is MongoDB mijlenver vooruit gekomen en is vandaag de eerste keuze van de software-architect.

Ik hoop dat dit artikel enig licht heeft kunnen werpen op wat sharding is in MongoDB en waar de ontwikkelaar voor moet zorgen wanneer hij voor schaal gaat. Om meer te weten te komen, kunt u dit krijgen online cursus om MongoDB onder de knie te krijgen.

TAGS:

  • Database

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