Кейс: шардирование по created_at собрало весь трафик на одном шарде
Range-based sharding раскладывает данные по диапазонам ключа — например, по дате создания записи. Каждый шард отвечает за свой интервал времени, и это удобно для range-запросов: «заказы за последний месяц» читаются с одного-двух шардов, а не со всех сразу.
Проблема вылезает на write-пути. Если ключ шардирования — created_at, все новые записи попадают в шард с текущим диапазоном. Пока не наступит следующий интервал, весь write-трафик системы идёт в один шард, а остальные простаивают.
Симптом на графиках — asymmetric load: у одного шарда CPU и disk IO забиты, у соседних почти ноль. Ротация на новый шард по времени не размазывает нагрузку — просто переносит hot spot на следующий шард по расписанию.
Что спросят следом: как исправить, не теряя range-запросы. Рабочий вариант — составной ключ шардирования: hash от entity_id в паре с диапазоном по времени, где entity_id даёт равномерность записи, а диапазон по времени всё ещё позволяет ужимать range-сканы внутри шарда через вторичный индекс.
Consistent hashing по entity_id решает проблему hot shard на запись, но убивает дешёвые range-запросы по времени — этот трейд-офф стоит проговорить на собеседовании явно, а не выбирать один инструмент как универсальный.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки