ClickHouse'u Üretimde Çalıştırmak: 2 Milyar Satırda Alım, Merge ve Maliyet
ClickHouse'u üretimde çalıştırma deneyimimiz: şema tasarımı, sorgu optimizasyonu ve 100M+ cihaz olayında saniyenin altında analitiği nasıl elde ettiğimiz.
tracio.ai'nin analitik katmanını geliştirmeye başladığımızda, kendi özel iş yükümüzü kaldırabilecek bir veritabanına ihtiyacımız vardı: saniyede 50.000 cihaz tanımlama olayını almak, 2+ milyar satırı depolamak ve analitik sorguları bir saniyenin altında yanıtlamak. PostgreSQL'i (bu ölçekte toplamalar için çok yavaş), Elasticsearch'ü (zaman serisi analitiği için çok pahalı) ve ClickHouse'u değerlendirdik. ClickHouse kesin biçimde kazandı.
Neden ClickHouse
ClickHouse, gerçek zamanlı analitik için tasarlanmış sütun yönelimli bir OLAP veritabanıdır. İş yükümüz için temel avantajı, her sorgu için yalnızca gereken sütunları okumasıdır. Bir dolandırıcılık analisti "son 7 gün için ülkeye göre dolandırıcılık oranını göster" dediğinde, ClickHouse yalnızca country, timestamp ve risk_score sütunlarını okur — olay tablosundaki diğer 40+ sütunu yok sayar. 2 milyar satırlık bir tabloda bu, I/O'yu %95 azaltır.
ClickHouse verileri son derece iyi sıkıştırır da. 2 milyar satırlık events tablomuz diskte 340 GB kaplar — sıkıştırılmış olarak satır başına yaklaşık 170 bayt, sıkıştırılmamış satır başına 1,2 KB'ye karşılık. 7:1'lik sıkıştırma oranı, belleğe daha fazla verinin sığması anlamına gelir ve bu doğrudan daha hızlı sorgulara dönüşür.
Şema Tasarımı
Birincil tablomuz her tanımlama olayı için bir satır depolar:
Tablo, (workspace_id, toDate(timestamp), visitor_hash) ile sıralanmış MergeTree motorunu kullanır. Bu sıralama kritiktir — workspace ve tarih aralığına göre filtrelenen sorguların minimum veri okuması anlamına gelir. visitor_hash sütunu, ikincil bir index olmadan visitor ID ile hızlı aramalar sağlar.
country, device_type, browser_family ve os_family için LowCardinality(String) seçtik çünkü bu sütunların 10.000'den az farklı değeri var. ClickHouse, LowCardinality sütunlarını sözlükle kodlanmış tam sayılar olarak depolar; bu, düz string'lere kıyasla depolamayı %80 azaltır ve GROUP BY işlemlerini hızlandırır.
Sharding Stratejisi
events tablosunu, workspace_id'nin bir hash'ini kullanarak 6 düğüme sharding'liyoruz. Bu, belirli bir müşterinin tüm olaylarının aynı shard'da olmasını sağlar; bu da çoğu sorgunun (workspace_id'ye göre filtrelenmiş) tek bir shard'a isabet etmesi demektir. Shard'lar arası sorgular yalnızca dahili analitik için gereklidir.
Her shard'ın yüksek erişilebilirlik için 2 replikası vardır. Replikasyon, ClickHouse'un dahili ReplicatedMergeTree motorunu ZooKeeper koordinasyonuyla kullanır. Failover otomatiktir — bir shard çökerse, sorgular istemci tarafında hiçbir değişiklik olmadan replikaya yönlendirilir.
Alım Hattı
Olaylar, Kafka topic'imizden, insert'leri toplu hale getiren özel bir Go servisi aracılığıyla ClickHouse'a akar. Her 500ms'de 10.000 satırlık partiler halinde insert yaparız — bu, alım gecikmesini (saniyenin altında) insert verimliliğiyle (ClickHouse büyük partilerde en iyi performansı gösterir) dengeler.
Alım servisi geri basıncı zarif biçimde yönetir. ClickHouse insert'leri kabul etmekte yavaşsa (merge'ler veya yoğun sorgu yükü sırasında), servis bellekte 1 milyona kadar olayı tamponlar ve Kafka consumer'ına geri basınç uygular. 18 aylık üretimde hiç olay kaybetmedik.
Sorgu Optimizasyonu
Materialized View'lar
Yaygın dashboard sorguları için verileri önceden toplayan materialized view'lar kullanırız. Örneğin dolandırıcılık oranı dashboard'umuz, fraud_detected sayımlarını workspace, ülke ve saate göre toplayan bir materialized view'dan okur. Bu view, bu sorgu için taranan veriyi 2 milyar satırdan 5 milyon satıra indirir.
Projection Sıralaması
ClickHouse projection'ları, veriyi çoğaltmadan bir tablo için alternatif sıralama düzenleri tanımlamamıza olanak tanır. Ziyaretçi zaman çizelgesi sorguları için (workspace_id, visitor_hash, timestamp) ile sıralanmış bir projection ekledik. Projection olmadan, bu sorgular tüm tarih aralıklarını tarardı. Projection ile yalnızca hedef ziyaretçiyi içeren blokları okurlar.
Yaklaşık Fonksiyonlar
Tam sayımların kritik olmadığı dashboard sorguları için ClickHouse'un yaklaşık fonksiyonlarını kullanırız: farklı sayımlar için uniqCombined (%2 hata payı, uniqExact'ten 10 kat hızlı) ve yüzdelik hesaplamaları için quantileTDigest. Dolandırıcılık analitiği dashboard'u yalnızca yaklaşık fonksiyonlar kullanır; bu da tüm dashboard sorgularını 200ms'nin altında tutar.
Performans Rakamları
2 milyar satırlık üretim kümemizdeki temsili sorgu kıyaslamaları şöyle:
Ülkeye göre dolandırıcılık oranı, son 7 gün: 120ms. Ziyaretçi zaman çizelgesi (50 olay): 8ms. Günlük benzersiz ziyaretçiler, son 30 gün: 340ms. Risk skoru dağılımı, son 24 saat: 95ms. Olay sayısına göre ilk 100 cihaz, son 30 gün: 210ms.
Bu rakamlar, uygulama sunucularımızdan ClickHouse kümesine giden ağ gidiş-dönüşünü içerir. Saf sorgu yürütme süresi tipik olarak %30-50 daha düşüktür.
Operasyonel Dersler
Ders 1: Merge gecikmesini izleyin
ClickHouse'un MergeTree motoru, küçük veri part'larını sürekli olarak daha büyük olanlarla birleştirir. Merge'ler geride kalırsa (yüksek insert oranı veya disk I/O rekabeti nedeniyle), sorgular daha fazla part taramak zorunda kaldığından sorgu performansı düşer. Partition başına part sayısını izliyor ve 300'ü aştığında uyarı veriyoruz.
Ders 2: Büyük ALTER TABLE işlemlerinden kaçının
ClickHouse'da 2 milyar satırlık bir tabloya sütun eklemek anlıktır (yalnızca metadata'dır). Ancak bir sütunun tipini değiştirmek tüm veri part'larının yeniden yazılmasını gerektirir — kümemizde 6 saat süren bir işlem. Artık şemayı yalnızca ekleme (append-only) yapılan bir yapı olarak ele alıyoruz: yeni sütunlar serbestçe eklenir, ancak tip değişiklikleri bir migration tablosundan geçer.
Ders 3: TTL'e temkinli yaklaşın
ClickHouse, TTL aracılığıyla otomatik veri süresi dolumunu destekler. events tablomuza 90 günlük bir TTL ayarladık. Püf noktası: TTL silme işlemi merge'ler sırasında gerçekleşir; bu da silinen verinin TTL süresi dolduktan saatler veya günler sonra kalıcı olabileceği anlamına gelir. Uyumluluk açısından kritik silmeler için, belirli bir programda açık ALTER TABLE DELETE sorguları çalıştırıyoruz.
Maliyet
6 düğümlü ClickHouse kümemiz (her düğüm: 32 vCPU, 128 GB RAM, 2 TB NVMe) bare metal hosting'de aylık yaklaşık 8.400 dolara mal olur. Bu, 90 günlük saklama süresiyle 2 milyar satırı depolar ve saniyede 50K insert artı 200 eşzamanlı dashboard sorgusunu kaldırır. Depolanan olay başına maliyet 0,0000042 dolardır — yönetilen bulut veritabanlarındaki karşılaştırılabilir analitikten kat kat daha ucuz.