Что такое шардирование в базах данных?

«Что такое шардирование в базах данных?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Шардирование (Sharding) — это практика горизонтального партиционирования данных в базе данных, при которой строки одной таблицы распределяются по нескольким независимым базам данных (шардам) на разных серверах. Каждый шард является автономной единицей хранения со своей схемой, но все вместе они представляют логически единый набор данных.

Ключевые концепции:

  • Шард-ключ: Поле, по значению которого определяется целевой шард (например, customer_id, country_code).
  • Локатор шардов: Сервис или функция, которая по шард-ключу возвращает соединение с нужным шардом.

Пример архитектуры с локатором:

class ShardLocator {
    private array $shardConnections;

    public function __construct(array $shardConfigs) {
        foreach ($shardConfigs as $id => $config) {
            $this->shardConnections[$id] = new PDO(
                $config['dsn'],
                $config['user'],
                $config['password']
            );
        }
    }

    public function getShardByKey(int $key): PDO {
        $shardId = $this->calculateShardId($key);
        return $this->shardConnections[$shardId];
    }

    private function calculateShardId(int $key): int {
        // Пример: равномерное распределение по 4 шардам
        return $key % 4;
    }
}

// Использование
$locator = new ShardLocator($config);
$userShard = $locator->getShardByKey($userId);
$stmt = $userShard->query("SELECT * FROM users WHERE id = {$userId}");
Сравнение с репликацией: Аспект Репликация Шардирование
Цель Отказоустойчивость, чтение Масштабирование записи и хранения
Данные Полная копия на каждой ноде Уникальное подмножество на каждой ноде
Сложность запросов Просто (все данные локально) Сложно (данные распределены)

Шардирование — это мощный, но сложный паттерн, который вводится, когда вертикальное масштабирование (увеличение мощности сервера) становится слишком дорогим или невозможным.