Sobes.tech
Middle+

Cos'è lo sharding orizzontale?

sobes.tech AI

Risposta dell'AI

Lo sharding orizzontale è una tecnica di scalabilità del database che consiste nel dividere i dati in parti, chiamate shard, e distribuire questi shard su più server indipendenti. Ogni shard contiene un sottoinsieme di tutte le righe della tabella, mantenendo tutte le colonne.

Vantaggi dello sharding orizzontale:

  • Scalabilità: Permette di gestire un volume crescente di dati e traffico aggiungendo nuovi server per l'archiviazione degli shard.
  • Prestazioni: Riduce la quantità di dati con cui ogni server lavora, accelerando l'esecuzione delle query.
  • Disponibilità: Se uno shard diventa inaccessibile, gli altri shard continuano a funzionare.
  • Riduzione del carico: Distribuisce il carico di input/output tra più server.

Svantaggi dello sharding orizzontale:

  • Complessità: L'implementazione e la gestione dello sharding richiedono sforzi ingegneristici significativi.
  • Transazioni distribuite: Le transazioni che coinvolgono più shard sono complesse da implementare e possono ridurre le prestazioni.
  • Ribilanciamento: La ridistribuzione dei dati tra gli shard in caso di variazioni di carico o aggiunta di nuovi server può essere un processo complesso e dispendioso.
  • Query tra gli shard: Le query che richiedono di unire dati da diversi shard (JOIN) possono essere inefficienti.

Metodi di sharding:

  • Sharding per intervallo: I dati vengono distribuiti in base a un intervallo di valori nella chiave di sharding.
  • Sharding per hash: I dati vengono distribuiti in base al valore hash della chiave di sharding.
  • Sharding directory: Una tabella di mappatura indica su quale shard si trovano determinati dati o intervalli di dati.

Esempio di concetto di sharding (semplificato):

Si ha una tabella utenti con un grande volume di dati. Invece di memorizzare tutti gli utenti su un singolo server, si può dividerli in shard in base alla prima lettera del cognome:

  • Shard 1: Utenti con cognomi da A a E
  • Shard 2: Utenti con cognomi da J a L
  • Shard 3: Utenti con cognomi da M a S
  • Shard 4: Utenti con cognomi da T a Y

Ogni shard viene memorizzato su un server separato.

<?php

// Funzione di esempio che determina lo shard in base al cognome
function determineShardByLastName(string $lastName): int
{
    $firstLetter = mb_strtoupper(mb_substr($lastName, 0, 1));

    if ($firstLetter >= 'А' && $firstLetter <= 'Е') {
        return 1;
    } elseif ($firstLetter >= 'Ж' && $firstLetter <= 'Л') {
        return 2;
    } elseif ($firstLetter >= 'М' && $firstLetter <= 'С') {
        return 3;
    } elseif ($firstLetter >= 'Т' && $firstLetter <= 'Я') {
        return 4;
    }

    return 0; // Restituisce 0 per casi indefiniti
}

// Utilizzo
$lastName = "Иванов";
$shardId = determineShardByLastName($lastName);
// In un sistema reale, si dovrebbe connettersi al database dello shard corrispondente

?>