Una guida alla comprensione del partizionamento orizzontale del database

Pubblicato: 2022-11-05

La creazione di un sito Web è il primo passo per impostare la tua presenza su Internet. Per prosperare a lungo termine, devi anche assicurarti che il tuo sito possa scalare per adattarsi alla crescita. E uno dei primi passi è implementare un database in grado di scalare con te. In caso contrario, si rischia di riscontrare un rallentamento delle prestazioni delle query e interruzioni del database.

Questo post discuterà come utilizzare il partizionamento orizzontale del database per ottenere un'elevata scalabilità e disponibilità per i tuoi dati. Toccheremo anche gli svantaggi dello sharding e le diverse architetture di sharding che puoi utilizzare.

Che cos'è il partizionamento orizzontale del database?

Il partizionamento orizzontale è una tecnica di ottimizzazione che distribuisce le tabelle su altri server di database. È come il partizionamento, nel senso che entrambi implicano la suddivisione dei dati in sottoinsiemi più piccoli. La differenza è che il partizionamento orizzontale distribuisce questi sottoinsiemi a server diversi mentre il partizionamento li archivia in un database. Questi server utilizzano lo stesso motore di database e lo stesso tipo di hardware per ottenere un livello di prestazioni simile per tutti gli shard.

Lo sharding mira a realizzare un'architettura non condivisa, eliminando i colli di bottiglia dell'elaborazione e i singoli punti di errore.

Un'illustrazione per spiegare il partizionamento orizzontale del database.
Un esempio di frammentazione. (Fonte immagine: Analytics Vidhya)

Puoi implementare il partizionamento orizzontale in due modi: orizzontalmente e verticalmente. Il partizionamento orizzontale orizzontale divide la tabella in base alle righe, mentre il partizionamento orizzontale verticale divide le tabelle in base alle colonne.

A questo proposito, lo sharding è come il partizionamento, che divide le tabelle di grandi dimensioni in quelle più piccole.

Il partizionamento orizzontale è efficace per i database in cui la maggior parte delle query restituisce un sottoinsieme di righe, ad esempio un database del cliente che restituisce dati (come nome, indirizzo, e-mail e così via) contemporaneamente.

Il partizionamento orizzontale verticale è efficace per i database le cui query restituiscono colonne singole. Ad esempio, se il database del cliente ha restituito il nome o l'e-mail del cliente separatamente, è possibile separare il nome e l'e-mail in cluster diversi.

Vantaggi del partizionamento orizzontale del database

Di seguito sono riportati alcuni dei vantaggi del partizionamento orizzontale del database.

Ridimensionamento orizzontale migliorato

Puoi ridimensionare il tuo database verticalmente o orizzontalmente. Il ridimensionamento verticale si riferisce all'aggiunta di più unità di elaborazione centrale (CPU) e memoria ad accesso casuale (RAM) al server per migliorare le prestazioni. Il ridimensionamento verticale è una soluzione utile per database di piccole e medie dimensioni. Tuttavia, man mano che i tuoi dati crescono, il ridimensionamento verticale diventa impossibile. C'è solo così tanta potenza che puoi aggiungere a un singolo server.

Il ridimensionamento orizzontale è più flessibile. Ti consente di ridimensionare il tuo database secondo necessità aggiungendo più server al tuo sistema. Ciascuno di questi server fornisce risorse a frammenti di database diversi. Ciò distribuisce il carico di lavoro e migliora la capacità del sistema di gestire più richieste.

Tempi di risposta alle query più rapidi

Gli shard hanno solo poche righe e colonne. Per questo motivo, l'elaborazione delle query del database richiede meno tempo. Al contrario, una query di un database non partizionato potrebbe richiedere una ricerca in centinaia, o addirittura migliaia, di righe.

Maggiore affidabilità in situazioni di interruzione

Le interruzioni del database si verificano per vari motivi, tra cui l'eliminazione accidentale dei dati, gli errori di connessione e gli attacchi alla sicurezza informatica. La partizionamento orizzontale riduce al minimo gli effetti delle interruzioni. Poiché ogni shard è autonomo, solo lo shard interessato deve affrontare tempi di inattività. Ad esempio, se si dispone di quattro shard e si verifica un'interruzione in uno di essi, solo il 25% delle operazioni sarà interessato.

Svantaggi dello Sharding

Sebbene il partizionamento orizzontale migliori l'affidabilità e la disponibilità di un database, implementarlo è complesso. L'utilizzo di un'architettura di partizionamento orizzontale errata può rallentare le prestazioni e portare alla perdita di dati.

Assicurati di scegliere una tecnica di sharding che consenta una distribuzione equilibrata dei dati su tutti gli shard. Senza questo equilibrio, rischi di creare hotspot del database, che si verificano quando uno shard archivia la maggior parte dei dati mentre gli altri rimangono praticamente vuoti. Ciò riduce il throughput di scrittura al singolo shard.

Per risolvere questo problema, è possibile partizionare ulteriormente lo shard sbilanciato, ma questo processo è impegnativo e potrebbe causare il blocco del database durante la migrazione dei dati.

Un altro svantaggio del partizionamento orizzontale è che i join SQL che coinvolgono più tabelle in frammenti diversi possono diventare troppo lenti e ridurre le prestazioni. Tuttavia, con la giusta architettura, puoi evitare questo problema.

Architetture di partizionamento orizzontale

È possibile implementare lo sharding utilizzando tre architetture:

  • Sharding basato su chiave
  • Sharding basato sull'intervallo
  • Partizionamento orizzontale basato su directory

L'architettura che scegli dipende dal tuo caso d'uso.

Sharding basato su chiave

In un'architettura di partizionamento orizzontale basata su chiave o hash, un'applicazione di database utilizza una chiave di partizione per individuare una partizione. Una funzione di hashing esegue l'hashing del valore della chiave di partizionamento orizzontale e l'output associa i dati a un particolare shard. Una semplice funzione di hashing può essere il modulo della chiave e il numero di shard.

La funzione hash può richiedere più di una chiave di partizionamento orizzontale. Per questo motivo, il partizionamento orizzontale basato su chiavi è adatto per i record di dati che potrebbero avere chiavi condivise. La distribuzione algoritmica dei dati riduce al minimo la possibilità di creare hotspot del database in cui uno shard contiene più dati dell'altro.

Tuttavia, poiché la distribuzione si basa solo sulla funzione di hashing, è impossibile raggruppare logicamente i dati. Pertanto, le operazioni di database che richiedono dati da più shard potrebbero essere inefficienti poiché richiedono la lettura dei dati da ogni shard.

Sharding basato sull'intervallo

Il partizionamento orizzontale basato sull'intervallo implica il partizionamento orizzontale di un database in base a un intervallo di valori specificato.

Utilizza una chiave di partizionamento orizzontale per determinare a quale shard assegnare un valore. L'applicazione di database controlla lo shard che corrisponde alla chiave di partizionamento orizzontale in una tabella di ricerca e archivia i dati. Per questo motivo, il partizionamento orizzontale basato sull'intervallo è facile da progettare e implementare.

Ad esempio, è possibile utilizzare il valore dell'ID utente in un database utente come chiave di partizionamento orizzontale. È possibile archiviare utenti con ID da 0 a 2.000 su uno shard, quelli compresi tra 2.000 e 4.000 su un altro e così via.

Il partizionamento orizzontale basato sull'intervallo può causare hotspot del database. Considera un database utente in cui la maggior parte dei tuoi ID utente si trova tra 2.001 e 4.000. Il processo li assegna a un singolo shard, creando uno squilibrio nel tempo. Il partizionamento orizzontale basato sull'intervallo, quindi, funziona meglio per dati distribuiti uniformemente.

Sharding basato su directory

Il partizionamento orizzontale basato su directory raggruppa i dati logicamente correlati nello stesso shard. Utilizza una tabella di ricerca contenente un elenco di mappature per ciascuna entità nel database. Ogni mappatura corrisponde a uno shard di database.

Il partizionamento orizzontale basato su directory è più flessibile del partizionamento orizzontale basato su intervalli o basato su chiavi perché è possibile aggiungere dati agli shard in modo dinamico. Non c'è alcuna funzione di partizionamento orizzontale da seguire o valori di intervallo in cui rimanere all'interno. Questa flessibilità aumenta l'efficienza del database: puoi archiviare i dati correlati in uno shard, il che significa che l'esecuzione di query comuni richiede meno tempo.

Ad esempio, se hai utilizzato il partizionamento orizzontale basato su directory e hai raggruppato gli utenti in base alla loro posizione, recuperando gli utenti da un determinato luogo, esegui una query solo su un singolo shard.

Sharding del database con Kinsta

La maggior parte dei motori di database moderni fornisce supporto per il partizionamento orizzontale del database. Uno di questi motori di database è MariaDB, un fork di MySQL supportato in commercio. È un sistema di database open source ad alte prestazioni adottato da aziende come IBM, GitHub e Wikimedia. Fa anche parte dello stack di server ad alte prestazioni di Kinsta.

MariaDB offre funzionalità di sharding integrate tramite il motore di archiviazione spider. Il motore di archiviazione spider è un motore di formazione di cluster che supporta il partizionamento e le transazioni XA (Extended Architecture). Ti consente di trattare le tabelle remote di istanze diverse come se si trovassero nella stessa istanza. Dopo aver creato una tabella nel motore di archiviazione spider, la tabella si collega a un'altra tabella nel server MariaDB remoto. Una volta stabilita la connessione, il motore di archiviazione condivide il collegamento con tutte le tabelle che fanno parte della stessa transazione.

Riepilogo

Il partizionamento orizzontale del database è una tecnica di ridimensionamento che partiziona le tabelle in sottoinsiemi più piccoli e le distribuisce a server diversi chiamati shard. È possibile implementare il partizionamento orizzontale in vari modi, ad esempio il partizionamento orizzontale basato su chiavi, il partizionamento orizzontale basato sull'intervallo e il partizionamento orizzontale basato su directory.

Sebbene il partizionamento orizzontale migliori la scalabilità, l'affidabilità e la disponibilità di un database, è molto complesso da implementare. Inoltre, una volta creato uno shard, non è facile ripristinare lo stato non ripartito del database. Per questo motivo, usa il partizionamento orizzontale per l'ottimizzazione solo quando sei sicuro che altre opzioni di scalabilità non funzioneranno.

Che la tua attività sia un'organizzazione no profit o un'impresa a livello aziendale, le soluzioni esperte di Kinsta possono eliminare le preoccupazioni relative all'hosting del sito, consentendoti di concentrarti su ciò che conta di più.