Стратегии шардинга: диапазон, хеш и каталог
Сравните шардинг по диапазону, хешу и на основе каталога и выберите ключ шарда, который равномерно распределяет нагрузку и остаётся стабильным
«Стратегии шардинга: диапазон, хеш и каталог» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Что такое шардирование
Разделение одной логической базы данных между несколькими физическими серверами («шардами»), каждый из которых хранит часть данных. Это делают, когда один сервер больше не справляется с рабочей нагрузкой.
Шардирование ≠ репликация
- Репликация — одинаковые данные на нескольких серверах (для HA и масштабирования чтения)
- Шардирование — разные данные на разных серверах (для масштабирования записи и увеличения емкости)
Часто применяют оба подхода: каждый шард реплицируется для HA.
Три стратегии шардирования
- Диапазонная — шардирование по диапазонам значений (идентификаторы 1–1M на шарде A, 1M–2M на шарде B)
- Хеширование — хеширование ключа шарда и вычисление по модулю N
- Каталог — отдельная таблица сопоставляет ключ и шард
Диапазонное шардирование
Простой подход, который хорошо работает для временных рядов и упорядоченных идентификаторов. Риск: перегруженные шарды, если весь трафик приходится на недавно добавленные данные.
-- Conceptually:
-- Shard A: user_id 1 - 1,000,000
-- Shard B: user_id 1,000,001 - 2,000,000
-- Shard C: user_id 2,000,001 - 3,000,000Шардирование хешированием
По умолчанию обеспечивает равномерное распределение. Добавлять шарды сложно: перераспределение шардов перемещает все ключи:
-- shard_id = hash(user_id) % N
-- N=4: any user_id evenly distributed across 4 shardsШардирование через каталог
Таблица поиска сопоставляет каждый ключ с его шардом:
CREATE TABLE shard_routing (
user_id BIGINT PRIMARY KEY,
shard_id INT NOT NULL
);
-- Looking up a user costs a directory query first; cache it.Согласованное хеширование
Хеширование по модулю плохо переносит добавление шардов. Согласованное хеширование сводит к минимуму количество ключей, которые нужно переместить:
-- Each shard owns a ring segment.
-- Adding a new shard moves only ~1/N of the keys.Выбор ключа шарда
Ключ шарда определяет все. Хорошие ключи шарда:
- Распределяют данные равномерно
- Присутствуют в большинстве запросов (избегают веерной отправки запросов на разные шарды)
- Неизменяемы или изменяются редко
<p>Common picks: user_id, tenant_id, customer_id. Avoid: timestamps for write-heavy workloads (creates hot shards).</p>По одному арендатору на шард
Мультитенантный SaaS: каждый арендатор находится на выделенном шарде. Структуру легко понимать, а шумных арендаторов — изолировать.
Схема, поддерживающая перераспределение шардов
Проектируйте систему с учетом будущего перераспределения шардов:
- Используйте виртуальные шарды (например, 1024 логических, сопоставленных с физическими)
- Упростите перенос логического шарда на другой физический сервер
- Избегайте кода приложения, в котором жестко задано количество шардов
Запросы между шардами
Самая сложная проблема. JOIN и отчеты между шардами требуют веерной отправки запросов и логики агрегации в приложении. Это будет рассмотрено в следующем уроке.
Транзакции между шардами
Для атомарных транзакций между шардами нужны двухфазная фиксация (2PC) или саги. Типичный совет: проектируйте систему так, чтобы транзакции оставались в пределах одного шарда.
Итоги
Есть три стратегии; выбирайте подходящую по характеру трафика.
- Диапазонная — простая, но есть риск перегрузки шарда
- Хеширование — равномерное, но негибкое
- Каталог — гибкий, но добавляет задержку
- Согласованное хеширование обеспечивает плавное перераспределение шардов
Быстрая проверка
Вы разделили таблицу пользователей по хешу user_id. Затем количество шардов увеличилось с 4 до 5. Сколько ключей придется переместить?
Часто задаваемые вопросы
Урок «Стратегии шардинга: диапазон, хеш и каталог» бесплатный?
Да — полный текст урока «Стратегии шардинга: диапазон, хеш и каталог» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Стратегии шардинга: диапазон, хеш и каталог»?
Сравните шардинг по диапазону, хешу и на основе каталога и выберите ключ шарда, который равномерно распределяет нагрузку и остаётся стабильным Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Стратегии шардинга: диапазон, хеш и каталог»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Стратегии шардинга: диапазон, хеш и каталог
- Запросы между шардами: сложная задача
- Citus и распределённый Postgres
- Когда НЕ стоит использовать шардинг