$type=ticker$cols=4

$type=slider$meta=0$snip=0$rm=0

Pipeline Analitik Log Real-Time dengan Redpanda dan ClickHouse: Ingest Log Nginx via Vector, Kafka Table Engine, Materialized View, dan Deteksi Serangan Web di Bawah 1 Detik

Ketika satu server web melayani jutaan request per hari, grep pada access.log tidak lagi cukup untuk menjawab pertanyaan operasional dan...

Meja kerja engineer data dan keamanan dengan terminal Linux menampilkan log Nginx dan dashboard analitik ClickHouse real-time

Ketika satu server web melayani jutaan request per hari, grep pada access.log tidak lagi cukup untuk menjawab pertanyaan operasional dan keamanan. Contohnya: endpoint mana yang tiba-tiba memuntahkan error 5xx, IP mana yang memindai /wp-login.php ratusan kali per menit, atau berapa latensi p95 per upstream lima menit terakhir. Jawabannya harus muncul dalam hitungan detik, bukan setelah log dirotasi.

Pola arsitektur yang semakin populer untuk kebutuhan ini adalah log sebagai event stream: log dikirim ke broker streaming lalu dimaterialisasi ke database OLAP kolumnar. Di artikel ini kita memakai Redpanda, broker yang kompatibel penuh dengan API Kafka, berupa satu binary C++ tanpa ZooKeeper/JVM. Pasangannya adalah ClickHouse, OLAP kolumnar yang mampu memindai ratusan juta baris per detik. Karena Redpanda berbicara protokol Kafka, Kafka table engine bawaan ClickHouse bisa langsung mengonsumsinya tanpa konektor tambahan.

1. Alur Data

  1. Nginx menulis access log dalam format JSON.
  2. Vector (shipper ringan berbasis Rust) membaca file log dan mem-publish setiap baris ke topik Redpanda nginx-logs.
  3. Redpanda menyimpan event secara durable dan terpartisi, sekaligus menjadi buffer saat ClickHouse sedang maintenance.
  4. ClickHouse: tabel engine Kafka bertindak sebagai consumer, lalu materialized view menulis hasil transformasi ke tabel MergeTree.

2. Menjalankan Redpanda dan ClickHouse dengan Docker Compose

# docker-compose.yml
services:
  redpanda:
    image: docker.redpanda.com/redpandadata/redpanda:latest
    command:
      - redpanda start
      - --mode dev-container
      - --smp 1
      - --kafka-addr internal://0.0.0.0:9092,external://0.0.0.0:19092
      - --advertise-kafka-addr internal://redpanda:9092,external://localhost:19092
    ports: ["19092:19092", "9644:9644"]
    volumes: ["redpanda-data:/var/lib/redpanda/data"]

  clickhouse:
    image: clickhouse/clickhouse-server:latest
    environment:
      CLICKHOUSE_USER: analyst
      CLICKHOUSE_PASSWORD: ${CH_PASSWORD:?set CH_PASSWORD}
    ports: ["8123:8123", "9000:9000"]
    ulimits: { nofile: { soft: 262144, hard: 262144 } }
    volumes: ["ch-data:/var/lib/clickhouse"]

volumes:
  redpanda-data:
  ch-data:
export CH_PASSWORD='ganti-dengan-password-kuat'
docker compose up -d

# Buat topik dengan 6 partisi (sesuaikan dengan jumlah consumer ClickHouse)
docker compose exec redpanda rpk topic create nginx-logs -p 6 -r 1
docker compose exec redpanda rpk cluster health
PERINGATAN - Mode dev-container: Flag --mode dev-container mematikan beberapa jaminan durabilitas (seperti fsync agresif) demi kemudahan lab. Untuk produksi, jalankan minimal 3 broker dengan -r 3, disk NVMe lokal (bukan NFS), dan aktifkan SASL/SCRAM + TLS pada listener Kafka.

3. Format Log Nginx JSON dan Vector Shipper

3.1 Log Format JSON di Nginx

# /etc/nginx/conf.d/json_log.conf
log_format json_analytics escape=json
  '{"ts":"$time_iso8601","host":"$host","ip":"$remote_addr",'
  '"method":"$request_method","uri":"$uri","status":$status,'
  '"bytes":$body_bytes_sent,"rt":$request_time,'
  '"upstream_rt":"$upstream_response_time","ua":"$http_user_agent"}';

access_log /var/log/nginx/access.json json_analytics;

3.2 Konfigurasi Vector

# /etc/vector/vector.yaml
sources:
  nginx:
    type: file
    include: ["/var/log/nginx/access.json"]

transforms:
  parse:
    type: remap
    inputs: ["nginx"]
    source: |
      . = parse_json!(.message)

sinks:
  redpanda:
    type: kafka
    inputs: ["parse"]
    bootstrap_servers: "10.10.10.50:19092"
    topic: "nginx-logs"
    encoding:
      codec: json
    compression: zstd
sudo systemctl enable --now vector
# Verifikasi pesan masuk ke topik
docker compose exec redpanda rpk topic consume nginx-logs --num 3

4. Skema ClickHouse: Kafka Engine, Tabel Target, Materialized View

4.1 Tabel Consumer (Kafka Engine)

Tabel ini tidak menyimpan data. Ia adalah consumer group yang membaca topik. Pengaturan kafka_handle_error_mode = 'stream' mencegah satu pesan JSON rusak menghentikan seluruh ingest; pesan rusak tersedia di kolom virtual _error.

CREATE DATABASE IF NOT EXISTS weblogs;

CREATE TABLE weblogs.nginx_queue
(
    ts String, host String, ip String, method String, uri String,
    status UInt16, bytes UInt64, rt Float32, upstream_rt String, ua String
)
ENGINE = Kafka
SETTINGS kafka_broker_list = 'redpanda:9092',
         kafka_topic_list = 'nginx-logs',
         kafka_group_name = 'ch-nginx-logs',
         kafka_format = 'JSONEachRow',
         kafka_num_consumers = 3,
         kafka_thread_per_consumer = 1,
         kafka_handle_error_mode = 'stream';

4.2 Tabel Penyimpanan MergeTree

Pemilihan ORDER BY menentukan performa. Urutkan dari kolom berkardinalitas rendah yang paling sering difilter (host, status) ke kolom waktu. LowCardinality mengompresi string berulang secara drastis, dan TTL menghapus data lama secara otomatis.

CREATE TABLE weblogs.nginx
(
    ts       DateTime64(3, 'Asia/Makassar'),
    host     LowCardinality(String),
    ip       IPv4,
    method   LowCardinality(String),
    uri      String,
    status   UInt16,
    bytes    UInt64,
    rt       Float32,
    ua       String
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(ts)
ORDER BY (host, status, ts)
TTL toDateTime(ts) + INTERVAL 30 DAY;

CREATE MATERIALIZED VIEW weblogs.nginx_mv TO weblogs.nginx AS
SELECT parseDateTime64BestEffort(ts, 3) AS ts,
       host, toIPv4OrDefault(ip) AS ip, method, uri, status, bytes, rt, ua
FROM weblogs.nginx_queue
WHERE length(_error) = 0;

-- Simpan pesan rusak untuk investigasi
CREATE TABLE weblogs.nginx_errors (raw String, error String, at DateTime DEFAULT now())
ENGINE = MergeTree ORDER BY at TTL at + INTERVAL 7 DAY;

CREATE MATERIALIZED VIEW weblogs.nginx_errors_mv TO weblogs.nginx_errors AS
SELECT _raw_message AS raw, _error AS error FROM weblogs.nginx_queue
WHERE length(_error) > 0;
CATATAN - IPv6: Jika server Anda menerima trafik IPv6, ganti tipe kolom ip menjadi IPv6 dan gunakan toIPv6OrDefault(ip); alamat IPv4 akan disimpan dalam bentuk IPv4-mapped.

5. Query Analitik dan Deteksi Serangan

5.1 Error Rate dan Latensi p95 per Menit

SELECT toStartOfMinute(ts) AS menit, host,
       count() AS req,
       round(countIf(status >= 500) / count() * 100, 2) AS err5xx_pct,
       round(quantile(0.95)(rt) * 1000) AS p95_ms
FROM weblogs.nginx
WHERE ts >= now() - INTERVAL 15 MINUTE
GROUP BY menit, host
ORDER BY menit DESC, err5xx_pct DESC;

5.2 Deteksi Scanner dan Brute Force

Query berikut menemukan IP yang menghasilkan banyak 404 ke path sensitif atau mencoba login berulang. Hasilnya bisa diumpankan ke firewall (nftables set, CrowdSec bouncer, atau ModSecurity) untuk pemblokiran otomatis.

SELECT ip,
       count() AS hits,
       countIf(status = 404) AS not_found,
       uniqExact(uri) AS distinct_uri,
       countIf(match(uri, '(?i)(wp-login|xmlrpc|\\.env|phpmyadmin|/\\.git)')) AS sensitive
FROM weblogs.nginx
WHERE ts >= now() - INTERVAL 5 MINUTE
GROUP BY ip
HAVING sensitive > 5 OR (not_found > 100 AND distinct_uri > 50)
ORDER BY hits DESC
LIMIT 20;

5.3 Mengukur Lag End-to-End

-- Lag consumer group di sisi Redpanda
docker compose exec redpanda rpk group describe ch-nginx-logs

-- Lag ingest di sisi ClickHouse (detik)
SELECT max(now64(3) - ts) AS lag_detik FROM weblogs.nginx WHERE ts >= now() - INTERVAL 1 MINUTE;

-- Status consumer Kafka engine
SELECT database, table, consumer_id, num_messages_read, last_exception
FROM system.kafka_consumers;
PERINGATAN - Satu Consumer Group per Tabel Kafka: Pesan di tabel engine Kafka hanya dibaca sekali per consumer group. Jangan menjalankan SELECT langsung pada nginx_queue di produksi: offset akan maju dan data itu hilang dari materialized view. Untuk mengubah logika MV, lakukan DETACH TABLE weblogs.nginx_mv, ubah, lalu ATTACH. Pastikan juga jumlah partisi topik ≥ total kafka_num_consumers di seluruh replika.

6. Tips Produksi

  • Batching: naikkan kafka_max_block_size dan atur kafka_flush_interval_ms (misalnya 1000 ms). ClickHouse lebih efisien dengan insert besar yang jarang daripada insert kecil yang sering.
  • Agregasi pra-hitung: tambahkan MV kedua ke tabel AggregatingMergeTree per menit agar dashboard Grafana tidak memindai data mentah.
  • Keamanan: gunakan named collection untuk kredensial SASL Redpanda, batasi user ClickHouse dengan readonly=1 untuk dashboard, dan jangan ekspos port 8123/9000 ke internet.
  • Lakehouse: Redpanda mendukung fitur Iceberg Topics di edisi tertentu, dan ClickHouse dapat membaca tabel Iceberg. Data panas tetap di ClickHouse, sedangkan histori jangka panjang bisa diarsipkan ke lakehouse S3.

Kesimpulan

Redpanda + ClickHouse membentuk pipeline log real-time yang sederhana tetapi bertenaga: satu binary broker, satu database kolumnar, dan transformasi berbasis SQL. Hasilnya, tim ops dan keamanan mendapatkan visibilitas error rate, latensi, dan pola serangan dalam hitungan detik. Kapasitasnya pun mudah diskalakan dengan menambah partisi, consumer, atau shard tanpa merombak arsitektur.

COMMENTS

Name

1clickInstall,1,404,1,Access Management,1,android,1,Ansible,1,Apache Iceberg,1,Apache2,1,API Telegram,1,Apple,3,Automation,1,AWS,1,Backup,2,bapak internet indonesia,1,Big Data,2,blkid,1,booting,1,BorgBackup,1,brainware,1,calc,1,can't mount,3,can't read superblock,1,cara mengatasi disk failure,1,cara mengatasi disk penuh,1,cara mengatasi error disk,1,cara mengatasi error proxmox,1,cara mengatasi log full,1,centOS,1,Ceph,1,certificate,1,Chrome,1,Cilium,1,cinta sang penguasa,1,CLI,1,ClickHouse,1,Cloud,4,Cloud Computing,10,Cloud Native,1,Cloud Storage,6,Clustering,1,Codec,1,CodeIgniter,2,computare,4,computer,4,Container,1,Cybersecurity,12,dakwah,16,Data Engineering,2,Data Mining,2,dd,1,Debian,2,Deepin Linux,1,DevOps,8,DevSecOps,1,digital,1,Docker,12,dosa,1,dosa besar,1,eBPF,1,Enkripsi,1,era digital,1,error certificate,1,error path,1,error subscription,1,excel,1,failed subscription,1,Fedora,1,fedora26,1,Feeder,1,Firewall,1,fstab,1,ftp server,1,fujitsu,1,gambar,1,ghibah,1,Git,2,GitHub,2,gitignore,1,gitignore not work,1,Google,2,Google Chrome,1,Google Cloud,1,Google Drive,2,google-drive-ocamlfuse,1,Harbor,1,Harddisk,1,Hardware,1,Hashing,1,HCI,1,HDD,2,history,1,Homelab,1,host,1,Hostname,1,how to,2,IaC,1,IAM,1,igmp proxy,1,Ilmu Komputer,1,impress,1,indihome,1,INDUKSI MATEMATIKA,1,instalasi,3,install,10,install GIT,1,install linux,6,internet,2,islam,17,javascript,1,K-Means,1,K3s,1,Kafka,1,KDE Plasma,1,keamanan,1,Keamanan Cloud,2,keamanan data,1,Keamanan Jaringan,1,keynote,1,kodi,1,komputer,5,Kubernetes,3,kuliah,1,Lakehouse,1,Latte-dock,1,leap,7,leap 42.3,1,LibreOffice,1,Linux,63,linux ringan,3,Machine Learning,2,machintos,4,macOS,5,mageia,1,mandriva,1,mate,1,microsoft office,2,microsoft windows,4,microsoft word,1,Mikrotik,3,mint,1,Monitoring,1,mount,4,mounting,1,Multimedia Codec,1,Netwatch,1,network,1,network security,1,Networking,11,Nextcloud,1,Nginx,1,node js,1,NTFS,3,ntfsfix,2,numbers,1,office,5,Online Account,1,onno,1,onnowpurbo,1,Open Source,3,OpenMandriva,1,OpenOffice,2,openoffice calc,1,openoffice writer,1,openSUSE,11,operating system,1,OPNsense,1,ownCloud,1,ownCloud Client,1,PAGES,1,PDDikti,1,pemikir islam,1,pengguna,1,perangkat keras,1,Perangkat Lunak,2,PHP,1,PHP 5,1,PKI,1,Polars,1,port 80,1,port 8082,1,postel sevice award,1,Powerpoint,1,presentasi,1,presentation,1,Privacy,1,Proxmox,16,PVE,1,Python,1,q4os,1,Redpanda,1,remaja islam,2,review,7,rezeki,1,s1300i,1,scanner,1,scansnap,1,Security,12,sejarah,1,Server,22,setting,1,Sistem Operasi,2,Software,2,spreadsheet,1,SSH,2,SSO,1,stb,1,Storage,8,sukses dunia akhirat,1,Sysadmin,18,Tailscale,1,Telegram,1,Teleport,1,telkom,1,tesseract,1,text,1,Trino,1,Tutorial,31,tv box,1,Ubuntu,3,Unsupervised Learning,1,usb drive,1,useetv,1,user,1,VBA,1,version control,1,virtual machine,2,Virtualization,4,Visual basic,1,Visual Basic for Applications,1,VLC,2,VLC Media Player,1,VPN,1,vsftpd,1,Wazuh,1,whatsapp api,1,winbox,1,Windows,7,Windows 7,1,word,1,WORD PROCESSOR,2,workstation,1,WPS Office,1,Zero Trust,1,zypper,1,
ltr
item
zhato TECH: Pipeline Analitik Log Real-Time dengan Redpanda dan ClickHouse: Ingest Log Nginx via Vector, Kafka Table Engine, Materialized View, dan Deteksi Serangan Web di Bawah 1 Detik
Pipeline Analitik Log Real-Time dengan Redpanda dan ClickHouse: Ingest Log Nginx via Vector, Kafka Table Engine, Materialized View, dan Deteksi Serangan Web di Bawah 1 Detik
zhato TECH
http://www.zhato-tech.id/2026/11/pipeline-analitik-log-real-time-dengan.html
http://www.zhato-tech.id/
http://www.zhato-tech.id/
http://www.zhato-tech.id/2026/11/pipeline-analitik-log-real-time-dengan.html
true
740282316614930842
UTF-8
Loaded All Posts Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All RECOMMENDED FOR YOU LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS PREMIUM CONTENT IS LOCKED STEP 1: Share to a social network STEP 2: Click the link on your social network Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy Table of Content