Запросы между шардами: сложная задача
Разберитесь, почему соединения и транзакции между шардами — самая сложная задача в распределённых базах данных, и изучите шаблоны, сводящие их к минимуму
«Запросы между шардами: сложная задача» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Цена шардирования
Шардирование масштабирует запись и увеличивает емкость, но усложняет запросы, охватывающие несколько шардов: каждый запрос между шардами превращается в веерную отправку.
Запросы к одному шарду просты
Если ключ шарда указан в предложении WHERE, маршрутизатор отправляет один запрос на один шард:
-- shard_id = hash(user_id) % N
SELECT * FROM orders WHERE user_id = 42;
-- Router computes shard, sends one query, gets one result.Запросы с веерной отправкой
Без ключа шарда маршрутизатор обращается к каждому шарду и объединяет результаты:
-- WHERE status = 'paid' — no user_id
SELECT * FROM orders WHERE status = 'paid' ORDER BY created_at DESC LIMIT 100;
-- Must query all N shards, merge results, sort, take top 100.Агрегация с веерной отправкой
Для COUNT/SUM/AVG получите частичные результаты с каждого шарда, а затем объедините их в маршрутизаторе или приложении:
-- On each shard:
SELECT COUNT(*), SUM(total) FROM orders;
-- Aggregator:
final_count = SUM(counts), final_sum = SUM(sums)
-- AVG is trickier — need SUM and COUNT, can't average averages.JOIN между шардами
Если обе стороны разделены по одному и тому же ключу (совместно размещены), JOIN выполняется локально на шарде. В противном случае при большом масштабе это практически невозможно.
Справочные таблицы (реплицируются везде)
Небольшие таблицы поиска реплицируются на каждый шард, поэтому JOIN с ними остается локальным. В Citus они называются «справочными таблицами».
Как избегать шаблонов между шардами
Приемы проектирования схемы:
- Денормализуйте данные — дублируйте данные родительской записи в шарде вместе с дочерней записью
- Используйте ключ шарда везде, даже когда это кажется «ненужным»
- Предварительно вычисляйте отчеты в отдельной аналитической базе данных
Пагинация между шардами
OFFSET 1000 LIMIT 10 на множестве шардов работает ужасно: каждый шард должен подготовить 1010 строк. Вместо этого используйте пагинацию по ключу.
Распределенные транзакции
Двухфазная фиксация (2PC) координирует атомарную фиксацию между шардами. Она медленная и ненадежна при сетевом разделении. На практике проектируйте систему с использованием шаблонов «саги»:
// Saga pattern (conceptual):
// 1. Local TX on shard A: mark as pending, log
// 2. RPC to shard B: do its part
// 3. Local TX on shard A: mark as committed
// 4. On failure: compensating transactionsПерегруженные шарды
Популярный пользователь или вирусный продукт: сосредоточенный на одном шарде трафик разрушает всю идею масштабирования. Обнаруживайте такие случаи и разделяйте шард на части или переносите данные.
Внешние ключи между шардами
Внешние ключи RDBMS не распространяются на несколько шардов. Обеспечивайте ссылочную целостность в приложении или принимайте согласованность в конечном счете для связей между шардами.
Итоги
Шардирование переносит сложность с задачи «масштабировать запись» на задачу «формировать запросы так, чтобы они оставались локальными для шарда».
- Запросы к одному шарду выполняются быстро
- Веерная отправка медленная
- Денормализуйте данные, чтобы сохранить локальность операций
- Справочные таблицы для общих измерений
- Саги вместо 2PC
Быстрая проверка
Почему SELECT без ключа шарда в предложении WHERE дорого выполнять в шардированной базе данных?
Часто задаваемые вопросы
Урок «Запросы между шардами: сложная задача» бесплатный?
Да — полный текст урока «Запросы между шардами: сложная задача» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Запросы между шардами: сложная задача»?
Разберитесь, почему соединения и транзакции между шардами — самая сложная задача в распределённых базах данных, и изучите шаблоны, сводящие их к минимуму Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Запросы между шардами: сложная задача»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Стратегии шардинга: диапазон, хеш и каталог
- Запросы между шардами: сложная задача
- Citus и распределённый Postgres
- Когда НЕ стоит использовать шардинг