Sobes.tech
Middle+

Kas ir horizontālā shardēšana?

sobes.tech AI

Atbilde no AI

Horizontālā shardēšana ir datu bāzes mērogošanas tehnika, kas sastāv no datu sadalīšanas daļās, sauktās shardos, un šo shardu sadalīšanas vairākos neatkarīgos serveros. Katrs shard ietver visu rindu apakškopu, bet saglabā visas kolonnas.

Horizontālās shardēšanas priekšrocības:

  • Mērogojamība: ļauj apstrādāt pieaugošu datu apjomu un trafiku, pievienojot jaunus serverus shardu glabāšanai.
  • Veiktspēja: samazina katra servera apstrādāto datu apjomu, kas paātrina vaicājumu izpildi.
  • Pieejamība: ja viens shard kļūst nepieejams, pārējie shard ir pieejami.
  • Slodzes sadalījums: sadala ievades/izvades slodzi starp vairākiem serveriem.

Horizontālās shardēšanas trūkumi:

  • Sarežģītība: shardēšanas ieviešana un pārvaldība prasa ievērojamas inženiertehniskas pūles.
  • Izplatītas transakcijas: vairākus shardus aptverošas transakcijas ir sarežģītas īstenot un var samazināt veiktspēju.
  • Rebalansēšana: datu pārkārtošana starp shardiem, mainoties slodzei vai pievienojot jaunus serverus, var būt sarežģīta un resursu prasīga.
  • Vaicājumi starp shardiem: vaicājumi, kas prasa datu apvienošanu no dažādiem shardiem (piemēram, JOIN vaicājumi), var būt neefektīvi.

Shardēšanas metodes:

  • Diapazona shardēšana: dati tiek sadalīti pēc vērtību diapazona shard atslēgā.
  • Hesēšanas shardēšana: dati tiek sadalīti pēc hesēšanas vērtības shard atslēgā.
  • Direktorijas shardēšana: kartes tabula norāda, kurā shard ir konkrēti dati vai datu diapazoni.

Piemērs vienkāršotai shardēšanas koncepcijai:

Ir liela datu tabula ar lietotājiem. Tā vietā, lai saglabātu visus lietotājus vienā serverī, mēs varam tos sadalīt pēc uzvārda pirmās burta:

  • Shard 1: lietotāji ar uzvārdiem no A līdz E
  • Shard 2: lietotāji ar uzvārdiem no Ж līdz Л
  • Shard 3: lietotāji ar uzvārdiem no М līdz С
  • Shard 4: lietotāji ar uzvārdiem no Т līdz Я

Katrs shard ir glabāts atsevišķā serverī.

<?php

// Piemērs funkcijai, kas nosaka shard pēc uzvārda
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; // Atgriež 0 neizlēmētiem gadījumiem
}

// Lietošana
$lastName = "Иванов";
$shardId = determineShardByLastName($lastName);
// Reālajā sistēmā ir nepieciešams pieslēgties atbilstošajai shard datu bāzei

?>