Для чего использовал ClickHouse?

Ответ

Я использовал ClickHouse в проектах на Node.js для аналитической обработки больших объемов данных в реальном времени. Это колоночная OLAP-СУБД, идеально подходящая для сценариев, где важна скорость агрегации и чтения.

Конкретные кейсы применения:

  1. Аналитика пользовательских событий: Хранение и агрегация миллиардов событий (клики, просмотры, действия в приложении) для построения дашбордов.
  2. Мониторинг и логирование: Агрегация логов сервисов и метрик (например, время ответа API, ошибки) для быстрого поиска аномалий.
  3. Финансовая отчетность: Быстрое вычисление сложных агрегатов по транзакциям за большие периоды.

Пример интеграции с Node.js:

const { ClickHouse } = require('clickhouse');

const clickhouse = new ClickHouse({
    url: 'http://localhost',
    port: 8123,
    debug: false,
    basicAuth: {
        username: 'default',
        password: '',
    },
    format: 'json', // Получаем ответ в виде JSON
});

// Вставка данных (высокая скорость)
async function insertEvent(event) {
    const query = `INSERT INTO analytics.events FORMAT JSONEachRow`;
    await clickhouse.insert(query, [event]).toPromise();
}

// Аналитический запрос с агрегацией
async function getDailyStats(date) {
    const query = `
        SELECT 
            toDate(timestamp) as day,
            event_type,
            count() as events_count,
            uniq(user_id) as unique_users
        FROM analytics.events
        WHERE day = '${date}'
        GROUP BY day, event_type
        ORDER BY events_count DESC
    `;
    const rows = await clickhouse.query(query).toPromise();
    return rows;
}

Почему ClickHouse, а не другая БД? Для аналитических запросов с GROUP BY и агрегатными функциями (count, sum, uniq) на терабайтах данных он работает на порядки быстрее традиционных row-based SQL-баз (PostgreSQL, MySQL) благодаря колоночному хранению, сжатию данных и векторized execution.

Ответ 18+ 🔞

А, ClickHouse, говоришь? Ну это, блядь, такая штука, когда тебе надо не просто данные хранить, а прям вот охуенно быстро по ним считать всякую хуйню. Представь, у тебя там терабайты логов, событий, транзакций — обычная база типа PostgreSQL уже бздит и накрывается медным тазом, когда ты просишь посчитать, сколько раз Вася из Ростова нажал на красную кнопку за прошлый год. А ClickHouse — раз, и готово, чувак. Он для этого и сделан.

Где я его применял, ёпта:

  1. События пользователей, ебать колотить. Тысячи событий в секунду, миллиарды строк. Нужно было строить дашборды, где менеджеры тыкают фильтры и хотят видеть графики прямо щас. ClickHouse жрал эти данные, а на агрегационные запросы отвечал так быстро, что удивление было просто пиздец.
  2. Логи и мониторинг. Все эти записи, кто, когда и какую ошибку накосячил. Искать по ним в Elastic — это, конечно, классика, но когда надо быстро сгруппировать ошибки по типу за последний час и понять, где пиздец, — тут наш герой вне конкуренции.
  3. Всякая финансовая отчётность. Когда бухгалтерия или аналитики приходят и говорят: «А дай-ка нам сводную таблицу по всем платежам, с разбивкой по регионам, каналам и дням недели, и чтобы за пять лет». Обычная база тебе такого запроса просто не простит, а ClickHouse — пожалуйста, на, жри, только не подавись.

Вот, смотри, как это примерно в Node.js выглядит, простой пример:

const { ClickHouse } = require('clickhouse');

const clickhouse = new ClickHouse({
    url: 'http://localhost',
    port: 8123,
    debug: false,
    basicAuth: {
        username: 'default',
        password: '',
    },
    format: 'json',
});

// Закинуть данные — проще пареной репы
async function insertEvent(event) {
    const query = `INSERT INTO analytics.events FORMAT JSONEachRow`;
    await clickhouse.insert(query, [event]).toPromise();
}

// А вот тут уже магия начинается. Запрос, от которого другие базы бы просто сдохли.
async function getDailyStats(date) {
    const query = `
        SELECT 
            toDate(timestamp) as day,
            event_type,
            count() as events_count,
            uniq(user_id) as unique_users
        FROM analytics.events
        WHERE day = '${date}'
        GROUP BY day, event_type
        ORDER BY events_count DESC
    `;
    const rows = await clickhouse.query(query).toPromise();
    return rows;
}

А почему именно он, а не что-то другое? Да потому что он специалист, чувак. PostgreSQL или MySQL — это как универсальный солдат, они хороши для транзакций, для сложных связей. А ClickHouse — это снайпер, который сидит в засаде и бьёт точно в цель: агрегация по хуевой куче данных. Всё благодаря тому, что данные у него хранятся колонками, а не строками, да ещё и сжимаются, да ещё и обрабатываются пачками. Разница в скорости — просто небо и земля, овердохуища. Когда тебе нужны ответы на аналитические вопросы «сколько» и «насколько», а не «найди мне запись номер 1488228», — это твой выбор.