Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

ClickHouse — kolumnowa baza danych dla analityki na VPS

Opublikowano: 10 kwietnia 2026 · Kategoria: VPS / Bazy danych

ClickHouse to kolumnowa baza danych OLAP (Online Analytical Processing) stworzona przez Yandex, open-sourcowa od 2016 roku. Specjalizuje się w błyskawicznym wykonywaniu zapytań analitycznych na miliardach wierszy — zapytanie agregujące miliardy eventów może zwrócić wynik w sekundy zamiast minut. Używają jej Cloudflare, Uber, eBay i setki innych firm do analityki webowej, logów dostępu, metryk aplikacji i raportowania. Ten artykuł pokazuje instalację, konfigurację MergeTree engine i integrację z Grafaną.

Instalacja ClickHouse — apt vs Docker

# === Metoda 1: Instalacja przez apt (Ubuntu/Debian) ===
sudo apt-get 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

# Ustaw haslo dla uzytkownika default podczas instalacji!
sudo systemctl enable --now clickhouse-server
sudo systemctl status clickhouse-server

# === Metoda 2: Docker Compose (szybkie testy) ===
# docker-compose.yml:
# services:
#   clickhouse:
#     image: clickhouse/clickhouse-server:latest
#     ports:
#       - "8123:8123"   # HTTP interface
#       - "9000:9000"   # Native protocol
#     volumes:
#       - ./clickhouse-data:/var/lib/clickhouse
#     environment:
#       CLICKHOUSE_PASSWORD: "TajneHaslo123"

# Test polaczenia
clickhouse-client --password
# lub przez HTTP:
# curl 'http://localhost:8123/?query=SELECT+version()'

MergeTree Engine — serce ClickHouse

MergeTree to główny engine tabeli w ClickHouse. Dane są najpierw zapisywane w małych "parts" (porcjach), które są następnie łączone w tle. Kluczowe parametry to ORDER BY (klucz sortowania — decyduje o wydajności zapytań) i PARTITION BY (podział danych na partycje, np. miesiącami).

-- Logowanie zdarzen webowych
CREATE TABLE events (
    event_date  Date,
    event_time  DateTime,
    user_id     UInt64,
    session_id  String,
    page_url    String,
    action      LowCardinality(String),  -- Enum-like, oszczedza miejsce
    duration_ms UInt32,
    country     LowCardinality(String)
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_date)   -- Partycja per miesiac
ORDER BY (event_date, user_id, event_time)  -- Klucz sortowania
SETTINGS index_granularity = 8192;

-- Wstawianie danych (INSERT jest bardzo szybki)
INSERT INTO events VALUES
    ('2026-04-10', '2026-04-10 14:00:00', 12345, 'sess_abc', '/home', 'pageview', 850, 'PL'),
    ('2026-04-10', '2026-04-10 14:01:30', 12345, 'sess_abc', '/pricing', 'click', 1200, 'PL');

-- Zapytania analityczne - to gdzie ClickHouse blysczy
SELECT
    country,
    action,
    count() AS events,
    avg(duration_ms) AS avg_duration,
    uniq(user_id) AS unique_users
FROM events
WHERE event_date >= '2026-04-01'
GROUP BY country, action
ORDER BY events DESC
LIMIT 20;

-- Przykladowy wynik: 1.2 miliarda wierszy przetworzone w 1.8 sekundy!

Materialized Views — pre-agregacja dla dashboardów

-- Tabela agregowana - statystyki godzinowe
CREATE TABLE events_hourly_agg (
    hour            DateTime,
    country         LowCardinality(String),
    action          LowCardinality(String),
    events_count    UInt64,
    unique_users    AggregateFunction(uniq, UInt64),
    avg_duration    AggregateFunction(avg, UInt32)
)
ENGINE = AggregatingMergeTree()
ORDER BY (hour, country, action);

-- Materialized View - automatycznie wypelnia tabele agg
CREATE MATERIALIZED VIEW events_hourly_mv
TO events_hourly_agg
AS SELECT
    toStartOfHour(event_time) AS hour,
    country,
    action,
    count() AS events_count,
    uniqState(user_id) AS unique_users,
    avgState(duration_ms) AS avg_duration
FROM events
GROUP BY hour, country, action;

-- Zapytanie do agregatow (bardzo szybkie - dane juz przetworzone)
SELECT
    hour,
    country,
    events_count,
    uniqMerge(unique_users) AS unique_users_count
FROM events_hourly_agg
WHERE hour >= now() - INTERVAL 7 DAY
GROUP BY hour, country, events_count
ORDER BY hour DESC;

Integracja z Grafana

# Instalacja pluginu ClickHouse dla Grafana
grafana-cli plugins install grafana-clickhouse-datasource
sudo systemctl restart grafana-server

# Konfiguracja datasource w Grafana UI:
# URL: http://localhost:8123
# Protocol: Native (port 9000) lub HTTP (port 8123)
# Username: default
# Password: TajneHaslo123

# Przydatna konfiguracja /etc/clickhouse-server/users.xml
# Dodaj uzytkownika readonly dla Grafana:
# <readonly_user>
#   <password_sha256_hex>...</password_sha256_hex>
#   <profile>readonly</profile>
# </readonly_user>

# Przykladowe zapytanie do panelu Grafana (time series)
-- SELECT
--   toStartOfMinute(event_time) AS time,
--   count() AS events
-- FROM events
-- WHERE event_time BETWEEN {from:DateTime} AND {to:DateTime}
-- GROUP BY time
-- ORDER BY time;

Porównanie OLAP — ClickHouse vs TimescaleDB vs InfluxDB

Kryterium ClickHouse TimescaleDB InfluxDB v3
Język zapytań SQL (rozszerzony) PostgreSQL SQL Flux / SQL
Szybkość analiz Bardzo wysoka (OLAP) Wysoka Średnia
INSERT throughput Bardzo wysoki Wysoki Wysoki
RAM minimum 4 GB (prod: 16+ GB) 2 GB 2 GB
Integracja SQL Własny SQL dialect Pełny PostgreSQL ograniczona
Use case Analityka, logi, BI Time series + SQL Metryki IoT/serwery

Najczęstsze pytania

Czym jest kolumnowa baza danych i dlaczego ClickHouse jest szybki? +
W tradycyjnej (wierszowej) bazie danych dane jednego wiersza są przechowywane razem — świetne dla OLTP (INSERT/UPDATE pojedynczych rekordów). W kolumnowej bazie (OLAP) dane jednej kolumny są przechowywane razem. Gdy pytasz "jaka jest suma sprzedaży za ostatni miesiąc", baza czyta tylko kolumnę "kwota" — pomijając wszystkie inne kolumny. To daje 10-100x przyspieszenie dla analitycznych zapytań agregujących duże zbiory. ClickHouse dodatkowo bardzo efektywnie kompresuje dane kolumnowe (podobne wartości w jednej kolumnie kompresują się lepiej) i używa wektorowego przetwarzania danych (SIMD).
Jak ClickHouse wypada w porównaniu z TimescaleDB i InfluxDB? +
ClickHouse vs TimescaleDB: ClickHouse jest szybszy dla ad-hoc zapytań analitycznych na dużych danych, TimescaleDB ma lepszą integrację z PostgreSQL i lepiej radzi sobie z ciągłymi insercjami i zapytaniami z JOIN. TimescaleDB lepiej nadaje się gdy masz już PostgreSQL i chcesz time series. ClickHouse vs InfluxDB: InfluxDB używa własnego języka Flux, jest prostszy do monitoringu metryk, ale słabszy dla złożonych analiz. ClickHouse używa SQL (z rozszerzeniami), lepiej skaluje na petabajty, ma wyższy throughput zapytań. Dla dashboardów metryk (CPU/RAM/dysk) InfluxDB jest prostszy. Dla analityki biznesowej i złożonych raportów ClickHouse wygrywa.
Ile zasobów potrzebuje ClickHouse na VPS? +
ClickHouse jest zasobożerny — nie jest to baza do uruchomienia na małym VPS. Minimum dla deweloperów: 4 GB RAM, 2 CPU, 20 GB NVMe. Produkcja dla małych zbiorów (setki GB): 16 GB RAM, 4-8 CPU, 200+ GB NVMe. ClickHouse intensywnie używa pamięci dla operacji GROUP BY i sortowania. Dla monitoringu metryk kilku serwerów wystarczy 4-8 GB RAM. Dla analityki e-commerce z miliardami eventów potrzebujesz 32+ GB RAM. Dobrą praktyką jest uruchomienie ClickHouse na dedykowanym serwerze, oddzielnie od aplikacji produkcyjnej.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.