@fridary

Как лучше сохраняться данные с сайта в ClickHouse?

У меня появилась задача написать свою систему типа Яндекс Метрики: пользователи будут вешать на сайт js код, он будет сохранять информацию о всех посещениях для аналитики и статистики. Выбор мой пал на ClickHouse.
Подскажите, как наиболее эффективно построить такую архитектуру? Планируется не менее 100к записей в день делать. Основной затык у меня – это как лучше передавать данный с веб-сайта на сервер для дальнейшей обработки в ClickHouse. Вижу так:
  1. Создаю сервер с nginx и ClickHouse на Ubunta в одном месте, на который будут отсылаться данные с сайтов
  2. Сайты отсылают XMLHttpRequest (ajax post) запросы на этот сервер
  3. nginx на python/php принимает запросы и кладет в redis
  4. redis раз в N секунд скриптом на python/php через cron кладет данные в ClickHouse


Будет ли стабильно работать такая схема? Что можно здесь улучшить?
  • Вопрос задан
  • 229 просмотров
Пригласить эксперта
Ответы на вопрос 2
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Схема в общем-то рабочая, но стоит все же предусмотреть некоторые нюансы:
Создаю сервер с nginx и ClickHouse на Ubunta в одном месте
Вы уверены, что одна единственная машина, нагруженная одновременно и nginx и CH и redis и php/python справится с Вашей нагрузкой?
Я бы сразу закладывал, что раньше позже CH уедет на отдельную машину (а то и на 2), redis + php/python будут жить в парах на множестве машин, а nginx будет балансировать нагрузку с отдельной машины.
раз в N секунд скриптом на python/php через cron кладет данные в ClickHouse

Тут сразу 2 момента:
Во-первых, при миллиарде записей CH вполне может пересчитывать индексы пару минут. +1000 записей за 10 инсертов конечно лучше, чем +1000 записей за 1000 инсертов... но все же заметно хуже чем +1000 записей за 1 инсерт.
Во-вторых, при пиковой нагрузке у Вас может закончится память, и redis уйдет на диск, потеряв всю скорость от inMemory работы. Конечно Вы тут еще и упретесь в количество активных потоков под php и начнете его балансировать. Так что одно из решений будет уже описанное выше, что на каждой машине с php/python свой redis. А там как повезет с нагрузкой.
Но все же я бы сразу делал выгрузку из redis в CH умнее, чем тупо каждые N секунд выгружаем все что есть. Лучше если будет выгрузка и по времени (при этом реже) и по количеству данных для записи.
Ну и еще, задумайтесь сразу как делить данные в redis по принадлежности к интервалу записи
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы