Динамическое разделение широки... Заметка

Динамическое разделение широких разделов в Cassandra для рабочих нагрузок временных рядов

Абстракция TimeSeries от Netflix обрабатывает и запрашивает петабайты временных данных событий с миллисекундной задержкой, используя Apache Cassandra в качестве хранилища. Широкие разделы, где один раздел накапливает большой объем событий с течением времени, представляют собой серьезную проблему для рабочих нагрузок TimeSeries. Это приводит к высоким задержкам чтения, тайм-аутам, увеличению загрузки ЦП и паузам сборки мусора в кластерах Cassandra. Для решения этой проблемы данные TimeSeries разделяются на дискретные временные блоки, создавая управляемые сегменты.Первоначальная стратегия предоставления ресурсов полагалась на указанные пользователем характеристики рабочей нагрузки и симуляции Монте-Карло для определения оптимальной инфраструктуры и конфигураций разделов. Однако этот подход оказался недостаточным, когда рабочие нагрузки были неизвестны, неточно оценены, менялись со временем или содержали выбросы данных. Для автоматизации корректировок был введен фоновый рабочий процесс для мониторинга гистограмм разделов и динамического перераспределения будущих временных срезов на основе наблюдаемой плотности данных. Эта стратегия перераспределения временных срезов эффективно снижает задержки чтения и тайм-ауты, когда большинство данных демонстрирует схожее поведение широких разделов.Однако эта стратегия не решает проблемы, когда только небольшой процент идентификаторов в таблице является широким. Для таких случаев, а также когда вызывающие стороны требуют все данные, даже при повышенных задержках, была разработана динамическая разбивка по идентификаторам. Этот асинхронный конвейер обнаруживает широкие разделы во время операций чтения и прозрачно разбивает их на оптимальные размеры. Процесс включает обнаружение, планирование и разбиение, а также обслуживание чтений путем перенаправления запросов на разбитые разделы.Обнаружение происходит, когда операция чтения превышает заданный пороговый объем байтов, отправляя событие в Kafka. Система изначально фокусируется на неизменяемых разделах для простоты. Этап планирования считывает весь раздел для создания плана разбиения, используя контрольные точки для обработки сбоев. Разбиение включает делегирование разделения данных конкретным стратегиям, например, назначение большего количества корзин событий временной корзине. Проверка разбиений имеет решающее значение, при этом контрольные суммы обеспечивают целостность данных перед завершением разбиения. Наконец, серверы TimeSeries используют встроенные в память фильтры Блума для эффективного перенаправления запросов на чтение на разбитые разделы, делая перенаправление практически незаметным для вызывающих сторон.
CdXz5zHNQW_JhVMWuRvRR.png