awesome-everything EN
↑ Обратно к восхождению

Базы данных

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

Суть Хеш-шардирование порождает горячие шарды при скошенных распределениях ключей. isolate_tenant_to_new_shard() Citus — продакшн-смягчение; мониторинг перекоса и политика тиерирования клиентов — долгосрочное исправление.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 14 min

Кластер 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

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

-- Переместить клиента 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 минут.
Почему это работает

Почему 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, перемещающий данные клиента-выброса на выделенный шард через логическую репликацию с суб-секундной паузой записи. Долгосрочное исправление — тиерированная политика автоматизации: алерт на пороги перекоса, автоматическая изоляция клиентов выше 5% нагрузки кластера, эскалация очень крупных клиентов на выделенные воркеры или кластеры. Инциденты с горячими шардами, удивляющие команду — сбой процесса; команды с политикой воспринимают их как плановые изоляции по расписанию.

Связанные уроки
встречается в258
Продолжить восхождение ↑Schema-based шардирование и альтернативы мультиарендности
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.