open atlas
↑ К треку
Базы данных DB · 07 · 05

Режим отказа hot shard: обнаружение, изоляция и долгосрочная политика

Хеш-шардирование порождает горячие шарды при скошенных распределениях ключей. isolate_tenant_to_new_shard() Citus — продакшн-смягчение; мониторинг перекоса и политика тиерирования клиентов — долгосрочное исправление.

DB Middle ◷ 14 min
Уровень
ОсновыJuniorMiddleSenior

Кластер Citus имеет 32 шарда на 4 воркерах. Срабатывает алерт на перекос: шард 102008 при 94% CPU, остальные 31 шардов в среднем при 18%. Служба поддержки получает жалобы на задержки от одного корпоративного клиента. Весь кластер работает с мощностью одного шарда.

Почему хеш-шардирование не предотвращает горячие шарды

Хеш-шардирование (shard = hash(tenant_id) mod N) распределяет равномерно при равномерном распределении ключей. Реальные клиенты распределены по степенному закону: один-два клиента генерируют 60–80% трафика; остальные — длинный хвост.

Хеш-маршрутизация назначает каждого клиента ровно на один шард. Клиент, генерирующий 60% трафика, означает, что их шард работает при 60% мощности кластера, пока все остальные шарды почти простаивают. Кластер фактически является одношардовым для нагрузки этого клиента.

Проблема структурная, а не баг: хеш-шардирование было правильным выбором (равномерное распределение по хвосту), но конструкция неполная без политики изоляции выбросов.

Обнаружение: что мониторить

СигналКак измеритьПорог алерта
Перекос размера шардовSELECT shardid, table_size FROM citus_shards ORDER BY table_size DESCmax/median > 1.5×
CPU на шардPostgres exporter на воркер + Prometheusлюбой воркер > 70% устойчиво 5 мин
Нагрузка запросов на клиентаpg_stat_statements на координаторе, агрегировано по метке tenant_idодин клиент > 5% total_exec_time кластера
P99 задержка клиентаAPM на endpoint клиентаP99 > 3× медианы кластера

Опережающие индикаторы — перекос размера шардов и рост частоты запросов на клиента — оба видны за недели до срабатывания CPU-алерта. Команды, мониторирующие недельные тренды, предупреждают инциденты с горячими шардами; команды, мониторирующие только CPU, реагируют на них. Когда поднимаешь новый кластер Citus, эти четыре сигнала должны быть подключены к алертингу в первый же день — ещё до подписания первого корпоративного клиента.

Немедленное смягчение: изоляция клиента в Citus

Когда виновник — один клиент, переместите его на выделенный шард:

-- Переместить клиента 9821 на его собственный шард (онлайн, без downtime)
SELECT isolate_tenant_to_new_shard('orders', 9821, 'CASCADE');

Что делает Citus:

  1. Создаёт новый шард.
  2. Устанавливает логическую репликацию со старого шарда на новый, копируя только строки клиента 9821.
  3. После синхронизации ненадолго приостанавливает записи к клиенту 9821 (суб-секунда), переключает указатель метаданных.
  4. Возобновляет работу. Старый шард больше не содержит данных клиента 9821.

Общее время: минуты-часы в зависимости от объёма данных клиента (~10–100 МБ/с пропускная способность). Пауза записи — суб-секундная. CPU исходного шарда сразу падает до медианы кластера после переключения.

Для шардирования на уровне приложения без Citus: эквивалент — перемаппирование в directory — обновить карту шардов для этого клиента на новый Postgres, двойная запись во время перехода, переключение чтений. Для этого нужны готовые инструменты; команды без них тратят дни на экстренную ситуацию.

Долгосрочная политика: автоматизация, а не реакция

Один инцидент с горячим шардом допустим. Два — сбой процесса. Долгосрочное исправление — тиерированная политика:

  1. Алерт на перекос (max/median > 1.5×) и нагрузку на клиента (> 5% кластера). Это опережающие индикаторы.
  2. Автоматизировать изоляцию для клиентов, пересекающих порог 5%: фоновая задача вызывает isolate_tenant_to_new_shard. Без участия человека для рутинных случаев.
  3. Эскалировать клиентов выше 20% на выделенный воркер; выше 50% — на выделенный кластер + разговор с клиентом.
  4. Предварительно изолировать новые корпоративные аккаунты выше порогового размера при онбординге — не ждать скачка трафика.
  5. Тренировать runbook ежеквартально на стейджинге, чтобы дежурные инженеры могли изолировать клиента менее чем за 15 минут.

Вместе эти пять шагов означают: ни одному инженеру не нужно принимать решение под давлением продакшна — политика решает за него. Без шага 2 (автоматизация) тебя будут будить в 3 ночи снова и снова; без шага 4 (предварительная изоляция) онбординг нового корпоративного клиента превращается в бомбу замедленного действия.

Почему это работает

Почему Citus использует логическую репликацию для изоляции клиента вместо физической копии? Логическая репликация копирует изменения на уровне строк (INSERT/UPDATE/DELETE) с источника на получателя избирательно — она может фильтровать, чтобы копировать только строки где tenant_id = 9821. Физическая репликация копирует каждую страницу исходного шарда, включая строки других клиентов. Для изоляции на клиента логическая репликация — единственный практичный вариант: она перемещает ровно нужные данные без дублирования строк других клиентов и остаётся синхронизированной до момента переключения без окна только-для-чтения.

Викторина

Один шард в кластере Citus при 94% CPU, пока все остальные в среднем при 18%. pg_stat_statements показывает, что один клиент генерирует 62% всего времени запросов на этом шарде. Каково правильное немедленное действие?

Расставь шаги по порядку

Упорядочьте шаги реагирования на горячий шард от обнаружения до долгосрочного исправления:

  1. 1 Срабатывает алерт: CPU шарда > 70% устойчиво или max/median перекос > 1.5×
  2. 2 Определить доминирующего клиента на горячем шарде через pg_stat_statements агрегированный по tenant_id
  3. 3 Вызвать isolate_tenant_to_new_shard для этого клиента; мониторить лаг репликации до переключения
  4. 4 Убедиться, что CPU исходного шарда падает до медианы кластера после переключения
  5. 5 Постмортем: рос ли этот клиент неделями? Обновить пороги мониторинга
  6. 6 Обновить политику изоляции для авто-изоляции клиентов выше 5% нагрузки кластера до следующего инцидента
Вспомните перед уходом
  1. 01
    Почему хеш-шардирование не предотвращает горячие шарды в мультиарендном B2B SaaS?
  2. 02
    Опишите, что делает isolate_tenant_to_new_shard в Citus и каков его профиль downtime.
  3. 03
    Каковы три сигнала мониторинга, улавливающие перекос горячего шарда до появления видимой клиентам задержки?
Итог

Режим отказа hot shard — структурное следствие степенного распределения клиентов на хеш-шардировании: шард одного клиента насыщается, пока другие простаивают. Обнаружение требует проактивного мониторинга перекоса размера шардов (отношение max/median) и нагрузки запросов на клиента — оба видны за недели до срабатывания CPU-алерта. Немедленное смягчение — isolate_tenant_to_new_shard Citus, перемещающий данные клиента-выброса на выделенный шард через логическую репликацию (построчная репликация INSERT/UPDATE/DELETE) с суб-секундной паузой записи. Долгосрочное исправление — тиерированная политика автоматизации: алерт на пороги перекоса, автоматическая изоляция клиентов выше 5% нагрузки кластера, эскалация очень крупных клиентов на выделенные воркеры или кластеры. Инциденты с горячими шардами, удивляющие команду — сбой процесса; команды с политикой воспринимают их как плановые изоляции по расписанию. Теперь, когда увидишь на дашборде один воркер с CPU в разы выше остальных, ты знаешь диагноз (степенной перекос), команду (isolate_tenant_to_new_shard) и долгосрочное исправление (политика автоматизации).

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 5 завершено
Связанные уроки
встречается в287

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.