Middle+
Kas yra horizontali shard'inimas?
sobes.tech AI
Atsakymas iš AI
Horizontalus shard'inimas yra duomenų bazės mastelio keitimo technika, kurią sudaro duomenų padalijimas į dalis, vadinamas shardais, ir šių shardų paskirstymas keliuose nepriklausomuose serveriuose. Kiekvienas shardas apima visų eilučių dalį lentelėje, bet išlaiko visas stulpelius.
Horizontaliojo shard'inimo privalumai:
- Mastelio keitimas: leidžia apdoroti augantį duomenų kiekį ir srautą, pridedant naujus serverius shardų saugojimui.
- Našumas: sumažina kiekvieno serverio apdorojamų duomenų kiekį, tai pagreitina užklausų vykdymą.
- Prieinamumas: jei vienas shardas tampa neprieinamas, kiti shardai toliau veikia.
- Naštos paskirstymas: paskirsto įvesties/išvesties apkrovą keliuose serveriuose.
Horizontaliojo shard'inimo trūkumai:
- Sudėtingumas: shard'inimo diegimas ir valdymas reikalauja daug inžinerinių pastangų.
- Išsklaidytos transakcijos: kelių shardų apimantys transakcijos yra sudėtingi įgyvendinti ir gali sumažinti našumą.
- Balansavimas: duomenų perkėlimas tarp shardų keičiant apkrovą arba pridedant naujus serverius gali būti sudėtingas ir išteklių reikalaujantis procesas.
- Užklausos tarp shardų: užklausos, reikalaujančios duomenų sujungimo iš skirtingų shardų (pvz.,
JOINužklausos), gali būti neefektyvios.
Shard'inimo metodai:
- Intervalo pagrindu shard'inimas: duomenys paskirstomi pagal reikšmių intervalą shard'o rakte.
- Hash pagrindu shard'inimas: duomenys paskirstomi pagal hash reikšmę shard'o rakto.
- Direktorijos shard'inimas: žemėlapio lentelė nurodo, kuriame shard'e yra tam tikri duomenys arba duomenų intervalai.
Pavyzdinis shard'inimo pavyzdys (supaprastintas):
Yra naudotojų lentelė su dideliu duomenų kiekiu. Vietoj to, kad saugotume visus naudotojus viename serveryje, galime juos padalinti į shard'us pagal pavardės pirmąją raidę:
- Shard 1: naudotojai su pavardėmis nuo A iki E
- Shard 2: naudotojai su pavardėmis nuo Ж iki Л
- Shard 3: naudotojai su pavardėmis nuo М iki С
- Shard 4: naudotojai su pavardėmis nuo Т iki Я
Kiekvienas shardas saugomas atskirame serveryje.
<?php
// Pavyzdinė funkcija, nustatanti shard pagal pavardę
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; // Grąžina 0 neapibrėžtiems atvejams
}
// Naudojimas
$lastName = "Иванов";
$shardId = determineShardByLastName($lastName);
// Realiame sistemoje reikės prisijungti prie atitinkamos shard duomenų bazės
?>