# Масштабирование БД

## Вертикальное масштабирование <a href="#rt-0" id="rt-0"></a>

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

## Горизонтальное масштабирование <a href="#rt-1" id="rt-1"></a>

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

<table data-full-width="true"><thead><tr><th>Область сравнения</th><th>Репликация</th><th>Партицирование</th><th>Шардирование</th></tr></thead><tbody><tr><td>Основная функция</td><td>Повышение стабильности</td><td>Повышение управляемости</td><td>Ускорение обработки</td></tr><tr><td>Метод</td><td>Копирование между серверами</td><td>Разбиение по функциональности</td><td>Разбиение по объему</td></tr><tr><td>Распределение</td><td>По ведущим и ведомым серверам</td><td>Потоковое</td><td>Физическое</td></tr></tbody></table>

### Репликация <a href="#rt-2" id="rt-2"></a>

{% hint style="info" %}
**Репликация** — это синхронное или асинхронное копирование данных между несколькими серверами. Ведущие серверы часто называют мастерами (master), а ведомые серверы — слэйвами (slave).&#x20;
{% endhint %}

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

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

*Например, создание нескольких дополнительных slave‑серверов позволяет снять с основного сервера нагрузку и повысить общую производительность системы, а также можно организовать слэйвы под конкретные ресурсоёмкие задачи и таким образом, например, упростить составление серьёзных аналитических отчётов — используемый для этих целей slave может быть нагружен на 100%, но на работу других пользователей приложения это не повлияет.*

### Партицирование (секционирование) <a href="#rt-3" id="rt-3"></a>

{% hint style="info" %}
**Партиционирование** — это разбиение таблиц, содержащих большое количество записей, на логические части по неким выбранным администратором критериям.&#x20;
{% endhint %}

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

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

### Шардирование (шардинг/сегментирование) <a href="#rt-4" id="rt-4"></a>

{% hint style="info" %}
**Шардинг** — это прием, который позволяет распределять данные между разными физическими серверами.&#x20;
{% endhint %}

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

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

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

Источники:&#x20;

* <https://simpleone.ru/blog/masshtabirovanie-baz-dannyh/>
* <https://web-creator.ru/articles/partitioning_replication_sharding>
* <https://cloud.yandex.ru/ru/docs/glossary/sharding>
