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

Что такое шардинг базы данных?

2.2 Middle🔥 231 комментариев
#Базы данных и SQL

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

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

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

Что такое шардинг базы данных?

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

Основная идея

Вместо того чтобы хранить все данные в одной большой БД, которая становится узким местом, мы разделяем данные на несколько меньших БД:

Одна большая БД (узкое место):
┌─────────────────────────────────┐
│  Все пользователи (1 млн)       │
│  Все заказы (10 млн)            │
│  Все события (100 млн)          │
└─────────────────────────────────┘
        ↓ ↓ ↓ (перегруженная)

Шардированная БД:
Шард 1          Шард 2          Шард 3
┌──────────┐  ┌──────────┐  ┌──────────┐
│Users     │  │Users     │  │Users     │
│1-333K    │  │334K-667K │  │668K-1M   │
│Orders    │  │Orders    │  │Orders    │
│1-3.3M    │  │3.3M-6.6M │  │6.6M-10M  │
└──────────┘  └──────────┘  └──────────┘

Ключевые концепции

1. Шардовый ключ (Shard Key)

Это значение, по которому определяется, в какой шард поместить данные:

public class UserRepository {
    private final Map<Integer, Database> shards;
    private final int shardCount = 10;
    
    public void saveUser(User user) {
        // user_id служит шардовым ключом
        int shardId = user.getId() % shardCount;
        shards.get(shardId).save(user);
    }
    
    public User findUser(int userId) {
        int shardId = userId % shardCount;
        return shards.get(shardId).findById(userId);
    }
}

2. Распределение данных

Существуют несколько стратегий выбора шардового ключа:

  • Range-based — диапазон значений (user_id 1-100K в шард 1)
  • Hash-based — хеширование значения (hashCode(user_id) % shard_count)
  • Directory-based — таблица соответствия (lookup table)
  • Geographic — географическое распределение (регион пользователя)

Типы шардинга

1. Horizontal Partitioning (Sharding)

// Распределение строк между шардами
// Таблица users разделена по user_id
Sharding for user_id = 100: Database shard_2
Sharding for user_id = 500: Database shard_5

2. Directory-Based Sharding

public class DirectoryShardRepository {
    private ShardDirectory directory; // отображение ключ -> шард
    
    public void saveUser(User user) {
        int shardId = directory.getShardId(user.getId());
        shards.get(shardId).save(user);
    }
}

Преимущества шардинга

  1. Масштабируемость — можно добавлять новые шарды по мере роста данных
  2. Производительность — каждый шард обрабатывает меньше данных
  3. Доступность — отказ одного шарда не влияет на остальные
  4. Параллелизм — запросы могут обрабатываться параллельно на разных шардах

Недостатки и сложности

// Проблема 1: Транзакции между шардами
public void transferMoney(User from, User to, double amount) {
    // from и to могут быть в разных шардах
    // ACID-гарантии нарушаются!
    int fromShard = from.getId() % shardCount;
    int toShard = to.getId() % shardCount;
    
    if (fromShard != toShard) {
        // Сложно обеспечить consistency
    }
}

// Проблема 2: Присоединение (JOIN) данных между шардами
// SELECT u.name, COUNT(o.id) FROM users u JOIN orders o ON u.id = o.user_id
// Требует fetch из нескольких шардов и join в приложении

// Проблема 3: Пересбалансировка
// При добавлении нового шарда нужно перемешать данные
public void rebalanceShards(int newShardCount) {
    for (Record record : allRecords) {
        int oldShard = record.key % oldShardCount;
        int newShard = record.key % newShardCount;
        if (oldShard != newShard) {
            moveToNewShard(record, newShard);
        }
    }
}

Когда использовать шардинг

  • Когда БД не умещается в одном сервере
  • Когда нужна высокая пропускная способность (QPS)
  • Когда geografic распределение критично
  • Когда можно изолировать данные по шардовому ключу

Примеры систем с шардингом

  • MongoDB — встроенная поддержка шардинга
  • Cassandra — распределённая с partition keys
  • YouTube — шардирование по video_id
  • Twitter — sharding по tweet_id

Шардинг — это одна из самых сложных техник в распределённых системах и требует тщательного планирования архитектуры приложения.