Sobes.tech
Middle+

Czym jest poziomowe sharding?

sobes.tech AI

Odpowiedź od AI

Poziome sharding to technika skalowania bazy danych polegająca na dzieleniu danych na części, zwane shardami, i rozdzielaniu tych shardów na kilka niezależnych serwerów. Każdy shard zawiera podzbiór wszystkich wierszy tabeli, zachowując wszystkie kolumny.

Zalety poziomego sharding:

  • Skalowalność: Pozwala obsługiwać rosnącą ilość danych i ruchu, dodając nowe serwery do przechowywania shardów.
  • Wydajność: Zmniejsza ilość danych, z którymi pracuje każdy serwer, co przyspiesza wykonywanie zapytań.
  • Dostępność: Jeśli jeden shard stanie się niedostępny, pozostałe nadal działają.
  • Zmniejszenie obciążenia: Rozkłada obciążenie wejścia/wyjścia na kilka serwerów.

Wady poziomego sharding:

  • Złożoność: Wdrożenie i zarządzanie shardingiem wymaga znacznych nakładów inżynieryjnych.
  • Transakcje rozproszone: Transakcje obejmujące wiele shardów są trudne do implementacji i mogą obniżać wydajność.
  • Rebalansowanie: Przebudowa danych między shardami przy zmianie obciążenia lub dodaniu nowych serwerów może być skomplikowana i zasobożerna.
  • Zapytania między shardami: Zapytania wymagające łączenia danych z różnych shardów (JOIN) mogą być nieefektywne.

Metody sharding:

  • Sharding zakresowy: Dane są rozdzielane na podstawie zakresu wartości w kluczu shardingowym.
  • Sharding haszowy: Dane są rozdzielane na podstawie wartości hash klucza shardingowego.
  • Sharding katalogowy: Tabela mapująca wskazuje, na którym shardzie znajdują się dane lub zakresy danych.

Przykład uproszczonej koncepcji sharding:

Mamy tabelę użytkowników z dużą ilością danych. Zamiast przechowywać wszystkich użytkowników na jednym serwerze, można podzielić ich na shard'y według pierwszej litery nazwiska:

  • Shard 1: Użytkownicy z nazwiskami od A do E
  • Shard 2: Użytkownicy z nazwiskami od J do L
  • Shard 3: Użytkownicy z nazwiskami od M do S
  • Shard 4: Użytkownicy z nazwiskami od T do Y

Każdy shard jest przechowywany na osobnym serwerze.

<?php

// Przykładowa funkcja określająca shard na podstawie nazwiska
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; // Zwraca 0 dla nieokreślonych przypadków
}

// Użycie
$lastName = "Иванов";
$shardId = determineShardByLastName($lastName);
// W rzeczywistym systemie, należy połączyć się z odpowiednią bazą danych shard

?>