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

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

Ответ

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

С точки зрения DevOps, шардирование решает проблемы:

  1. Масштабируемость записи: Когда одна БД-нода становится узким местом.
  2. Распределение нагрузки: Запросы распределяются по нескольким серверам.
  3. Геораспределение: Шарды можно размещать ближе к пользователям.

Основные стратегии шардирования:

  • По диапазону (Range-based): Данные делятся по диапазону ключа (например, user_id от 1-1000 на шард A, 1001-2000 на шард B).
  • По хэшу (Hash-based): Ключ шардирования хэшируется, и хэш определяет шард. Обеспечивает равномерное распределение.
  • По списку (List-based): Явное отображение значений ключа на определенный шард (например, пользователи из региона EU -> шард 1).

Пример архитектуры и команд (на примере PostgreSQL с логическим шардированием):

-- На шарде 1 (для пользователей с id 1-500)
CREATE TABLE users_shard1 (
    id INT PRIMARY KEY CHECK (id BETWEEN 1 AND 500),
    name VARCHAR(100),
    email VARCHAR(255)
);

-- На шарде 2 (для пользователей с id 501-1000)
CREATE TABLE users_shard2 (
    id INT PRIMARY KEY CHECK (id BETWEEN 501 AND 1000),
    name VARCHAR(100),
    email VARCHAR(255)
);

Роль DevOps-инженера:

  • Автоматизация развертывания и управления шардами с помощью инструментов (Ansible, Terraform).
  • Настройка балансировщика/прокси (например, PgBouncer, ProxySQL для MySQL, Vitess для MySQL, Citus для PostgreSQL), который направляет запросы к правильному шарду.
  • Мониторинг каждого шарда как отдельного сервиса.
  • Оркестрация решардинга (перераспределения данных) при добавлении новых шардов с минимальным простоем.

Недостатки, которые нужно учитывать:

  • Сложность выполнения транзакций, затрагивающих несколько шардов.
  • Усложнение JOIN-запросов между шардами.
  • Необходимость тщательного выбора ключа шардирования, чтобы избежать «горячих» шардов.

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