Quando un database diventa troppo grande o riceve troppo traffico per essere gestito da un singolo server, ci sono due modi per scalarlo:
- Scalabilità Verticale (Scale Up): Comprare un server più potente (più CPU, più RAM). È semplice, ma ha un limite fisico e un costo che cresce esponenzialmente.
- Scalabilità Orizzontale (Scale Out): Distribuire il carico su più server più piccoli. È più complesso, ma offre una scalabilità quasi illimitata.
Lo sharding è la tecnica più comune per la scalabilità orizzontale dei database.
Cos'è lo Sharding?
Lo sharding (o partizionamento orizzontale) consiste nel dividere un grande database in tanti database più piccoli, chiamati "shard", e distribuirli su server diversi. Ogni shard contiene un sottoinsieme delle righe, ma ha lo stesso schema (le stesse tabelle).
Come si Decide Dove Vanno i Dati? La Shard Key.
La decisione su quale shard debba contenere una determinata riga è basata su una "shard key". La shard key è una colonna (o un insieme di colonne) della tabella. Ad esempio, in una tabella `users`, la shard key potrebbe essere `user_id`.
Quando si inserisce un nuovo utente, un'applicazione (o un router di query) calcola un hash dell'`user_id` e usa questo valore per decidere su quale dei tanti server shard deve essere salvato il record. Quando si deve leggere l'utente, si riesegue lo stesso calcolo per sapere immediatamente su quale server andare a cercare.
Vantaggi dello Sharding
- Scalabilità dello Storage: La dimensione totale del database può superare di gran lunga la capacità di un singolo server.
- Scalabilità delle Scritture e delle Letture: Il carico di lavoro è distribuito su più macchine, aumentando il throughput complessivo.
Le Complessità dello Sharding
Lo sharding è una tecnica di architettura avanzata che introduce una notevole complessità:
- Complessità delle Query: Le query che non usano la shard key devono essere inviate a tutti gli shard, e i risultati devono essere aggregati. Anche i `JOIN` tra dati che si trovano su shard diversi diventano molto complessi.
- Resharding: Aggiungere un nuovo shard al cluster richiede un'operazione complessa di ribilanciamento dei dati.
- Transazioni: Le transazioni che coinvolgono dati su più shard sono difficili da gestire.
Database NoSQL come Cassandra o MongoDB sono progettati da zero per lo sharding automatico. Per i database relazionali, lo sharding è un'operazione più manuale, anche se piattaforme come Vitess (per MySQL) possono semplificarla.
Hai bisogno di una soluzione su misura?
Dalla Web App al gestionale custom, trasformiamo le tue idee in software performante. Contattaci per una consulenza gratuita.
Richiedi una consulenza