Ответ
Шардинг (sharding) — это метод горизонтального масштабирования базы данных, при котором единый логический набор данных (например, таблица) разделяется на меньшие части (шарды), распределяемые по разным серверам (узлам). Каждый шард является независимой базой данных.
Основная цель: Распределить нагрузку (чтение/запись) и объем данных для повышения производительности и масштабируемости системы.
Ключевые стратегии шардинга:
- Шардинг по диапазону (Range-based): Данные распределяются по диапазонам ключа (например,
user_idот 1 до 1000000 на шарде A, от 1000001 до 2000000 на шарде B). - Шардинг по хэшу (Hash-based): Хэш-функция от ключа шардирования (например,
user_id) определяет номер шарда:shard_id = hash(user_id) % total_shards. - Шардинг по справочнику (Directory-based): Используется отдельная lookup-таблица, которая хранит соответствие ключа и шарда.
Пример логики выбора шарда (на псевдокоде):
-- Предположим, 4 шарда, шардирование по user_id
SELECT * FROM users_shard_{user_id % 4} WHERE user_id = 12345;
// Пример на Java
int userId = 12345;
int totalShards = 4;
int shardNumber = userId % totalShards; // = 1
String shardConnectionString = "jdbc:mysql://shard-" + shardNumber + ".db:3306/db";
// Подключаемся к shard-1 и выполняем запрос
Преимущества:
- Горизонтальное масштабирование: Возможность добавлять серверы для увеличения пропускной способности и объема.
- Повышение производительности: Нагрузка распределяется между несколькими узлами.
- Изоляция сбоев: Проблема на одном шарде не выводит из строя всю систему.
Недостатки и сложности:
- Сложные JOIN-запросы: Запросы, требующие данных из нескольких шардов, становятся нетривиальными и медленными.
- Ребалансировка: Добавление или удаление шардов требует перемещения данных (решаемо через consistent hashing).
- Усложнение архитектуры: Требуется механизм маршрутизации запросов (шард-ключ) и управления транзакциями.
Используется в: Крупные распределенные системы (социальные сети, маркетплейсы, игры).