(продолжение предыдущего поста)
Шардинг (sharding) — это паттерн архитектуры базы данных, при котором база данных разбивается на более мелкие части (шарды/сегменты), каждая из которых хранится и обрабатывается независимо. Это позволяет повысить производительность, масштабируемость и удобство обслуживания крупных баз данных.
Шардинг — это мощный инструмент для управления большими базами данных, позволяющий балансировать нагрузку, повышать производительность и обеспечивать масштабируемость. Выбор стратегии шардинга зависит от структуры данных и требований к системе.
Разберём подробно различные стратегии и типы шардинга.
#### 1. Типы шардинга
а) Вертикальный шардинг (Vertical)
- Суть: разбиение базы данных по столбцам (колонкам), а не по строкам.
- Пример на изображении: исходная таблица с колонками
ID, First Name, Last Name разделена на две части:- Partition 1: содержит
ID и First Name;- Partition 2: содержит
ID и Last Name.- Применение: подходит для случаев, когда к определённым колонкам обращаются чаще, чем к другим (например, данные аутентификации пользователей в одном шарде, а журналы активности — в другом).
б) Горизонтальный шардинг (Horizontal)
- Суть: разделение базы данных по строкам (а не по колонкам), при этом каждая строка хранится только в одном шарде.
- Пример на изображении: данные распределены по нескольким шардам, каждый из которых содержит подмножество строк исходной таблицы.
- Применение: идеально для приложений с большим объёмом данных, где строки можно сегментировать (например, по географическим регионам или идентификаторам пользователей).
#### 2. Стратегии шардинга
а) Range Based Sharding (шардинг на основе диапазона значений)
- Суть: данные распределяются по шардам в зависимости от диапазона значений определённого поля (например, возраста).
- Пример на изображении: таблица с полем
Age разделена на три диапазона:- 20 < Age ≤ 30: содержит только запись
Rohit (28);- 30 < Age ≤ 40: содержит записи
Alex (32), Adam (34), Foo (36);- 40 < Age ≤ 50: содержит записи
John (45), Anshu (50).- Особенности: может приводить к неравномерному распределению нагрузки (некоторые шарды перегружены, другие — недогружены).
- Применение: подходит для данных с временными метками или последовательных данных (журналы, события).
б) Key Based Sharding (шардинг на основе ключа)
- Суть: использование хэш-функции для распределения данных по шардам. Хэш-функция принимает ключ (например,
ID) и возвращает значение, определяющее, в какой шард попадёт запись.- Пример на изображении: используется функция
ID % 3, которая вычисляет хэш-значение для каждого ID:-
ID 1 → Hash = 1 % 3 = 1 → попадает в Shard #1;-
ID 2 → Hash = 2 % 3 = 2 → попадает в Shard #2;-
ID 3 → Hash = 3 % 3 = 0 → попадает в Shard #3;- и так далее.
- Особенности: обеспечивает более равномерное распределение данных по шардам.
- Применение: подходит для систем, где важна балансировка нагрузки (например, хранение пользовательских сессий).
в) Directory Based Sharding (шардинг на основе каталога)
- Суть: используется специальная служба (каталог), которая отслеживает, в каком шарде хранятся те или иные данные. Каталог сопоставляет ключи шардов с их местоположением.
- Пример на изображении: таблица
ID | Map показывает, в каком шарде хранится каждая запись:-
ID 1 → Map 1 → Shard #1;-
ID 2 → Map 3 → Shard #3;-
ID 3 → Map 1 → Shard #1;- и так далее.
- Особенности: позволяет работать с неравномерным распределением данных и сложными критериями разбиения.
- Применение: подходит для сложных систем с динамическим распределением данных.
#### 3. Ключевые особенности шардинга, отражённые на изображении