Найти тему
HowToSchool

SD-EP25: Вертикальное и горизонтальное шардирование базы данных

В системах, в процессе их существования, наступает этап шардирования (разделения) данные. Например, это может произойти в процессе масштабирования базы данных. Существуют две стратегии шардирования данных.

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

Горизонтальное разбиение чаще используется, поэтому давайте рассмотрим его подробнее.

Алгоритм маршрутизации

Алгоритм маршрутизации определяет, в каком разделе (shard) хранятся данные.

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

Преимущества:

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

Недостатки:

  • Сложные запросы данных. Обычно нам нужно получить данные из разных шардов и отсортировать данные в основном приложении.
  • Неравномерное распределение. Некоторые шарды могут содержать больше данных, чем другие (их также называют горячей точкой).