Включите исполнение JavaScript в браузере, чтобы запустить приложение.
5 ноя 2024

Что такое шардирование БД (базы данных)

Узнайте, что такое шардирование (sharding) базы данных и почему этот метод становится все более популярным среди разработчиков. В данном материале мы рассмотрим основные принципы шардинга БД, его преимущества и недостатки, а также примеры использования в различных сферах. Подробнее читайте на сайте.

Что такое шардинг баз данных

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

Острая потребность в разделении БД возникает, когда система начинает требовать все больше ресурсов, а вертикальное масштабирование (увеличение мощности за счет добавления ресурсов) уже не позволяет добиться необходимого уровня производительности.

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

Разновидности шардирования

Существует несколько видов шардинга, каждый из которых применяться при определенных требованиях и исходной структуре БД. К основным видам относятся горизонтальное и вертикальное разделение хранилища.

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

Допустим, у интернет-магазина бытовой техники есть таблица с информацией о заказах:

Номер заказаДата заказаКлиентПродуктСумма
1022024-10-01Иванов И.И.Плита50000
1032024-10-01Петров П.П.Пылесос60000
1042024-10-01Сидорова С.С.Телевизор40000
1052024-10-02Кузнецова А.А.Холодильник25000

Тогда горизонтальное разделение может выглядеть следующим образом.

Шард 1:

Номер заказаДата заказаКлиентПродуктСумма
1022024-10-01Иванов И.И.Плита50000
1032024-10-01Петров П.П.Пылесос60000

Шард 2:

Номер заказаДата заказаКлиентПродуктСумма
1042024-10-01Сидорова С.С.Телевизор40000
1052024-10-02Кузнецова А.А.Холодильник25000

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

Разделенная таким методом таблица с информацией о заказах представлена ниже.

Шард 1:

Номер заказаКлиентСумма
102Иванов И.И.50000
103Петров П.П.60000
104Сидорова С.С.40000
105Кузнецова А.А.25000

Шард 2:

Дата заказаПродукт
2024-10-01Плита
2024-10-01Пылесос
2024-10-01Телевизор
2024-10-02Холодильник

То есть при вертикальном разделении БД данные разделяются по свойствам, а логика этого деления всегда индивидуальна.

Преимущества шардирования

Разделение хранилища на сегменты имеет множество преимуществ, среди которых:

  • стоимость и легкость масштабирования. Шардирование зачастую дешевле, чем вертикальное масштабирование, которое, во-первых, имеет предел, а во-вторых, представляет из себя наращивание мощности за счет обновления/добавления оборудования и ресурсов;
  • повышение производительности. Так как нагрузка распределяется между серверами, сокращается время выполнения запросов, что увеличивает производительность системы. Также за счет параллельной работы серверов улучшается время отклика;
  • надежность системы. Повышенная производительность — это не единственный плюс распределения нагрузки по серверам: также распределенная нагрузка позволяет повысить устойчивость системы к нагрузкам и избежать узких мест (такие места, где происходят задержки, которые снижают общую производительность системы). Помимо этого, минимизируется влияние отказа одного сервера на всю систему, так как другие серверы продолжают работать;
  • в некоторых случаях разделение БД позволяет повысить безопасность системы и улучшить ее управляемость за счет упрощенного доступа к каждому сегменту.

Недостатки шардирования

Несмотря на все плюсы, такой подход имеет свои риски и недостатки, которые стоит учитывать при его использовании:

  • сложность реализации и управления. На разработку логики разделения хранилища может уйти достаточно много времени и усилий, и на это есть причины, ведь ошибки при шардировании могут привести к повреждению или даже потере данных. Также система будет требовать мониторинга и корректировки, например, для того, чтобы нагрузка всегда была распределена равномерно. При этом не все СУБД (например, PostgreSQL или MySQL) имеют встроенные функции шардинга;
  • неравномерно распределенная нагрузка. Нагрузка не всегда распределяется равномерно между серверами, вследствие чего один или несколько серверов могут быть более загруженными, чем остальные. Тогда необходимо делать повторное разделение хранилища, что может привести к снижению общей производительности системы в этот момент;
  • сниженная производительность при выполнении запросов к нескольким шардам. Запросы, которые требуют обработки сразу нескольких сегментов, выполняются с задержками.

Важно сказать, что разделять хранилище нужно только в тех случаях, когда присутствует явная необходимость это делать (постоянно растущая нагрузка, наличие узких мест и так далее). 

Способы шардинга

Методов разделения хранилища существует несколько, каждый из них имеет свои достоинства и риски. Основные методы включают в себя:

  • сегментирование на основе диапазонов. В таком случае данные распределяются между шардами на основе диапазонов значений, и каждый шард отвечает за определенный диапазон. Например, в интернет-магазине есть заказы с номерами от 1 до 1000, тогда в одном шарде может храниться информация о заказах с номерами от 1 до 500, а во втором — от 501 до 1000. При использовании такого метода может возникнуть дисбаланс нагрузки, а плюсом, в свою очередь, является легкость реализации;
  • сегментирование на основе ключей, или хешей. При использовании данного метода в хеш-функцию передаются входные значения, в результате чего определяется, на каком сервере будет храниться эта информация. Например, хеш-функция применяется к идентификатору пользователя, а результат хеширования определяет, в каком шарде будет храниться информация об этом пользователе. Такой метод обеспечивает равномерную нагрузку на серверы, но затрудняет добавление новых серверов в систему;
  • сегментирование на основе каталогов. Этот способ подразумевает использование таблицы поиска, которая хранит информацию о том, в каком шарде должны находиться определенные данные. Например, если в интернет-магазине представлены брюки 4 цветов, то таблица поиска может содержать ключи для каждого цвета и распределять информацию по шардам в зависимости от цвета. Это не самый простой в реализации метод, но он придает системе гибкости и позволяет вносить изменения в схему сегментации, не замедляя работу оставшейся части системы;
  • динамическое сегментирование. В таком случае реализуется поведение, при котором система может автоматически расширяться при увеличении нагрузки или объема хранилища. Это гибкая система, которая позволяет равномерно распределять нагрузку и может применяться в случаях, когда рост нагрузки непредсказуем. При этом такую систему нужно постоянно контролировать, чтобы избежать различных проблем, например, снижения производительности.

Здесь приведены только основные способы сегментирования, в реальности существуют и другие методы, например, географическое сегментирование.

Примеры использования шардирования баз данных

Разделение базы данных может применяться в любой сфере, но есть несколько наиболее красочных примеров:

  • социальные сети, в особенности популярные, так как именно в них количество пользователей и информации постоянно растет, в связи с чем скорость работы без шардирования будет снижаться;
  • маркетплейсы / крупные интернет-магазины, которые хранят информацию о пользователях, заказах, товарах и так далее. Объем этой информации также постоянно растет и со временем время обработки запросов будет попросту недопустимым;
  • банки и финансовые организации тоже хранят информацию о клиентах (если речь идет о таких крупных банках, как, например, Сбер, то количество пользователей составляет миллионы людей), транзакциях, состоянии счетов. Для обеспечения непрерывной работы таких систем хранилище также иногда разделяют.

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

Заключение

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

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