← Назад к вопросам

Как работает шардирование?

2.7 Senior🔥 151 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Шардирование в базах данных

Определение

Шардирование (sharding) — это горизонтальная техника масштабирования, при которой данные распределяются по нескольким независимым базам данных (шардам) на основе какого-либо ключа разбиения (shard key). Каждый шард содержит подмножество полных данных и может размещаться на отдельном сервере.

Как работает шардирование

1. Выбор ключа шардирования

Первый и критический шаг — выбрать правильный shard key (например, user_id, customer_id, region). Это поле должно:

  • Равномерно распределять данные
  • Быть неизменяемым (стабильным)
  • Частым в query conditions

2. Функция хеширования

Данные распределяются по формуле:

shard_id = hash(shard_key) % number_of_shards

Например, для 4 шардов и user_id=15:

  • shard_id = hash(15) % 4 = 3
  • Данные пользователя идут в Shard 3

3. Маршрутизация запросов

Приложение должно знать логику распределения:

public class ShardRouter {
    private static final int NUM_SHARDS = 4;
    
    public int getShardId(long userId) {
        return Math.abs(userId.hashCode() % NUM_SHARDS);
    }
    
    public Database getShardDatabase(long userId) {
        int shardId = getShardId(userId);
        return shardDatabases.get(shardId);
    }
}

4. Изоляция данных

Каждый шард содержит независимую копию данных для своего подмножества:

  • Shard 0: users 0, 4, 8, 12...
  • Shard 1: users 1, 5, 9, 13...
  • Shard 2: users 2, 6, 10, 14...
  • Shard 3: users 3, 7, 11, 15...

Архитектура шардирования

Приложение
    |
    v
  ShardRouter (вычисляет shard_id по ключу)
    |
    +----> Shard 0 (DB Server 1)
    +----> Shard 1 (DB Server 2)
    +----> Shard 2 (DB Server 3)
    +----> Shard 3 (DB Server 4)

Типы шардирования

Range-based Sharding

Данные разделяются по диапазонам значений:

Shard 0: user_id 1-1000
Shard 1: user_id 1001-2000
Shard 2: user_id 2001-3000

Проблема: может привести к неравномерному распределению.

Hash-based Sharding

Применяется хеш-функция для равномерного распределения (самый популярный метод).

Directory-based Sharding

Ведется отдельная таблица соответствий (shard key → shard id). Гибко, но требует доп. lookups.

Пример с Java и базой данных

public class UserShardingService {
    private final Map<Integer, DataSource> shards;
    private static final int NUM_SHARDS = 4;
    
    public User getUserById(long userId) {
        int shardId = getShardId(userId);
        DataSource shard = shards.get(shardId);
        
        try (Connection conn = shard.getConnection()) {
            PreparedStatement stmt = conn.prepareStatement(
                "SELECT * FROM users WHERE id = ?"
            );
            stmt.setLong(1, userId);
            // выполнение запроса в конкретном шарде
        }
    }
    
    private int getShardId(long userId) {
        return Math.abs((int)(userId % NUM_SHARDS));
    }
}

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

  • Масштабируемость: линейный рост производительности
  • Параллелизм: запросы к разным шардам выполняются одновременно
  • Локальность данных: меньше нагрузка на каждый сервер
  • Независимость: шарды могут иметь разную конфигурацию

Недостатки

  • Сложность: требует логики маршрутизации в приложении
  • Перекрёстные запросы: сложные запросы к данным из разных шардов
  • Перебалансировка: добавление нового шарда требует миграции данных (горячая тема: consistent hashing)
  • Трансакции: ACID сложнее на уровне нескольких шардов
  • Join операции: невозможны напрямую между шардами

Случаи использования

Шардирование применяется для очень больших датасетов:

  • Facebook, Twitter (мiliards записей)
  • Сервисы с миллионами пользователей
  • Когда однопоточное маштабирование исчерпано

Заключение

Шардирование — мощный инструмент горизонтального масштабирования, но требует тщательного проектирования ключей и стратегии распределения. Это стоит применять только когда вертикальное масштабирование больше не помогает.

Как работает шардирование? | PrepBro