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

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

Ответ

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

Как это работает:

  1. Ключ шардирования: Выбирается атрибут для распределения данных (например, user_id).
  2. Функция шардирования: Определяет, на какой шард попадет запись. Часто используется хэш-функция или диапазоны значений.
  3. Распределение: Данные и нагрузка распределяются между несколькими физическими серверами.

Пример логики выбора шарда на PHP:

function getShardForUser(int $userId, int $totalShards): int {
    // Простая хэш-функция для определения шарда
    return $userId % $totalShards;
}

$shardNumber = getShardForUser(12345, 5); // Пользователь попадет на шард 0
$connection = connectToDatabaseShard($shardNumber);

Преимущества:

  • Горизонтальное масштабирование: Можно добавлять серверы для обработки растущего объема данных и нагрузки.
  • Повышение производительности: Запросы выполняются на меньших наборах данных, снижается конкуренция за ресурсы.
  • Отказоустойчивость: Выход из строя одного шарда не парализует всю систему.

Недостатки и сложности:

  • Сложные JOIN: Объединение данных из разных шардов неэффективно и часто требует дополнительной логики на уровне приложения.
  • Распределенные транзакции: Обеспечение ACID-свойств для операций, затрагивающих несколько шардов, является нетривиальной задачей.
  • Ребалансировка: Добавление или удаление шардов требует перемещения данных, что может быть ресурсоемкой операцией.

Шардинг применяется в высоконагруженных системах, таких как крупные социальные сети (Facebook, Instagram) или маркетплейсы, где объем данных превышает возможности одной машины.