Database-sharding versus partitionering

Ik heb onlangs gelezen over schaalbare architecturen. In die context zijn twee woorden die blijven verschijnen met betrekking tot databases shardingen partitionering. Ik heb beschrijvingen opgezocht, maar raakte toch in de war.

Kunnen de experts van stackoverflow me helpen om de basis goed te krijgen?

  • Wat is het verschil tussen shardingen partitionering?
  • Is het waar dat ‘alle gesharde databases in wezen zijn gepartitioneerd (over verschillende knooppunten), maar alle gepartitioneerde databases zijn niet noodzakelijk geshard’?

Antwoord 1, autoriteit 100%

Partitionering is meer een algemene term voor het verdelen van gegevens over tabellen of databases. Sharding is een specifiek type partitionering, onderdeel van wat horizontale partitionering wordt genoemd.

Hier repliceert u het schema over (meestal) meerdere instanties of servers, waarbij u een soort logica of ID gebruikt om te weten welke instantie of server de gegevens moet zoeken. Een dergelijke identifier wordt vaak een “Shard Key” genoemd.

Een veelgebruikte, sleutelloze logica is om het alfabet te gebruiken om de gegevens te verdelen. A-D is instantie 1, E-G is instantie 2, enz. Klantgegevens zijn hier zeer geschikt voor, maar zullen enigszins verkeerd worden weergegeven in de verschillende instanties als de partitie er geen rekening mee houdt dat sommige letters vaker voorkomen dan andere.

Een andere veelgebruikte techniek is het gebruik van een sleutelsynchronisatiesysteem of logica die zorgt voor unieke sleutels voor alle instanties.

Een bekend voorbeeld dat je kunt bestuderen, is hoe Instagram hun partities in de begindagen oploste (zie onderstaande link). Ze begonnen gepartitioneerd op heel weinig servers en gebruikten Postgres om de gegevens vanaf het begin te verdelen. Ik geloof dat het enkele duizenden logische scherven waren op die paar fysieke scherven. Lees hier hun geweldige artikel uit 2012: Instagram Engineering – Sharding & ID’s

Zie ook hier: http://www.quora .com/Wat-het-verschil-tussen-sharding-en-partitie


Antwoord 2, autoriteit 30%

Ik ben hier ook in gedoken en hoewel ik verreweg de referentie op dit gebied ben, zijn er enkele belangrijke feiten die ik heb verzameld en punten die ik zou willen delen:

Een partitieis een verdeling van een logische database of de samenstellende elementen ervan in afzonderlijke onafhankelijke delen. Database partitioneringwordt normaal gesproken gedaan om redenen van beheer, prestaties of beschikbaarheid, zoals voor taakverdeling.

https://en.wikipedia.org/wiki/Partition_(database)

Shardingis een type partitionering, zoals Horizontal Partitioning(HP)

Er is ook Vertical Partitioning(VP) waarbij je een tabel opsplitst in kleinere afzonderlijke delen. Normalisatie omvat ook het splitsen van kolommen over tabellen, maar verticale partitionering gaat verder en verdeelt kolommen zelfs als ze al zijn genormaliseerd.

https://en.wikipedia.org/wiki/Shard_(database_architecture)

Ik vind het antwoord van Tony Baco op Quora erg leuk, waar hij je aan het denken zet in termen van schema’s (in plaats van kolommen en rijen). Hij stelt dat…

Horizontale partitionering“, of sharding, is het repliceren [kopiëren] van het schema en vervolgens verdelen van de gegevens op basis van een shardsleutel.

Verticale partitionering” omvat het opdelen van het schema (en de gegevens gaan mee voor de rit).

https://www. quora.com/Whats-the-difference- between-sharding-DB-tables-and-partitioning-them

Oracle’s Database Partitioning Guide heeft een aantal aardige cijfers. Ik heb een paar fragmenten uit het artikel gekopieerd.

https://docs.oracle.com/cd/ B28359_01/server.111/b32024/partition.htm

Wanneer een tabel partitioneren

Hier zijn enkele suggesties voor het partitioneren van een tabel:

  • Tafels groter dan 2 GB moeten altijd als kandidaten worden beschouwd
    voor partitionering.
  • Tabellen met historische gegevens, waarin nieuwe gegevens worden toegevoegd aan de nieuwste partitie. Een typisch voorbeeld is een historische tabel waarin alleen de gegevens van de huidige maand kunnen worden bijgewerkt en de andere 11 maanden alleen-lezen zijn.
  • Als de inhoud van een tabel moet worden verdeeld over verschillende soorten opslagapparaten.

Scheiding snoeien

Het opschonen van partities is de eenvoudigste en ook de meest substantiële manier om de prestaties te verbeteren met behulp van partitionering. Het opschonen van partities kan de queryprestaties vaak met meerdere ordes van grootte verbeteren. Stel bijvoorbeeld dat een toepassing een tabel Bestellingen bevat met een historisch record van bestellingen, en dat deze tabel is opgedeeld per week. Een query die bestellingen voor een enkele week aanvraagt, zou slechts toegang krijgen tot een enkele partitie van de tabel Bestellingen. Als de tabel Orders 2 jaar aan historische gegevens had, zou deze query toegang krijgen tot één partitie in plaats van 104 partities. Deze query zou mogelijk 100 keer sneller kunnen worden uitgevoerd, simpelweg vanwege het opschonen van partities.

Partitioneringsstrategieën

  • Bereik
  • Hash
  • Lijst

Je kunt hun tekst lezen en hun afbeeldingen visualiseren die alles vrij goed uitleggen.

En tot slot is het belangrijk om te begrijpen dat databases extreem veel resources kosten:

  • CPU
  • Schijf
  • I/O
  • Geheugen

Veel DBA’s zullen partities maken op dezelfde machine, waar de partities alle bronnen delen, maar een verbetering in schijf en I/O bieden door de gegevens en/of index op te splitsen.

Terwijl andere strategieën een “gedeelde niets”-architectuur gebruiken, waarbij de shards zich op afzonderlijke en verschillende computereenheden (knooppunten) bevinden, met 100% van de CPU, schijf, I/O en geheugen voor zichzelf. Biedt zijn eigen reeks voordelen en complexiteiten.

https://en.wikipedia.org/wiki/Shared_nothing_architecture


Antwoord 3, autoriteit 26%

Het lijkt erop dat dit beide vragen beantwoordt:

Horizontale partitionering splitst een of meer tabellen op rij, meestal
binnen een enkele instantie van een schema en een databaseserver. Het kan
een voordeel bieden door de indexgrootte (en dus de zoekinspanning) te verkleinen
op voorwaarde dat er een voor de hand liggende, robuuste, impliciete manier is om te identificeren:
in welke tabel een bepaalde rij zal worden gevonden, zonder eerst te hoeven
om de index te doorzoeken, bijvoorbeeld het klassieke voorbeeld van de ‘CustomersEast’
en ‘CustomersWest’ tabellen, waar hun postcode al aangeeft
waar ze te vinden zijn.

Sharding gaat verder dan dit: het verdeelt de problematische tabel(len) in
op dezelfde manier, maar het doet dit over mogelijk meerdere instanties
van het schema. Het voor de hand liggende voordeel zou zijn dat de zoekbelasting voor de
grote gepartitioneerde tabel kan nu over meerdere servers worden verdeeld
(logisch of fysiek), niet alleen meerdere indexen op dezelfde logische
server.

Bron:Wiki-Shard.

Sharding is het proces van het opslaan van gegevensrecords over meerdere
machines en is de benadering van MongoDB om aan de eisen van gegevens te voldoen
groei. Naarmate de gegevens groter worden, kan een enkele machine dat niet zijn
voldoende om de gegevens op te slaan en evenmin een acceptabel lees- en schrijfniveau te bieden
doorvoer. Sharding lost het probleem op met horizontaal schalen. Met
sharding voegt u meer machines toe om de gegevensgroei en de eisen te ondersteunen
van lees- en schrijfbewerkingen.

Bron: MongoDB.


Antwoord 4, autoriteit 8%

Beschouw een tabel in de database met 1 miljoen rijen en 100 kolommen
In Partitionerenkun je de tabel in 2 of meer tabellen verdelen met eigenschappen zoals:

  1. 0,4 miljoen rijen(tabel1), 0,6 miljoen rijen(tabel2)

  2. 1 miljoen rijen & 60 kolommen (tabel1) en 1 miljoen rijen & 40 kolommen(tabel2)

    Er kunnen meerdere van dergelijke gevallen zijn

Dit is algemene partitionering

Maar Shardingverwijst alleen naar het eerste geval waar we de gegevens verdelen op basis van rijen. Als we de tabel in meerdere tabellen verdelen, moeten we meerdere vergelijkbare kopieën van schema’s behouden, aangezien we nu meerdere tabellen hebben.


Antwoord 5, autoriteit 6%

Als je het over partitioneren hebt, gebruik dan alsjeblieft geen term repliceren of replicatie. Replicatie is een ander concept en valt buiten het bestek van deze pagina.
Als we het hebben over partitionering, is het beter om te verdelen en als we het hebben over sharding, is het beter om het woord te verdelen.
In partitie (normaal en volgens algemeen begrip niet altijd) zijn de rijen van grote dataset-tabellen verdeeld in twee of meer onsamenhangende (geen enkele rij delende) groepen. Je kunt elke groep een partitie noemen. Deze groepen of alle partities blijven onder de controle van een eenmaal RDMB-instantie en dit is allemaal logisch. De basis van elke groep kan een hash of bereik of etc. zijn. Als u tien jaargegevens in een tabel hebt, kunt u elk van de jaargegevens in een aparte partitie opslaan en dit kan worden bereikt door partitiegrenzen in te stellen op basis van een niet-null kolom CREATE_DATE. Als je eenmaal de db hebt opgevraagd, als je een aanmaakdatum opgeeft tussen 01-01-1999 en 31-12-2000, zullen er slechts twee partities worden geraakt en deze zullen opeenvolgend zijn. Ik deed hetzelfde op DB voor miljard + records en de sql-tijd kwam uit op 50 millis van 30 seconden met behulp van indices enz.
Sharding is dat u elke partitie host op een ander knooppunt/machine. Zoeken in de partities/shards kan nu parallel plaatsvinden.


Antwoord 6, autoriteit 2%

Shardingin een speciaal geval van horizontale partitionering, wanneer partities zich uitstrekken over meerdere database-instanties. Als een database is geshard, betekent dit dat deze per definitie is gepartitioneerd.


Antwoord 7

Horizontale partitiewanneer verplaatst naar een andere database-instantie* wordt een database-shard.

Database-instantiekan zich op dezelfde computer of op een andere computer bevinden.

Other episodes