Автор: Вэй Нин, эксперт по разработке платформы больших данных Trip
Аннотация
В обширной системе данных Trip система UBT (User Behavior Tracking, система отслеживания пользовательского поведения) решает ключевые задачи по сбору и анализу пользовательских действий, с ежедневным приростом данных до 30 ТБ. Чтобы удовлетворить растущие требования к бизнесу и производительности, команда мигрировала UBT с ClickHouse на архитектуру StarRocks с разделением хранения и вычислений.
После миграции система совершила качественный скачок: среднее время ответа запросов сократилось с 1,4 секунды до 203 миллисекунд, 95‑й перцентиль задержки (P95) — до 800 миллисекунд; одновременно объем хранения уменьшился вдвое, а число узлов — с 50 до 40. В статье описано, как Trip с помощью StarRocks нашел эффективный баланс между производительностью и стоимостью.
Архитектура UBT
Ключевая функция UBT — трекинг пользовательских действий через встраиваемые точки (трекинг событий) и запросно-аналитическая обработка этих событий, например, анализ фактов возникновения ошибок. Система ориентирована на многоплатформенные сценарии, включая Android, iOS и Node.js. Через SDK события проходят предварительную обработку и фильтрацию и отправляются в нижележащие системы для дальнейшей обработки.
Система широко используется в сценариях статистики инцидентов и мониторинга; среднесуточный прирост данных — около 30 ТБ. Данные обычно хранятся 30 дней, по отдельным таблицам — до года. Типовые запросы: детализированные лог‑запросы по UID/VID с временным диапазоном и распространенные агрегированные аналитические запросы.
Схема архитектуры UBT в целом такова:

Верхний уровень — клиенты: мобильные приложения, Web и ПК.
После сбора на сервере события сначала записываются в Kafka.
-
Дальнейшее потребление идет по двум контурам:
Путь 1: потребление через gohangout и запись в ClickHouse — контур данных в реальном времени, преимущественно для пользовательских расследований и простых статистик.
Путь 2: запись через Flink в Hive как в «холодное» хранилище для более сложной бизнес‑аналитики.
Также ряд бизнес‑платформ потребляют и обрабатывают эти данные.
Фокус данной модернизации — связка gohangout + ClickHouse, замененная на Flink + StarRocks.

Проблемы, с которыми столкнулся UBT
Основными драйверами изменений стали трудности при эксплуатации ClickHouse.
-
Проблемы записи:
При записи данных UBT в ClickHouse наблюдались потери данных и рост очереди потребления.
Помимо записи в реальном времени требовались подкачки исторических данных.
Исторические диапазоны широкие, провоцируют Compaction по старым партициям, что ведет к повышенной нагрузке на CPU и I/O и росту общего системного лода.
-
Горизонтальное масштабирование:
ClickHouse использует совмещенную архитектуру хранения и вычислений: при расширении неизбежна миграция данных, процесс сложен и бьет по стабильности кластера, снижая эластичность.
В условиях огромных объемов ClickHouse предъявляет высокие требования к хранению и «железу»: конфигурации специфичны, сложны в адаптации; для надежности часто требуется три реплики, что кратно увеличивает стоимость хранения.
-
Производительность:
На больших временных диапазонах скорость выполнения SQL в ClickHouse недостаточна для аналитики в реальном времени.
Проблема усугубляется при высокой конкуренции запросов и сверхбольших объемах.
Отдельно проявились и ограничения gohangout:
Стабильность: однопроцессная модель, опора на внешние ретраи — недостаточная надежность. Flink, напротив, распределенный, поддерживает автоматический failover и авто‑масштабирование, обеспечивая высокую доступность.
Удобство: конфигурационный синтаксис gohangout громоздок; бизнес‑командам приходится тратить усилия на обучение и сопровождение. Команда потоковой обработки (real‑time) разработала RTP — платформу управления Flink. Пользователи пишут Flink SQL прямо на платформе, фильтруют и трансформируют данные из Kafka, получая полностью самостоятельную конфигурацию и визуальное управление.
Переход от ClickHouse к StarRocks
Для решения перечисленных болевых точек команда внедрила StarRocks. Ранее StarRocks использовал совмещенную архитектуру хранения и вычислений: локальный доступ к данным давал миллисекундные отклики, но приводил к жесткой утилизации ресурсов, сложному масштабированию и высокой стоимости из-за избыточных реплик.
StarRocks эволюционировал к архитектуре с разделением хранения и вычислений:
Вычислительные узлы становятся без состояния, содержат только вычислительный движок (compute engine), что позволяет гибко оркестрировать ресурсы под нагрузку.
Хранение вынесено в удаленное объектное хранилище (OSS/S3), обеспечивая полную развязку вычислений и хранения.
Для ускорения запросов включается DataCache на вычислительных узлах.

Преимущества:
Более эффективное использование ресурсов, отсутствие простоя, заметное снижение стоимости хранения.
Сохранение высокой скорости запросов.
В отличие от трех реплик в совмещенной архитектуре, в разделенной модели достаточно одной копии для обеспечения надежности.
В архитектуре с разделением хранения и вычислений масштабирование вычислительных узлов не связано с миграцией фактических данных, выполняется за секунды, крайне гибко и не мешает бизнесу. В продакшене одна операция масштабирования в UBT заняла около 5 секунд.
Стабильность и оптимизация
1. Проектирование хранения

Общий объем данных UBT — порядка 1 ПБ; крупнейшая таблица — 400 ТБ и 1,8 трлн строк. Нагрузка на запись очень высока: совокупно ~3 млн строк/с и ~10 ГБ/с; по одной таблице максимум ~1 млн строк/с и ~3,5 ГБ/с.
Сценарии чтения:
Детализированные запросы по полям вроде VID.
Распространенные агрегированные запросы.
Около 90% запросов попадают в интервал последних 7 дней, поэтому дизайн хранения оптимизирован под эту особенность — как для записи, так и для чтения.
Ключевые решения:
Ключ партиционирования: в StarRocks используется партиционирование по системному времени; запись идет только в текущую партицию. Это снижает фрагментацию и повышает стабильность записи. В ClickHouse применялось партиционирование по бизнес‑времени с записью сразу в партиции последних трех дней — большой охват порождал много фрагментов и нестабильность записи.
Табличная схема: часовые партиции. При больших нагрузках это позволяет контролировать объем данных на одну операцию Compaction.
Число бакетов — 128, чтобы повысить конкурентную способность на запись.
Сжатие: zlib вместо LZ4. При сравнимой производительности экономия ~30% дискового пространства, заметное снижение стоимости хранения.
DataCache: объем кэша спланирован под объем сканирования за 7 дней. Поскольку >90% запросов приходятся на последние 7 дней, большинство запросов ускоряются за счет кэширования.
2. Compaction
Оптимизация Compaction велась по трем направлениям:
Разумная настройка параметров Compaction (ограничения числа файлов, количества потоков и т. п.).
Снижение частоты и ресурсоемкости Compaction за счет часовых партиций и корректного числа бакетов.
Включение MergeCommit во время записи для склейки мелких версий в крупные и сокращения фрагментации.

Мониторинг и управление:
Таблица
native_compactionsпоказывает детальный прогресс каждой подзадачи Compaction на узлах CN (Compute Node) и помогает выявлять узлы с повышенной нагрузкой.Таблица
partitions_metasпозволяет отслеживать Compaction Score по таблицам и выявлять возможные проблемы в дизайне партиций или трансформациях.Команда
SHOW PROC compactionsдает информацию по задачам Compaction: время начала/окончания, общую длительность, объемы сканирования локальных и удаленных данных. Например, повышенное сканирование удаленных данных указывает на слишком маленькую конфигурацию DataCache.Метрики интегрированы в Grafana и визуализируются SQL‑графиками. Как правило, при Compaction Score < 100 система в оптимальном состоянии.
Примечание: FE (Frontend) — координатор запросов и метаданных; CN (Compute Node) — вычислительный узел.

3. Подкачка исторических данных
Поток записи разделен на две части. Первая — миграция и подкачка накопленных данных. В рамках модернизации требовалось перенести около 300 ТБ из ClickHouse. Эти данные также были в HDFS, поскольку исторически потоки писались параллельно в ClickHouse и Hive.
Для импорта выбран SparkLoad (Hive → StarRocks). Перед решением сравнили три метода:
StreamLoad — для загрузок масштаба ГБ, обычно для логов в реальном времени.
BrokerLoad — для ТБ‑уровня, обычно минутные окна, подходит для ежедневных офлайн‑пакетов.
SparkLoad — для объемов свыше ТБ, с минимальным воздействием на кластер: Spark‑задача очищает и обрабатывает данные, складывает результат в HDFS, а узлы CN StarRocks напрямую подтягивают подготовленные данные из HDFS в хранилище.
Такой механизм обходит путь MemoryStore → диск, существенно снижает издержки Compaction и минимально влияет на кластер. Итог: SparkLoad — оптимальный выбор для крупной миграции и плавного переноса накопленных данных из Hive в StarRocks.
4. Инкрементальная запись в реальном времени
Для инкрементальной записи в реальном времени используется связка Flink → StarRocks с включенным MergeCommit. По сравнению с традиционным режимом Commit, MergeCommit дает значимые улучшения:
Управление версиями: в традиционном режиме n мелких запросов порождают n коммитов и n версий. MergeCommit агрегирует их в один коммит и создает одну версию — меньше версий, ниже нагрузка на метаданные.
Compaction: частые коммиты в традиционном режиме создают много мелких файлов (КБ/МБ), часто триггерят Compaction и повышают издержки. В MergeCommit каждый коммит обычно создает крупные файлы МБ‑уровня, что снижает число файлов и частоту Compaction.
I/O‑эффективность: мелкие записи — это случайный I/O и частые открытия файлов при чтении. MergeCommit превращает запись в крупные последовательные батчи; файлов меньше, лучше используется последовательное чтение — ниже IOPS и задержки.
Пропускная способность: вместо частых мелких батчей формируются крупные, значительно повышая throughput.
Практический эффект: без MergeCommit IOPS StarRocks обычно около 140; с MergeCommit — за счет агрегации — падает ниже 10, что дает почти 10‑кратное улучшение. Средний I/O Size также вырастает примерно в 10 раз.

5. Запросы
Оптимизация запросов опирается на два типовых сценария.
-
Детализированные запросы:
Пользователь должен указывать партицию и использовать префиксный индекс.
Это резко сокращает область сканирования (отсечение по партициям, partition pruning) и повышает эффективность.
Комбинация отсечения и префиксного индекса обеспечивает стабильную производительность для лог‑аналитики на детальном уровне.
-
Агрегированные запросы:
Частая потребность — статистика по часовым партициям.
Под такие запросы заранее строятся материализованные представления на уровне партиций (Partition MV) и выполняется предагрегация.
Partition MV обновляет только те партиции, где есть изменения, что минимально влияет на кластер.
Алгоритмическая оптимизация обновления MV:
Изначально при каждом обновлении MV проверялись все партиции MV и все партиции базовой таблицы; фактически каждая партиция MV опрашивала все партиции базы — сложность M*N.
После оптимизации партиции базовой таблицы запрашиваются один раз — сложность M+N.
На масштабе десятков тысяч партиций эффект значителен: без оптимизации время отклика узлов FE резко растет.
Результаты и выгоды
После миграции с ClickHouse на StarRocks и комплекса оптимизаций достигнуты заметные улучшения:
Хранение: за счет модели с одной репликой объем сократился с 2,6 ПБ (ClickHouse, 2 реплики) до 1,2 ПБ (StarRocks, 1 реплика), что существенно снизило стоимость.
Ресурсы: число узлов уменьшено с 50 до 40, выросла эффективность использования.
Производительность: средняя задержка снизилась с 1,4 с до 203 мс (≈ 1/7 прежнего значения); 95‑й перцентиль задержки (P95) — с 8 с до 800 мс (≈ 1/10).
-
Запись: кривая записи в StarRocks стабильно держится на уровне ~3 млн строк/с; система работает ровно и предсказуемо.

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