Шардинг

Разделение одной большой базы данных на части, которые хранятся на разных серверах: каждый сервер отвечает за свою долю данных.

Шардинг — способ масштабировать базу данных, когда один сервер уже не справляется с объемом данных или нагрузкой. Данные делят на части — шарды — и размещают на разных серверах. Например, клиенты с четными номерами хранятся на одном сервере, с нечетными — на другом. Каждый сервер хранит и обрабатывает только свою долю, и общая мощность системы растет с добавлением серверов.

Как делят данные

Все решает ключ шардирования — поле, по которому определяется, в какой шард попадет запись.

  • По хешу ключа — номер клиента пропускают через хеш-функцию и получают номер шарда. Данные распределяются равномерно.
  • По диапазонам — клиенты 1–1 000 000 на первом сервере, следующий миллион — на втором. Удобно для выборок по диапазону, но новые записи могут скапливаться на последнем шарде.
  • По признаку — например, по региону или организации, если запросы почти всегда касаются одного региона или одного арендатора системы.

Удачный ключ — тот, по которому делается большинство запросов. Тогда каждый запрос идет на один сервер.

Шардинг, репликация и секционирование

  • Репликация — копии одних и тех же данных на разных серверах; она помогает с отказоустойчивостью и чтением, но не уменьшает объем на каждом сервере.
  • Секционирование — деление таблицы на части внутри одного сервера, например по месяцам.
  • Шардинг — деление данных между серверами. На практике его сочетают с репликацией: у каждого шарда есть свои копии.

Сложности

  • Запросы через все шарды. Отчет «выручка по всем клиентам» придется собирать со всех серверов.
  • Транзакции между шардами. Перевод между клиентами из разных шардов уже не обычная транзакция с гарантиями ACID, а распределенная — сложная и медленная.
  • Перебалансировка. При добавлении серверов часть данных нужно перенести, не останавливая систему.
  • Горячие шарды. Крупный клиент может перегрузить свой сервер, пока остальные простаивают.

Инструменты

В MongoDB шардинг встроен. Для PostgreSQL есть расширение Citus, для MySQL — Vitess; иногда шардинг реализуют на уровне приложения. Правило опытных команд: шардинг — последний шаг. Сначала оптимизируют запросы и индексы, выносят чтение на реплики, добавляют кэш и архивируют старые данные. Многие системы с миллионами пользователей прекрасно живут на одном мощном сервере базы данных.