Перейти к основному содержимому

Масштабирование БД: Партиционирование, Шардирование и Репликация

Максимально кратко

  • Партиционирование — разделение БД на части в рамках одного сервера. Может быть вертикальным (по столбцам) и горизонтальным (по строкам).
  • Шардирование — разделение БД на части по разным серверам. Может быть только горизонтальным (по строкам).
  • Репликация — копирование одних и тех же данных между разными серверами.

Партиционирование

Партиционирование — разделение большой таблицы на несколько частей. Все части хранятся на одном сервере. Бывает горизонтальным и вертикальным.

1. Горизонтальное партиционирование

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

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

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

Пример: разделение таблицы заказов по дате заказа, так что каждая подтаблица содержит заказы за определенный месяц или год.

2. Вертикальное партиционирование

Данные разбиваются на несколько отдельных таблиц по столбцам. Каждая такая таблица содержит часть столбцов и все связанные с ними строки данных.

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

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

Пример: разделение таблицы пользователей на две подтаблицы, одна из которых содержит основную информацию о пользователях (имя, email, пароль), а другая — дополнительную информацию (адрес, телефон, хобби).

Шардирование

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

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

Методы шардирования

  1. Хешированное шардирование

    • Данные разбиваются на шарды на основе хеш-функции, которая принимает входные данные и возвращает хеш-значение. Это значение определяет, в какой шард будет помещена каждая запись данных.
    • Метод позволяет достичь высокой производительности и отсутствия единой точки отказа, однако усложняет поиск данных.
  2. Диапазонное шардирование

    • Данные разбиваются на шарды на основе диапазона значений. Значения могут присваиваться с помощью ключей и других атрибутов.
    • Метод прост в реализации и позволяет быстрее находить информацию, чем при хешировании, однако может привести к несбалансированности базы.
  3. Круговое шардирование

    • Шарды упорядочиваются в виде кольца и каждый из них ответственен за определенный диапазон значений. Запросы на данные маршрутизируются в соответствии с позицией шарда в кольце.
    • Запросы распределяются равномерно, но при добавлении и удалении шардов требуется перераспределение данных.
  4. Динамическое шардирование

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

Репликация

Репликация — копирование данных между несколькими серверами. При использовании такого метода выделяют два типа серверов: master и slave. Мастер используется для записи или изменения информации, слейвы — для копирования информации с мастера и её чтения.

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

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

Недостатки:

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

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

Критерий Партиционирование Шардирование Репликация
Преимущества Уменьшает объем данных, которые нужно обрабатывать при выполнении запросов Повышает отказоустойчивость и масштабируемость системы, так как каждый сервер отвечает за свой шар и не зависит от других Уменьшает нагрузку на главную базу данных, так как подчинённые базы данных могут обслуживать запросы на чтение
Ускоряет выполнение запросов, которые затрагивают только определённую часть данных Распределяет нагрузку на запись и чтение данных между несколькими серверами Обеспечивает согласованность данных, так как все обновления идут от главной базы данных
Упрощает управление и обслуживание данных, так как каждая подтаблица может иметь свои настройки и индексы Позволяет добавлять новые серверы в кластер без существенных изменений в архитектуре базы данных
Недостатки Не повышает отказоустойчивость и масштабируемость системы, так как все данные зависят от одного сервера Может увеличить сложность и время выполнения запросов, которые затрагивают несколько шардов Увеличивает сложность и затраты на синхронизацию данных между главной и подчинёнными базами данных
Может усложнить проектирование и написание запросов, так как нужно учитывать структуру подтаблиц и соединять их при необходимости Может привести к несогласованности данных, если один из серверов отказывается или задерживает обновление данных Может привести к задержке в распространении обновлений данных на подчинённые базы данных
Может привести к дублированию данных, если некоторые столбцы или строки нужны в нескольких подтаблицах Требует дополнительных ресурсов и инструментов для управления и мониторинга кластера Не позволяет обновлять данные на подчинённых базах данных
Когда лучше подходит Когда данные можно логически разделить на части по какому-то критерию, и запросы обычно затрагивают только одну или несколько частей. Например, если данные о пользователях разделены по годам, и запросы обычно фильтруются по году. Когда данные имеют большой объём и высокую нагрузку, и отдельные сервера обрабатывают часть данных. Например, данные о пользователях разделены по регионам, и запросы исходят из конкретного региона. Когда данные обновляются только на главной базе, а подчинённые базы данных используются для чтения. Например, для аналитических нагрузок, где важно сохранять доступ к данным даже в случае сбоя главной базы.
Когда данные имеют разную степень важности или актуальности, и часть данных можно архивировать или удалить. Например, неактивные пользователи могут быть перенесены в холодное хранилище.

Подборка материалов

Статьи

  1. Масштабирование БД в высоконагруженных системах
  2. Виды масштабирования баз данных
  3. Масштабирование базы данных через шардирование и партиционирование (видео доклада тут)
  4. Про шардирование от Yandex.Cloud (здесь вертикальное шардирование = вертикальное партиционирование)
  5. Руководство по паттернам масштабирования базы данных
  6. База по шардированию базы
  7. Распределенный SQL: альтернатива шардированию баз данных
  8. Sharding – patterns and antipatterns
  9. Как масштабироваться с 1 до 100 000 пользователей
  10. 220 платежей в секунду: выдержать нельзя упасть
  11. Шардирование в Greenplum
  12. Шардирование vs репликация: масштабируем БД
  13. Распределение и масштабирование слоя хранения данных — перевод главы 3 книги "Архитектура распределённых транзакционных приложений"
  14. Руководство по паттернам масштабирования базы данных

Видео

  1. System Design - теория шардирования | Как масштабировать базы данных
  2. Принципы шардирования. Горизонтальное и вертикальное шардирование // Курс «Highload Architect»
  3. Шардирование в HighLoad-системах // Демо-занятие курса «Highload Architect»
  4. Highload 6. Базы данных. Репликация. Шардинг
  5. Что такое ШАРДИНГ и РЕПЛИКАЦИЯ за 9 минут
  6. Масштабирование БД. Базы данных
  7. Архитектура масштабирования: ускоряем обработку и повышаем доступность данных. Сергей Харламов
  8. Основы построения highload-систем: 7 приёмов масштабирования баз данных · АняКрх