Sobes.tech
Middle+

Ce este sharding-ul orizontal?

sobes.tech AI

Răspuns de la AI

Sharding-ul orizontal este o tehnică de scalare a bazei de date care implică împărțirea datelor în părți, numite shards, și distribuirea acestor shards pe mai mulți serveri independenți. Fiecare shard conține o submulțime a tuturor rândurilor tabelului, păstrând toate coloanele.

Avantajele sharding-ului orizontal:

  • Scalabilitate: Permite gestionarea unui volum în creștere de date și trafic prin adăugarea de noi servere pentru stocarea shardurilor.
  • Performanță: Reduce volumul de date cu care lucrează fiecare server, accelerând executarea interogărilor.
  • Disponibilitate: Dacă un shard devine inaccesibil, celelalte continuă să funcționeze.
  • Reducerea încărcăturii: Distribuie sarcina de intrare/ieșire pe mai multe servere.

Dezavantajele sharding-ului orizontal:

  • Complexitate: Implementarea și gestionarea sharding-ului necesită eforturi semnificative de inginerie.
  • Tranzacții distribuite: Tranzacțiile care implică mai mulți shards sunt complexe de implementat și pot reduce performanța.
  • Rebalansare: Redistribuirea datelor între shards în cazul schimbării încărcăturii sau adăugării de noi servere poate fi un proces complex și consumator de resurse.
  • Interogări între shards: Interogările care necesită combinarea datelor din diferite shards (JOIN) pot fi ineficiente.

Metode de sharding:

  • Sharding pe interval: Datele sunt distribuite pe baza unui interval de valori în cheia de sharding.
  • Sharding pe hash: Datele sunt distribuite pe baza valorii hash a cheii de sharding.
  • Sharding director: O tabelă de mapare indică pe ce shard se află anumite date sau intervale de date.

Exemplu simplificat de concept de sharding:

Se are o tabelă de utilizatori cu un volum mare de date. În loc să stocheze toți utilizatorii pe un singur server, se pot împărți în shards după prima literă a numelui de familie:

  • Shard 1: Utilizatori cu nume de familie de la A la E
  • Shard 2: Utilizatori cu nume de familie de la J la L
  • Shard 3: Utilizatori cu nume de familie de la M la S
  • Shard 4: Utilizatori cu nume de familie de la T la Y

Fiecare shard este stocat pe un server separat.

<?php

// Funcție de exemplu care determină shard-ul pe baza numelui de familie
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; // Returnează 0 pentru cazuri nedefinite
}

// Utilizare
$lastName = "Иванов";
$shardId = determineShardByLastName($lastName);
// Într-un sistem real, trebuie să te conectezi la baza de date a shard-ului corespunzător

?>