Sobes.tech
Middle+

Čo je horizontálne sharding?

sobes.tech AI

Odpoveď od AI

Horizontálne sharding je technika škálovania databázy, ktorá rozdeľuje dáta na časti, nazývané shard, a tieto rozdeľuje medzi niekoľko nezávislých serverov. Každý shard obsahuje podmnožinu všetkých riadkov tabuľky, pričom zachováva všetky stĺpce.

Výhody horizontálneho sharding:

  • Škálovateľnosť: Umožňuje spracovanie rastúceho objemu dát a prevádzky pridaním nových serverov na ukladanie shardov.
  • Výkon: Znižuje množstvo dát, s ktorými pracuje každý server, čo zrýchľuje vykonávanie dopytov.
  • Dostupnosť: Ak sa jeden shard stane nedostupným, ostatné shardové stále fungujú.
  • Zníženie záťaže: Rozdeľuje záťaž vstupu/výstupu medzi viaceré servery.

Nevýhody horizontálneho sharding:

  • Zložitosť: Zavedenie a správa sharding vyžaduje značné inžinierske úsilie.
  • Rozdelené transakcie: Transakcie zahŕňajúce viacero shardov sú zložité na implementáciu a môžu znížiť výkon.
  • Rebalansovanie: Preusporiadanie dát medzi shardmi pri zmene záťaže alebo pridávaní nových serverov môže byť zložité a náročné na zdroje.
  • Dopyty medzi shardmi: Dopyty vyžadujúce spojenie dát z rôznych shardov (napr. s JOIN) môžu byť neefektívne.

Metódy sharding:

  • Sharding podľa rozsahu: Dáta sa rozdeľujú na základe rozsahu hodnôt v kľúči sharding.
  • Sharding podľa hash: Dáta sa rozdeľujú na základe hash hodnoty kľúča sharding.
  • Direktórium sharding: Tabuľka mapovania ukazuje, na ktorom shard je umiestnené určité dáta alebo rozsahy dát.

Príklad konceptu sharding (zjednodušene):

Máme tabuľku používateľov s veľkým objemom dát. Namiesto ukladania všetkých používateľov na jednom serveri ich môžeme rozdeliť na shard podľa prvého písmena priezviska:

  • Shard 1: Používatelia s priezviskami od A do E
  • Shard 2: Používatelia s priezviskami od J do L
  • Shard 3: Používatelia s priezviskami od M do S
  • Shard 4: Používatelia s priezviskami od T do Y

Každý shard je uložený na samostatnom serveri.

<?php

// Príklad funkcie určujúcej shard na základe priezviska
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; // Vráti 0 pre neurčené prípady
}

// Použitie
$lastName = "Иванов";
$shardId = determineShardByLastName($lastName);
// V reálnom systéme je potrebné sa pripojiť k príslušnej databáze shard

?>