← Назад к вопросам

Что такое шардирование в БД?

2.0 Middle🔥 61 комментариев
#Архитектура систем#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое шардирование в БД?

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

Основная идея

Вместо того чтобы хранить все данные на одном сервере, данные разбиваются на логические части (shards), и каждый shard хранится на отдельном сервере. Например:

Таблица users: 10 млн записей

Одна БД (нескалируемо) Все 10 млн записей users

Распределённо на 3 shard'а: Shard 1: 3.3 млн (Server A) Shard 2: 3.3 млн (Server B) Shard 3: 3.4 млн (Server C)

Типы шардирования

1. Range-based (диапазонное)

  • Данные распределяются по диапазонам значений
  • Пример: user_id 1-3.3млн на Shard1, 3.3-6.6млн на Shard2
  • Проблема: неравномерное распределение нагрузки

2. Hash-based (хеш-функция)

  • Используется хеш-функция для определения shard
  • Пример: shard_id = hash(user_id) mod number_of_shards
  • Преимущество: равномерное распределение

3. Directory-based (справочник)

  • Используется таблица-справочник, которая хранит mapping
  • user_id к shard_id
  • Гибкость: легко переопределять распределение

4. Geographical (географическое)

  • Данные распределяются по географическим регионам
  • Пример: Европа к Shard1, Азия к Shard2, США к Shard3

Преимущества шардирования

  • Масштабируемость: можно добавлять новые shards по мере роста
  • Производительность: каждый shard обрабатывает меньше данных
  • Параллелизм: запросы к разным shards могут выполняться параллельно
  • Отказоустойчивость: отказ одного shard'а не влияет на другие

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

Трансакции и join'ы

  • Если данные распределены, сложно выполнять ACID-транзакции
  • Join'ы между таблицами на разных shards неэффективны

Перебалансировка

  • При добавлении новых shards нужно перераспределять данные
  • Hash-based шардирование требует консистентного хеша

Хоттие (hotspots)

  • Если ключ выбран неудачно, данные могут быть неравномерно распределены
  • Пример: шардирование по country может привести к перегрузке крупных стран

Сложность операций

  • Запросы типа SELECT COUNT(*) FROM users требуют обращения ко всем shard'ам
  • Нужна координация между shard'ами

Реальные примеры

  • Discord: шардирует по guild_id
  • Uber: шардирует по geographical regions
  • Twitter: шардирует по tweet_id
  • MongoDB: встроенная поддержка sharding'а

Когда использовать шардирование

Лучше использовать когда:

  • Данные больше 1 ТБ
  • RPS (запросов в секунду) больше 10k
  • Нужна репликация по регионам
  • Готовы к операционной сложности

Не нужно когда:

  • Данные укладываются на один сервер
  • Нагрузка низкая
  • Часто нужны кросс-shard запросы

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

Что такое шардирование в БД? | PrepBro