Что такое Database Sharding по сравнению с Read Replicas? Когда пора переносить часть данных на другой физический сервер?

## Database Sharding и Read Replicas: в чём разница?

Оба подхода решают проблему масштабирования базы данных, но делают это принципиально по-разному.

### Read Replicas (реплики чтения)

Read Replica — это полная копия основной базы данных (master/primary), которая принимает только запросы на чтение (SELECT). Запись по-прежнему идёт на основной узел, а изменения асинхронно или синхронно реплицируются на реплики.

**Когда помогает:**
— Нагрузка на чтение значительно превышает нагрузку на запись (типичное соотношение 80/20 или 90/10).
— Нужно снизить нагрузку на основной сервер без изменения схемы данных.
— Требуется географическое распределение (реплика в другом регионе для низкой латентности).

**Ограничения:**
— Не решает проблему объёма данных — вся БД по-прежнему хранится целиком на каждом узле.
— Запись масштабируется слабо — всё равно упирается в один master.
— Возможна задержка репликации (replication lag), что может приводить к чтению устаревших данных.

### Database Sharding (горизонтальное секционирование)

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

**Типичные стратегии шардинга:**
— **По диапазону (range-based):** user_id от 1 до 1 000 000 — шард 1, от 1 000 001 до 2 000 000 — шард 2.
— **По хэшу (hash-based):** hash(user_id) % N определяет номер шарда.
— **По географии или бизнес-логике:** данные европейских пользователей — в EU-шарде, американских — в US-шарде.

**Когда помогает:**
— Объём данных превышает возможности одного сервера (терабайты и выше).
— Нагрузка на запись слишком высока для одного узла.
— Нужна горизонтальная масштабируемость без ограничений.

**Ограничения:**
— Значительно усложняет архитектуру: JOIN между шардами дорог или невозможен.
— Транзакции между шардами требуют распределённых протоколов (2PC, Saga).
— Перебалансировка шардов при росте — сложная операция.

## Когда пора переносить данные на другой физический сервер?

Ориентируйтесь на следующие сигналы:

1. **CPU/RAM сервера постоянно загружены выше 70–80%** даже после оптимизации запросов и индексов.
2. **Время ответа на запросы растёт** несмотря на кэширование и оптимизацию.
3. **Объём данных приближается к физическому пределу** диска или начинает влиять на производительность (например, таблицы с сотнями миллионов строк без секционирования).
4. **IOPS диска исчерпан** — даже SSD не справляется с количеством операций ввода-вывода.
5. **Replication lag на репликах растёт** — значит, master перегружен записью.

**Рекомендуемая последовательность масштабирования:**
1. Оптимизация запросов и индексов.
2. Кэширование (Redis, Memcached).
3. Вертикальное масштабирование (upgrade сервера).
4. Добавление Read Replicas.
5. Партиционирование таблиц (на одном сервере).
6. Шардинг (разнесение на несколько серверов).

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


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.