it
ClickHouse Analytics กับ Home Lab Setup —

ClickHouse Analytics Database

ClickHouse เป็น Columnar Database สำหรับ OLAP ประมวลผล Queries เร็วมาก รองรับข้อมูลหลายพันล้าน Rows ใช้ Column-oriented Storage บีบอัดข้อมูลได้ดี เหมาะกับ Analytics
เนื้อหาเกี่ยวข้อง — อ่านต่อ: Apache Hudi Tech Conference 2026
Home Lab ให้ทดลอง ClickHouse ที่บ้าน ไม่ต้องจ่ายค่า Cloud ใช้ PC เก่าหรือ Mini PC ติดตั้งผ่าน Docker เรียนรู้ Data Engineering จริง
เนื้อหาเกี่ยวข้อง — บทความที่เกี่ยวข้อง: Wireless Site Survey High Availability HA Setup
ClickHouse Installation
# === ClickHouse Installation สำหรับ Home Lab ===
# 1. Docker Installation (แนะนำ)
docker run -d \
--name clickhouse \
--ulimit nofile=262144:262144 \
-p 8123:8123 \
-p 9000:9000 \
-v clickhouse_data:/var/lib/clickhouse \
-v clickhouse_logs:/var/log/clickhouse-server \
clickhouse/clickhouse-server:latest
# 2. Docker Compose (Production-ready)
# docker-compose.yml
# version: '3.8'
# services:
# clickhouse:
# image: clickhouse/clickhouse-server:latest
# ports:
# - "8123:8123" # HTTP
# - "9000:9000" # Native
# volumes:
# - ./data:/var/lib/clickhouse
# - ./logs:/var/log/clickhouse-server
# - ./config:/etc/clickhouse-server/config.d
# - ./users:/etc/clickhouse-server/users.d
# environment:
# CLICKHOUSE_DB: analytics
# CLICKHOUSE_USER: admin
# CLICKHOUSE_PASSWORD: secure_password
# ulimits:
# nofile:
# soft: 262144
# hard: 262144
# deploy:
# resources:
# limits:
# memory: 8G
#
# grafana:
# image: grafana/grafana:latest
# ports:
# - "3000:3000"
# environment:
# GF_INSTALL_PLUGINS: grafana-clickhouse-datasource
# volumes:
# - grafana_data:/var/lib/grafana
# 3. Native Installation (Ubuntu)
sudo apt-get install -y apt-transport-https ca-certificates
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754
echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
sudo apt-get update
sudo apt-get install -y clickhouse-server clickhouse-client
sudo systemctl start clickhouse-server
sudo systemctl enable clickhouse-server
# 4. ตรวจสอบ
clickhouse-client --query "SELECT version()"
curl http://localhost:8123/?query=SELECT+1
# 5. Performance Tuning (config.d/performance.xml)
#
# 8000000000
# 8
# 100
# 5368709120
#
echo "ClickHouse installed"
echo " HTTP: http://localhost:8123"
echo " Native: localhost:9000"
echo " Client: clickhouse-client"

Analytics Queries
# === ClickHouse Analytics Queries ===
queries = {
"Daily Active Users": """
SELECT
event_date,
uniq(user_id) AS dau,
count() AS total_events,
avg(duration_ms) AS avg_duration
FROM analytics.web_events
WHERE event_date >= today() - 30
GROUP BY event_date
ORDER BY event_date
""",
"Top Pages by Views": """
SELECT
page_url,
count() AS views,
uniq(user_id) AS unique_users,
avg(duration_ms) AS avg_duration,
countIf(is_bounce = 1) * 100.0 / count() AS bounce_rate
FROM analytics.web_events
WHERE event_date >= today() - 7
GROUP BY page_url
ORDER BY views DESC
LIMIT 10
""",
"User Funnel": """
SELECT
countIf(event_type = 'page_view') AS views,
countIf(event_type = 'click') AS clicks,
countIf(event_type = 'scroll') AS scrolls,
countIf(event_type = 'purchase') AS purchases,
round(countIf(event_type = 'purchase') * 100.0 /
countIf(event_type = 'page_view'), 2) AS conversion_rate
FROM analytics.web_events
WHERE event_date >= today() - 30
""",
"Country Distribution": """
SELECT
country,
uniq(user_id) AS users,
count() AS events,
round(avg(duration_ms) / 1000, 1) AS avg_seconds
FROM analytics.web_events
WHERE event_date >= today() - 30
GROUP BY country
ORDER BY users DESC
""",
"Hourly Traffic Pattern": """
SELECT
toHour(event_time) AS hour,
count() AS events,
uniq(user_id) AS users
FROM analytics.web_events
WHERE event_date = today()
GROUP BY hour
ORDER BY hour
""",
"Retention (Day 1, 7, 30)": """
WITH first_seen AS (
SELECT user_id, min(event_date) AS first_date
FROM analytics.web_events
GROUP BY user_id
)
SELECT
first_date,
count() AS cohort_size,
countIf(dateDiff('day', first_date, event_date) = 1) AS day1,
countIf(dateDiff('day', first_date, event_date) = 7) AS day7,
countIf(dateDiff('day', first_date, event_date) = 30) AS day30
FROM analytics.web_events
JOIN first_seen USING (user_id)
WHERE first_date >= today() - 60
GROUP BY first_date
ORDER BY first_date
""",
}
print("ClickHouse Analytics Queries:")
for name, query in queries.items():
lines = len(query.strip().split("\n"))
print(f" {name} ({lines} lines)")
# รัน Query
# client = setup_clickhouse()
# for name, query in queries.items():
# result = client.query(query)
# print(f"\n{name}:")
# for row in result.result_rows[:5]:
# print(f" {row}")
Best Practices
- Partition by Date: ใช้ PARTITION BY toYYYYMM(date) สำหรับ Time Series Data
- ORDER BY: เลือก ORDER BY ตาม Query Pattern ที่ใช้บ่อยที่สุด
- LowCardinality: ใช้ LowCardinality สำหรับ Columns ที่มีค่าซ้ำกันมาก
- Materialized Views: ใช้ Materialized Views สำหรับ Pre-aggregate Data
- TTL: ตั้ง TTL ลบข้อมูลเก่าอัตโนมัติ ประหยัด Storage
- Grafana Dashboard: ใช้ Grafana + ClickHouse Plugin สำหรับ Visualization
ClickHouse คืออะไร
Open-source Columnar Database สำหรับ OLAP พัฒนาโดย Yandex ประมวลผล Queries เร็วมาก รองรับหลายพันล้าน Rows Column-oriented Storage บีบอัดดี Log Analytics Time Series BI
แนะนำเพิ่มเติม — คู่มือเทรดจาก SiamCafeBook
เนื้อหาเกี่ยวข้อง — ดูเพิ่มเติมเรื่อง Rust Serde Clean Architecture





