Database sharding vs partizionamento


166

Di recente ho letto di architetture scalabili. In quel contesto, due parole che continuano ad apparire in relazione ai database sono la condivisione e il partizionamento . Ho cercato le descrizioni, ma sono rimasto confuso.

Gli esperti di StackOverflow potrebbero aiutarmi a ottenere le basi giuste?

  • Qual è la differenza tra sharding e partizionamento ?
  • È vero che "tutti i database partizionati sono essenzialmente partizionati (su nodi diversi), ma tutti i database partizionati non sono necessariamente partizionati" ?

Risposte:


130

Il partizionamento è più un termine generico per dividere i dati tra tabelle o database. Il coccio è un tipo specifico di partizionamento, parte di quello che viene chiamato partizionamento orizzontale.

Qui puoi replicare lo schema su (tipicamente) più istanze o server, usando un qualche tipo di logica o identificatore per sapere quale istanza o server cercare i dati. Un identificatore di questo tipo viene spesso chiamato "chiave di coccio".

Una logica comune e senza chiavi è quella di utilizzare l'alfabeto per dividere i dati. AD è l'istanza 1, EG è l'istanza 2 ecc. I dati dei clienti sono adatti a questo scopo, ma saranno in qualche modo travisati in termini di dimensioni tra le istanze se il partizionamento non tiene conto del fatto che alcune lettere sono più comuni di altre.

Un'altra tecnica comune è quella di utilizzare un sistema di sincronizzazione delle chiavi o una logica che garantisca chiavi univoche tra le istanze.

Un esempio ben noto che puoi studiare è il modo in cui Instagram ha risolto il loro partizionamento nei primi giorni (vedi link sotto). Hanno iniziato partizionati su pochissimi server, usando Postgres per dividere i dati fin dall'inizio. Credo che siano state diverse migliaia di frammenti logici su quei pochi frammenti fisici. Leggi il loro fantastico commento dal 2012 qui: Instagram Engineering - Sharding e ID

Vedi anche qui: http://www.quora.com/Whats-the-difference-between-sharding-and-partition


16
La scheggiatura è un tipo di HP . Non è HP.
NoChance,

1
Ho ragione nel pensare che il partizionamento orizzontale significhi solo dividere le righe di una tabella in più sotto-tabelle (possibilmente all'interno dello stesso schema o istanza di database). Mentre lo sharding è di partizionare orizzontalmente, mettere le sotto-tabelle in schemi separati all'interno di un singolo database o in istanze di database separate su macchine separate. O no?
Jonathan Hartley,

48

Sembra che questo risponda ad entrambe le tue domande:

Il partizionamento orizzontale divide una o più tabelle per riga, generalmente all'interno di una singola istanza di uno schema e di un server di database. Può offrire un vantaggio riducendo le dimensioni dell'indice (e quindi lo sforzo di ricerca) a condizione che esista un modo ovvio, solido e implicito per identificare in quale tabella verrà trovata una determinata riga, senza prima dover cercare nell'indice, ad esempio il classico esempio delle tabelle "ClientiEst" e "ClientiOvest", dove il loro codice postale indica già dove saranno trovati.

La frammentazione va oltre questo: suddivide le tabelle problematiche allo stesso modo, ma lo fa attraverso potenzialmente più istanze dello schema. L'ovvio vantaggio sarebbe che il carico di ricerca per la grande tabella partizionata può ora essere suddiviso su più server (logici o fisici), non solo su più indici sullo stesso server logico.

Fonte: Wiki-Shard .

La frammentazione è il processo di archiviazione dei record di dati su più macchine ed è l'approccio di MongoDB per soddisfare le esigenze di crescita dei dati. All'aumentare della dimensione dei dati, un singolo computer potrebbe non essere sufficiente per archiviare i dati né fornire un throughput di lettura e scrittura accettabile. Il coccio risolve il problema con il ridimensionamento orizzontale. Con lo sharding, aggiungi più macchine per supportare la crescita dei dati e le esigenze delle operazioni di lettura e scrittura.

Fonte: MongoDB .


41

Mi sono tuffato anche in questo e sebbene sia di gran lunga il riferimento sulla questione, ci sono alcuni fatti chiave che ho raccolto e punti che vorrei condividere:

Una partizione è una divisione di un database logico o dei suoi elementi costitutivi in ​​parti indipendenti distinte. Il partizionamento del database viene normalmente eseguito per motivi di gestibilità, prestazioni o disponibilità, come per il bilanciamento del carico.

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

Il coccio è un tipo di partizionamento, come il partizionamento orizzontale (HP)

C'è anche il partizionamento verticale (VP) in base al quale dividi una tabella in parti distinte più piccole. La normalizzazione comporta anche questa suddivisione delle colonne tra le tabelle, ma il partizionamento verticale va oltre e divide le colonne anche se già normalizzate.

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

Mi piace molto la risposta di Tony Baco su Quora in cui ti fa pensare in termini di schema (piuttosto che di colonne e righe). Lui afferma che ...

Il " partizionamento orizzontale ", o sharding, sta replicando [copiando] lo schema e quindi dividendo i dati in base a una chiave di shard.

Il " partizionamento verticale " implica la divisione dello schema (e i dati vanno avanti per la corsa).

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

La Guida al partizionamento del database Oracle ha alcune belle figure. Ho copiato alcuni estratti dall'articolo.

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

Quando partizionare una tabella

Ecco alcuni suggerimenti su quando partizionare una tabella:

  • Le tabelle superiori a 2 GB devono sempre essere considerate come candidate per il partizionamento.
  • Tabelle contenenti dati storici, in cui vengono aggiunti nuovi dati nella partizione più recente. Un tipico esempio è una tabella storica in cui solo i dati del mese corrente sono aggiornabili e gli altri 11 mesi sono di sola lettura.
  • Quando il contenuto di una tabella deve essere distribuito su diversi tipi di dispositivi di archiviazione.

Potatura da partizione

La potatura delle partizioni è il mezzo più semplice e anche sostanziale per migliorare le prestazioni usando il partizionamento. La potatura delle partizioni può spesso migliorare le prestazioni della query di diversi ordini di grandezza. Ad esempio, supponiamo che un'applicazione contenga una tabella Ordini contenente un record storico di ordini e che questa tabella sia stata partizionata per settimana. Una query che richiede ordini per una sola settimana accederà a una singola partizione della tabella Ordini. Se la tabella degli ordini avesse 2 anni di dati storici, questa query avrebbe accesso a una partizione anziché a 104 partizioni. Questa query potrebbe potenzialmente essere eseguita 100 volte più velocemente semplicemente a causa della potatura della partizione.

Strategie di partizionamento

  • Gamma
  • hash
  • Elenco

Puoi leggere il loro testo e visualizzare le loro immagini che spiegano tutto abbastanza bene.

E, infine, è importante capire che i database sono estremamente dispendiosi in termini di risorse:

  • processore
  • Disco
  • I / O
  • Memoria

Molti DBA partiranno sulla stessa macchina, dove le partizioni condivideranno tutte le risorse ma forniranno un miglioramento del disco e dell'I / O suddividendo i dati e / o l'indice.

Mentre altre strategie impiegheranno un'architettura di "nulla condiviso" in cui i frammenti risiederanno su unità di elaborazione (nodi) distinte e distinte, con il 100% di CPU, disco, I / O e memoria su se stesso. Fornire il proprio set di vantaggi e complessità.

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


"" Il partizionamento orizzontale ", o sharding, sta replicando [copiando] lo schema e quindi dividendo i dati in base a una chiave di shard." - questo è tautologico.
8bitjunkie,

Quindi c'è uno specchio, ed è frammentato, da qui l'etimologia.
mckenzm,

5

Considera una tabella nel database con 1 milione di righe e 100 colonne Nel partizionamento puoi dividere la tabella in 2 o più tabelle con proprietà come:

  1. 0,4 milioni di righe (tabella1), 0,6 milioni di righe (tabella2)

  2. 1 milione di righe e 60 colonne (tabella 1) e 1 milione di righe e 40 colonne (tabella2)

    Potrebbero esserci più casi del genere

Questo è il partizionamento generale

Ma la frammentazione si riferisce al primo caso solo in cui stiamo dividendo i dati sulla base di righe. Se stiamo dividendo la tabella in più tabelle, dobbiamo conservare più copie simili di schemi poiché ora abbiamo più tabelle.


1

Frammentazione in un caso speciale di partizionamento orizzontale , quando le partizioni si estendono su più istanze di database. Se un database è suddiviso, significa che è partizionato per definizione.


1

Quando si parla di partizionamento, non utilizzare il termine replicazione o replica. La replica è un concetto diverso e non rientra nell'ambito di questa pagina. Quando parliamo di partizionamento, allora la parola migliore viene divisa e quando parliamo di sharding, allora viene distribuita la parola migliore. Nella partizione (normalmente e nella comprensione comune non sempre) le righe della tabella del set di dati di grandi dimensioni sono divise in due o più gruppi disgiunti (non condividendo alcuna riga). Puoi chiamare ogni gruppo una partizione. Questi gruppi o tutte le partizioni rimangono sotto il controllo di un'istanza RDMB una volta e questo è tutto logico. La base di ciascun gruppo può essere un hash o un intervallo o ecc. Se in una tabella sono presenti dati di dieci anni, è possibile archiviare ciascuno dei dati dell'anno in una partizione separata e ciò può essere ottenuto impostando i limiti della partizione sulla base di un colonna non nulla CREATE_DATE. Dopo aver interrogato il db, se si specifica una data di creazione tra 01-01-1999 e 31-12-2000, verranno colpite solo due partizioni e sarà sequenziale. Ho fatto simili su DB per miliardi di record e il tempo sql è arrivato a 50 millis da 30 secondi usando gli indici ecc. Tutti. Lo sharding è l'hosting di ogni partizione su un nodo / computer diverso. Ora la ricerca all'interno delle partizioni / frammenti può avvenire in parallelo.


0

La partizione orizzontale quando spostata in un'altra istanza di database * diventa un frammento di database .

L'istanza del database può trovarsi sullo stesso computer o su un altro computer.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.