MAATRIX / Блог / VPS для ClickHouse: аналитическая СУБД на своём сервере

VPS для ClickHouse: аналитическая СУБД на своём сервере

VPS для ClickHouse: установка и аналитика на VPS
Блог MAATRIX · 2026-07-07

ClickHouse — колоночная СУБД для аналитики, которая обрабатывает миллиарды строк за секунды. Разберём установку, создание таблицы на движке MergeTree, партиционирование, правильную вставку батчами и требования к диску и памяти на VPS.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Почему ClickHouse такой быстрый

ClickHouse хранит данные по колонкам, а не по строкам. Для аналитических запросов (SUM, COUNT, GROUP BY по миллионам строк) это радикально эффективнее: читаются только нужные колонки, а не вся строка целиком. Плюс агрессивное сжатие — однотипные значения в колонке жмутся в разы.

Обратная сторона: ClickHouse не для точечных UPDATE/DELETE и не для транзакций как в PostgreSQL. Это инструмент под аналитику, логи, метрики, отчёты. Вставка идёт крупными пачками, а движок фоново сливает куски данных (отсюда MergeTree).

  • Колоночное хранение — читаем только нужные колонки.
  • Сжатие — данные на диске в разы компактнее.
  • Батчевая вставка — тысячи строк за раз, не по одной.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для ClickHouse

Установка из официального репозитория

Ставим из официального APT-репозитория ClickHouse. При установке пакет предложит задать пароль пользователя default.

sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl gnupg
curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | \
  sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb stable main" | \
  sudo tee /etc/apt/sources.list.d/clickhouse.list
sudo apt update && sudo apt install -y clickhouse-server clickhouse-client
sudo systemctl enable --now clickhouse-server

Подключаемся клиентом и проверяем версию:

clickhouse-client --password --query "SELECT version()"

Таблица на движке MergeTree

Основной рабочий движок — MergeTree. Ключевой момент — ORDER BY (ключ сортировки), по которому строятся индексы разреженного типа и ускоряется фильтрация. Партиционирование по месяцу упрощает удаление старых данных.

CREATE TABLE events
(
    event_date  Date,
    event_time  DateTime,
    user_id     UInt64,
    event_type  LowCardinality(String),
    url         String,
    duration_ms UInt32
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, user_id);

Тип LowCardinality(String) для колонок с малым числом уникальных значений (тип события, страна) экономит место и ускоряет запросы. Партиция по месяцу позволяет мгновенно дропать старьё: ALTER TABLE events DROP PARTITION 202501.

Правильная вставка данных

Главное правило ClickHouse: вставляйте батчами, а не по одной строке. Каждая вставка создаёт кусок данных на диске, который потом надо слить. Тысячи одиночных INSERT в секунду завалят движок фоновых слияний.

# вставка из файла батчем
clickhouse-client --password --query \
  "INSERT INTO events FORMAT CSVWithNames" < events.csv

# или множественные значения одним запросом
INSERT INTO events VALUES
  ('2026-01-01','2026-01-01 10:00:00',1,'click','/home',120),
  ('2026-01-01','2026-01-01 10:00:05',2,'view','/pricing',340);

Если данные идут потоком по одной строке, включите асинхронную вставку — ClickHouse сам соберёт их в батч на своей стороне.

SET async_insert = 1;
SET wait_for_async_insert = 1;

Аналитические запросы и память

Сила ClickHouse — агрегации по огромным объёмам. Разреженный индекс по ORDER BY отсекает лишние гранулы, читается минимум данных с диска.

SELECT
    event_type,
    count() AS cnt,
    avg(duration_ms) AS avg_ms
FROM events
WHERE event_date >= today() - 30
GROUP BY event_type
ORDER BY cnt DESC;

Тяжёлые GROUP BY и JOIN требуют памяти. Ограничьте потребление на запрос, чтобы один отчёт не съел всю RAM сервера. Значения задаются в users.xml или на сессию.

SET max_memory_usage = 4000000000;   -- 4 ГБ на запрос
SET max_threads = 4;

Диск, железо и типичные ошибки

ClickHouse активно пишет и сливает куски данных на диск, а аналитические запросы сканируют гигабайты — скорость диска критична. AMD EPYC + NVMe у MAATRIX дают высокие IOPS и пропускную способность, поэтому фоновые merge и сканы идут быстро, а не упираются в диск. Сжатие ClickHouse экономит место, но чем быстрее NVMe, тем больше строк в секунду вы обрабатываете. Локации UK/США/РФ, тарифы от $8/мес и оплата картой РФ, СБП, криптой или MAAT делают запуск аналитики за рубежом простым.

  • Вставка по одной строке — лавина мелких кусков и перегрузка слияний.
  • Неудачный ORDER BY — индекс не помогает, запросы читают всё подряд.
  • Без лимита памяти — тяжёлый GROUP BY уводит сервер в OOM.
  • Ждёте UPDATE как в SQL — ClickHouse не для точечных изменений строк.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для ClickHouse

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Можно ли использовать ClickHouse как основную БД приложения?

Нет, он не для транзакций и точечных изменений. ClickHouse — аналитический слой рядом с основной OLTP-базой (PostgreSQL/MySQL), куда льют события и метрики.

Сколько RAM нужно ClickHouse?

Зависит от сложности запросов. Для старта хватает 4-8 ГБ, но тяжёлые агрегации и JOIN требуют больше — ограничивайте max_memory_usage, чтобы не ловить OOM.

Почему нельзя вставлять по одной строке?

Каждая вставка создаёт отдельный кусок данных, который движок должен слить. Частые мелкие вставки перегружают фоновые merge. Используйте батчи или async_insert.