Middle+
Mi az a horizontális sharding?
sobes.tech MI
Válasz az MI-től
Vízszintes sharding egy adatbázis-skálázási technika, amely az adatok részekre osztásával és ezeknek a részeknek több független szerverre történő elosztásával valósul meg. Minden shard a táblázat összes sorának egy részét tartalmazza, de minden oszlopot megtart.
A vízszintes sharding előnyei:
- Skálázhatóság: Lehetővé teszi a növekvő adatmennyiség és forgalom kezelését új szerverek hozzáadásával a shardok tárolására.
- Teljesítmény: Csökkenti az egy szerveren dolgozó adatok mennyiségét, ezáltal gyorsítva a lekérdezések végrehajtását.
- Elérhetőség: Ha egy shard nem elérhető, a többi shard továbbra is működik.
- Terheléselosztás: Az I/O terhelést több szerver között osztja szét.
A vízszintes sharding gyengeségei:
- Bonyolultság: A sharding bevezetése és kezelése jelentős mérnöki erőfeszítést igényel.
- Elosztott tranzakciók: Több shard-ot érintő tranzakciók nehezek a megvalósításban, és csökkenthetik a teljesítményt.
- Újraelosztás: Az adatok újraelosztása a shardok között a terhelés változásakor vagy új szerverek hozzáadásakor bonyolult és erőforrás-igényes lehet.
- Kérdések shardok között: Az olyan kérdések, amelyek több shard adatait igénylik (pl. JOIN műveletek), nem hatékonyak lehetnek.
A sharding módszerei:
- Tartomány szerinti sharding: Az adatok a shard kulcs értéktartományai alapján kerülnek elosztásra.
- Hash-alapú sharding: Az adatok a shard kulcs hash értéke alapján kerülnek elosztásra.
- Direktórium szerinti sharding: Egy hozzárendelő táblázat jelzi, hogy mely adatok vagy adat tartományok mely shardon találhatók.
Egyszerűsített shardolási példa (konceptuálisan):
Van egy felhasználói táblázat nagy adatmennyiséggel. Ahelyett, hogy minden felhasználót egy szerveren tárolnánk, a vezetéknevek első betűje szerint oszthatjuk őket shardokra:
-
- shard: Felhasználók A-tól E-ig
-
- shard: Felhasználók J-tól L-ig
-
- shard: Felhasználók M-től S-ig
-
- shard: Felhasználók T-től Y-ig
Minden shard külön szerveren található.
<?php
// Egy példa függvény, amely a vezetéknevet alapul véve határozza meg a shardot
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; // Nem meghatározott esetekben 0-t ad vissza
}
// Használat
$lastName = "Иванов";
$shardId = determineShardByLastName($lastName);
// A való életben csatlakozni kell a megfelelő shard adatbázisához
?>