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 |