Шардинг как паттерн архитектуры базы данных

Что такое шардинг?

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

Ключевые характеристики

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

Типы шардинга

Горизонтальный шардинг

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

Использование. Идеально подходит для приложений с большим набором данных, где строки данных можно легко сегментировать, например разделить данные о клиентах по географическим регионам или идентификаторам пользователей. Этот метод очень эффективен при балансировке нагрузки и повышении производительности запросов, поскольку сокращает количество строк, по которым идет поиск в каждом запросе.

Горизонтальный шардинг

Вертикальный шардинг

Описание. Представляет собой разбиение базы данных на более мелкие подмножества, где каждый шард содержит подмножество таблиц базы данных. Этот метод часто используется для разделения базы данных на более мелкие, более управляемые части, при этом каждый шард предназначен для определенных таблиц или групп таблиц, связанных с конкретными аспектами приложения.

Использование. Подходит для баз данных, в которых к определенным таблицам обращаются чаще, чем к другим, что позволяет снизить нагрузку на таблицы, в которые направляется большое количество запросов. Например, в веб-приложении данные аутентификации пользователей могут храниться в одном шарде, а журналы активности  —  в другом, что оптимизирует производительность часто используемых таблиц.

Вертикальный шардинг

Стратегии шардинга

Шардинг на основе хэширования

Описание. Использование хэш-функции для определения шарда для каждой записи данных. Хэш-функция принимает ключ шарда, обычно определенный атрибут или столбец в наборе данных, и возвращает хэш-значение, которое затем используется для отнесения записи к определенному шарду.

Использование. Идеально подходит для приложений, где равномерное распределение данных является критически важным, например при хранении пользовательских сессий в веб-приложениях.

Основанный на хэшировании шардинг

Шардинг на основе диапазона значений ключа

Описание. Этот метод предполагает разделение данных на шарды на основе диапазона значений ключа шарда. Каждый шард содержит данные для определенного диапазона значений.

Использование. Подходит для данных временных рядов или последовательных данных, таких как журналы и события с временными метками.

Шардинг на основе диапазона значений ключа

Шардинг на основе каталога

Описание. Использует службу поиска или каталог для отслеживания того, на каком шарде хранятся те или иные данные. Каталог сопоставляет ключи шардов с их местоположением.

Использование. Эта стратегия эффективна в сценариях, где распределение данных может быть неравномерным или когда приходится иметь дело со сложными критериями разбиения данных.

Шардинг на основе каталога

Геошардинг

Описание. Данные разделяются по географическому признаку. Каждый шард отвечает за данные из определенной географической области.

Использование. Идеально подходит для сервисов, требующих локальности данных, таких как сети доставки контента и сервисы на основе местоположения в мобильных приложениях.

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

Масштабируемость. Распределяя данные по нескольким машинам, шардинг позволяет осуществлять горизонтальное масштабирование, которое является более экономичным и управляемым процессом, чем вертикальное масштабирование (модернизация существующего оборудования).

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

Высокая доступность. Шардинг повышает доступность данных. Если один шард выходит из строя, это не приводит к сбою всей базы данных. Недоступным становится только подмножество данных.

Недостатки

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

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

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

Сложность возврата к стандартной архитектуре. Возврат базы данных с шардированной архитектурой к архитектуре без шардирования может оказаться чрезвычайно сложным и ресурсоемким. Этот процесс требует значительных усилий по реструктуризации и миграции данных.

Заключение

Шардинг  —  это эффективный архитектурный паттерн, предназначенный для управления крупномасштабными базами данных. Он обеспечивает масштабируемость, производительность и доступность при работе с базами данными.

Однако за эти преимущества приходится платить повышенной сложностью, особенно в плане реализации и управления. Эффективный шардинг требует продуманного подхода к распределению данных и глубокого понимания моделей доступа к данным в приложении.

Несмотря на сложности, шардинг является важнейшим инструментом в арсенале архитекторов баз данных, особенно в сфере больших данных и приложений с высоким трафиком. Поскольку объем и значимость данных продолжают расти, шардинг будет оставаться жизненно важной стратегией для эффективного и результативного управления базами данных.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Pier-Jean Malandrino: Architecture Patterns : Sharding. What is Sharding?

Предыдущая статьяОсваиваем ViewThatFits. Часть 1
Следующая статьяТехнические долги при проектировании компонентов с помощью Angular