0Pricing
SQL Academy · Урок

Запросы между шардами: сложная задача

Разберитесь, почему соединения и транзакции между шардами — самая сложная задача в распределённых базах данных, и изучите шаблоны, сводящие их к минимуму

«Запросы между шардами: сложная задача» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Стратегии шардинга: диапазон, хеш и каталог
  2. Запросы между шардами: сложная задача
  3. Citus и распределённый Postgres
  4. Когда НЕ стоит использовать шардинг
← Назад к SQL Academy