Ölçeklenebilir ClickHouse İzleme (Monitoring): Büyük Veri Analitiğinde Gözlemlenebilirlik Darboğazlarını Aşmak
ClickHouse, saniyede milyonlarca satırı ingest ederken milisaniyeler bazında sorgu dönebilen bir canavar. Ancak her SRE’nin acı yoldan öğrendiği gibi, veri tabanı izleme süreçlerini doğru kurgulamadığınızda, o canavar bir anda kendi kendini yiyen bir karadeliğe dönüşebilir. Özellikle petabyte ölçeğinde production cluster’ları yönetiyorsanız, yanlış yapılandırılmış bir ClickHouse monitoring mimarisi, izlemekle yükümlü olduğu sistemin kendisinde darboğaz (bottleneck) yaratacaktır. Bu yazıda geleneksel yöntemlerin neden çöktüğüne bakacak, gerçek zamanlı big data observability pratiklerini ele alacak ve production ortamında güvenle kullanabileceğiniz bir Grafana-ClickHouse izleme mimarisi kuracağız.
Geleneksel izleme yöntemleri ClickHouse’da neden patlar?
Geleneksel RDBMS alışkanlıklarıyla ClickHouse izlemeye çalışmak, tır ile drift yapmaya benzer; teoride eğlenceli görünse de ilk virajda devrilirsiniz. Klasik agent’ların her 5 saniyede bir system tablolarına gidip ağır SELECT COUNT(*) veya agresif system.parts sorguları atması, zaten yoğun write/merge döngüsünde olan ClickHouse’u kilitler.
ClickHouse, doğası gereği asenkron çalışır. Disk üzerindeki data part’ları sürekli arka planda birleştirilir (merge), mutasyonlar (mutations) asenkron olarak işlenir ve replication kuyrukları ZooKeeper/Keeper üzerinden koordine edilir. Bu dinamikleri anlamadan yalnızca CPU/Memory odaklı bir veri tabanı izleme stratejisi kurarsanız şu klasik felaket senaryolarıyla karşılaşırsınız:
- System table şişmesi:
system.query_logvesystem.trace_logtablolarının temizlenmemesi sonucu diskin dolması. - ZooKeeper Lock’ları: Replicated tabloların saniyede yüzlerce kez izleme aracı tarafından sorgulanmasıyla ZooKeeper’ın session kaybetmesi.
- Thread pool exhaustion: İzleme sorgularının, gerçek analitik sorguların öncelikli thread’lerini işgal etmesi.
1. Adım: Native Prometheus endpoint’ini doğru yapılandırmak
ClickHouse, 20.1 sürümünden beri harici bir exporter’a ihtiyaç duymadan Prometheus formatında metrik üretebiliyor. Ancak default gelen konfigürasyon çoğu zaman production iş yükleri için yetersizdir veya çok fazla gürültü (noise) üretir. İlk iş olarak native endpoint’i optimize edilmiş biçimde aktif edelim.
Aşağıdaki XML bloğunu, cluster üzerindeki tüm node’larda /etc/clickhouse-server/config.d/prometheus.xml olarak kaydedin:
<clickhouse>
<prometheus>
<endpoint>/metrics</endpoint>
<port>9363</port>
<metrics>true</metrics>
<events>true</events>
<asynchronous_metrics>true</asynchronous_metrics>
<status_info>true</status_info>
</prometheus>
</clickhouse>
asynchronous_metrics parametresi hayati önem taşır. ClickHouse, işletim sistemi seviyesindeki metrikleri ve arka plan thread durumlarını her an güncel tutmak yerine, arka planda belirli aralıklarla asenkron olarak toplar. Bu parametreyi aktif ederek kazıma (scraping) anında motoru ekstra yükten koruyoruz.
2. Adım: SRE gözünden takip edilmesi gereken kritik metrikler
Her şeyi izlemek, hiçbir şeyi izlememektir. ClickHouse izlerken panellerinizde mutlaka bulunması gereken, doğrudan “aksiyon alınabilir” metrikler şunlardır:
Active parts ve Too many parts hatası
ClickHouse’a çok sık ve küçük batch’ler halinde insert yaparsanız, arka plandaki merge mekanizması yetişemez. Bu, Too many parts in all parts in table hatasına yol açar ve insert’ler blocklanır. Bunu önceden yakalamak için şu metriği alarm listenizin en başına koyun:
# Anlık aktif part sayısı alarm eşiği (Genellikle tablo başına > 300 tehlikedir)
clickhouse_asynchronous_number_of_active_parts
ZooKeeper / ClickHouse Keeper gecikmeleri
Replicated (örneğin ReplicatedMergeTree) tablolar kullanıyorsanız, ZooKeeper cluster’ınızın sağlığı doğrudan ClickHouse’un sağlığı demektir. ZooKeeper üzerindeki queue birikmelerini şu metrikle izleyin:
# ZooKeeper'da bekleyen asenkron task sayısı
clickhouse_asynchronous_metrics_ZooKeeperHasPendingMutations
# Replicated tablolar için kuyruktaki iş sayısı
clickhouse_metrics_ReplicatedPendingInserts
3. Adım: Grafana entegrasyonu ve verimli dashboard tasarımı
Grafana-ClickHouse entegrasyonu için toplulukta iki popüler yaklaşım var: ilki Prometheus üzerinden metrikleri çekmek, ikincisi ise doğrudan ClickHouse sistem tablolarını sorgulayan bir veri kaynağı (örneğin Altinity ClickHouse Datasource) kullanmak. En etkili yöntem, bu ikisini hibrit kullanmaktır.
Grafana üzerinde yavaş sorguları (slow queries) izlemek için doğrudan system tablosunu sorgularken asla limit koyulmamış sorgular atmayın. Aşağıdaki optimize edilmiş SQL örneği, son 1 saatte en çok kaynak tüketen ilk 5 sorguyu cluster genelinde getirir:
SELECT
query_duration_ms,
query,
user,
formatReadableSize(memory_usage) AS mem
FROM clusterAllReplicas('default', system.query_log)
WHERE event_time > now() - INTERVAL 1 HOUR
AND type = 'QueryFinish'
ORDER BY query_duration_ms DESC
LIMIT 5;
clusterAllReplicas tablosal fonksiyonuyla tüm node’lardaki system.query_log verilerini dağıtık biçimde sorguluyoruz. Bu sayede tek bir node’un hafızasını (RAM) şişirmeden, tüm cluster’ın röntgenini çekebiliriz.
4. Adım: Sistem tablolarının gizli tehlikesi ve TTL yönetimi
ClickHouse default ayarlarda system.query_log, system.trace_log, system.metric_log gibi kritik tabloları sonsuza kadar saklama eğilimindedir. Eğer saniyede binlerce sorgunun döndüğü bir big data observability altyapınız varsa, bu tablolar birkaç hafta içinde disk alanınızı yutacaktır.
Sistem tablolarına akıllıca bir TTL (Time-To-Live) politikası uygulamak şarttır. Bunu yapmak için /etc/clickhouse-server/config.d/system_tables_ttl.xml dosyası oluşturun:
<clickhouse>
<query_log>
<partition_by>toYYYYMM(event_date)</partition_by>
<ttl>event_date + INTERVAL 15 DAY DELETE</ttl>
</query_log>
<trace_log>
<partition_by>toYYYYMM(event_date)</partition_by>
<ttl>event_date + INTERVAL 7 DAY DELETE</ttl>
</trace_log>
</clickhouse>
Bu konfigürasyonla birlikte, sorgu geçmişinizi 15 gün, çok daha fazla yer kaplayan execution trace log’larınızı ise yalnızca 7 gün saklayarak diskin gereksiz şişmesini önlüyoruz. Disk doluluğu %90’ın üzerine çıktığında ClickHouse kendini korumaya alıp read-only moda geçebilir.
SRE kontrol listesi
Büyük ölçekli ClickHouse cluster’ınızı izlerken şu üç kuralı asla aklınızdan çıkarmayın:
- Dışarıdan (external) agresif polling yapan agent’lar yerine, her zaman ClickHouse’un native Prometheus endpoint yapısını tercih edin.
- Yalnızca genel sistem metriklerine (CPU/Memory) bakarak aldanmayın; Active Parts ve Keeper latency metriklerini mutlak kırmızı çizginiz yapın.
- System tablolarınızı başıboş bırakmayın; mutlaka uygun partition ve TTL politikaları tanımlayarak diskinizin sağlığını koruyun.