В каких сценариях применяется шардирование баз данных?

«В каких сценариях применяется шардирование баз данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Шардирование (горизонтальное партиционирование) используется для распределения данных одной логической таблицы по нескольким физическим серверам (шардам). Основные сценарии применения:

  1. Объем данных превышает возможности одного узла. Например, таблицы с сотнями миллионов строк или терабайтами данных (ленты социальных сетей, логи транзакций).
  2. Высокая нагрузка на запись (write-heavy). Один сервер становится узким местом (bottleneck). Шардирование распределяет нагрузку записи.
  3. Геораспределенные требования. Данные хранятся физически ближе к пользователям определенного региона (шардинг по локации).

Пример стратегии шардирования (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 СУБД, изначально спроектированных для распределенности.