В системах, в процессе их существования, наступает этап шардирования (разделения) данные. Например, это может произойти в процессе масштабирования базы данных. Существуют две стратегии шардирования данных.
- Вертикальное разбиение данных: это означает, что некоторые столбцы перемещаются в новые таблицы. Каждая таблица содержит одинаковое количество строк, но меньшее количество столбцов.
- Горизонтальное разбиение данных (часто называемое сегментированием): оно делит таблицу на несколько меньших таблиц. Каждая таблица представляет собой отдельное хранилище данных и содержит такое же количество столбцов, но меньшее количество строк.
Горизонтальное разбиение чаще используется, поэтому давайте рассмотрим его подробнее.
Алгоритм маршрутизации
Алгоритм маршрутизации определяет, в каком разделе (shard) хранятся данные.
- Шардинг на основе диапазона (Range-based sharding). Этот алгоритм использует упорядоченные столбцы, такие как целые числа, временные метки, для разделения строк. Например, на приведенной диаграмме столбец идентификатора пользователя используется для разделения диапазона: идентификаторы пользователей 1 и 2 находятся в шарде №1, идентификаторы пользователей 3 и 4 — в шарде №2.
- Шардинг на основе хэшей (Range-based sharding). Этот алгоритм применяет хэш-функцию к одному столбцу или нескольким столбцам, чтобы решить, какая строка относится к какой таблице. Например, на приведенной диаграмме в качестве хэш-функции используется [id % 2]. Идентификаторы пользователей 1 и 3 находятся в шарде №1, идентификаторы пользователей 2 и 4 — в шарде №2.
Преимущества:
- Упрощение горизонтального масштабирования. Шардинг облегчает возможность добавления дополнительных машин для распределения нагрузки.
- Сокращение времени отклика. Разделяя одну таблицу на несколько таблиц, запросы обрабатывают меньшее количество строк, а результаты возвращаются намного быстрее.
Недостатки:
- Сложные запросы данных. Обычно нам нужно получить данные из разных шардов и отсортировать данные в основном приложении.
- Неравномерное распределение. Некоторые шарды могут содержать больше данных, чем другие (их также называют горячей точкой).