Что такое шардинг (дробление таблиц по идентификаторам)?

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

Ответ

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

Как это работает на практике:

  1. Определение шарда: Выбирается ключ шардирования (например, user_id).
  2. Функция распределения: Используется хэш-функция или диапазоны для определения, на какой шард попадает запись.
    -- Пример логики определения шарда (псевдокод)
    shard_number = user_id % total_shards; -- Например, 4 шарда
    -- Запрос с user_id = 123 попадёт на шард 3 (123 % 4 = 3)
  3. Маршрутизация запросов: Приложение или промежуточный слой (shard router) знает, к какому шарду обратиться для конкретного user_id.

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

  • Горизонтальное масштабирование: Можно добавлять новые серверы для увеличения пропускной способности записи и чтения.
  • Распределение нагрузки: Данные и нагрузка распределяются по нескольким машинам.

Сложности и нюансы:

  • Горячие шарды: Неравномерное распределение данных (например, один шард с самыми активными пользователями) сводит на нет преимущества.
  • Межшардовые JOIN: Выполнение операций JOIN между таблицами, находящимися на разных шардах, крайне неэффективно и обычно требует отдельной стратегии (дублирование данных, denormalization).
  • Распределённые транзакции: Транзакции, затрагивающие несколько шардов, требуют сложных протоколов (например, двухфазный коммит — 2PC), что снижает производительность.
  • Решардинг: Перебалансировка данных при добавлении или удалении шардов — сложная операция.

Альтернативы/дополнения: Репликация (для чтения), вертикальное партиционирование (разделение по столбцам).