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
?>