Шардинг
Разделение одной большой базы данных на части, которые хранятся на разных серверах: каждый сервер отвечает за свою долю данных.
Шардинг — способ масштабировать базу данных, когда один сервер уже не справляется с объемом данных или нагрузкой. Данные делят на части — шарды — и размещают на разных серверах. Например, клиенты с четными номерами хранятся на одном сервере, с нечетными — на другом. Каждый сервер хранит и обрабатывает только свою долю, и общая мощность системы растет с добавлением серверов.
Как делят данные
Все решает ключ шардирования — поле, по которому определяется, в какой шард попадет запись.
- По хешу ключа — номер клиента пропускают через хеш-функцию и получают номер шарда. Данные распределяются равномерно.
- По диапазонам — клиенты 1–1 000 000 на первом сервере, следующий миллион — на втором. Удобно для выборок по диапазону, но новые записи могут скапливаться на последнем шарде.
- По признаку — например, по региону или организации, если запросы почти всегда касаются одного региона или одного арендатора системы.
Удачный ключ — тот, по которому делается большинство запросов. Тогда каждый запрос идет на один сервер.
Шардинг, репликация и секционирование
- Репликация — копии одних и тех же данных на разных серверах; она помогает с отказоустойчивостью и чтением, но не уменьшает объем на каждом сервере.
- Секционирование — деление таблицы на части внутри одного сервера, например по месяцам.
- Шардинг — деление данных между серверами. На практике его сочетают с репликацией: у каждого шарда есть свои копии.
Сложности
- Запросы через все шарды. Отчет «выручка по всем клиентам» придется собирать со всех серверов.
- Транзакции между шардами. Перевод между клиентами из разных шардов уже не обычная транзакция с гарантиями ACID, а распределенная — сложная и медленная.
- Перебалансировка. При добавлении серверов часть данных нужно перенести, не останавливая систему.
- Горячие шарды. Крупный клиент может перегрузить свой сервер, пока остальные простаивают.
Инструменты
В MongoDB шардинг встроен. Для PostgreSQL есть расширение Citus, для MySQL — Vitess; иногда шардинг реализуют на уровне приложения. Правило опытных команд: шардинг — последний шаг. Сначала оптимизируют запросы и индексы, выносят чтение на реплики, добавляют кэш и архивируют старые данные. Многие системы с миллионами пользователей прекрасно живут на одном мощном сервере базы данных.