Ответ
Шардирование (горизонтальное партиционирование) используется для распределения данных одной логической таблицы по нескольким физическим серверам (шардам). Основные сценарии применения:
- Объем данных превышает возможности одного узла. Например, таблицы с сотнями миллионов строк или терабайтами данных (ленты социальных сетей, логи транзакций).
- Высокая нагрузка на запись (write-heavy). Один сервер становится узким местом (bottleneck). Шардирование распределяет нагрузку записи.
- Геораспределенные требования. Данные хранятся физически ближе к пользователям определенного региона (шардинг по локации).
Пример стратегии шардирования (Java-псевдокод):
// Шардинг по ключу пользователя (user_id)
public class UserShardResolver {
private int totalShards = 10;
public String resolveShard(Long userId) {
// Простая стратегия на основе хэша или модуля
int shardNumber = Math.abs(userId.hashCode() % totalShards);
return "shard_db_" + shardNumber;
}
}
Плюсы: Горизонтальная масштабируемость, распределение нагрузки. Минусы и сложности:
- Затруднены операции
JOINмежду шардами. - Сложности с распределенными транзакциями (2PC).
- Необходимость ребалансировки данных при добавлении/удалении шардов.
- Усложнение архитектуры приложения (нужно знать, куда писать/читать).
Альтернативы для рассмотрения: Вертикальное масштабирование (более мощный сервер), репликация (для чтения), выбор NoSQL СУБД, изначально спроектированных для распределенности.