Logları OpenSearch'e gönderirken Fluent Bit ile arasına Kafka/Redis buffer koymalı mıyım?
Soru
Go ve Laravel servislerimizin loglarını merkezi bir OpenSearch kümesine topluyoruz. Akış şöyle: konteynerler stdout'a basıyor, sunuculardaki Fluent Bit yakalayıp doğrudan OpenSearch API'ına gönderiyor. Ama saniyede 40.000+ log satırını geçtiğimiz anlarda OpenSearch indexing'de darboğaz oluşuyor; Fluent Bit yetiştiremeyince backpressure başlıyor ve uygulama konteynerlerinin I/O'su bloke oluyor. Araya buffer olarak Redis listesi mi yoksa Kafka mı koymalıyım? Veri kaybını (at-least-once) önlerken sunucularda disk/bellek şişmesini nasıl engellerim?
Cevap
Kısa cevap: Evet, araya bir buffer koymak doğru hamle — ama Redis listesi ile Kafka arasındaki seçim, kabul ettiğin garanti seviyesine bağlı.
Yaşadığın şey klasik backpressure: OpenSearch’in indexleme hızı üretim hızının altına düşünce zincir geriye doğru tıkanıyor, en sonunda uygulama konteynerinin stdout’u bloke oluyor. Çözüm, üretimi (uygulama) tüketimden (OpenSearch) ayıran dayanıklı bir ara katman.
- Önce Fluent Bit’in kendi disk buffer’ını aç.
storage.type filesystemve output tarafındastorage.total_limit_sizeile Fluent Bit, OpenSearch yavaşladığında logu RAM yerine diske yazar; uygulamaya doğru basınç gitmez. Harici bir kuyruk eklemeden önce ölçülmesi gereken ilk şey bu — çoğu zaman tek ihtiyacın olan budur. - Redis listesi: ucuz ama riskli. Bellekte tutar;
RPUSH/LPOPbasit ama AOF kapalıysa bir restart’ta veriyi kaybedersin ve liste şişerse Redis’in RAM’ini doldurur. Kaybı dert olmayan loglar için buffer olarak iş görür, finansal/audit logu için değil. - Kafka: 40k/s’in doğal sahası. Disk tabanlı, retention’lı, replay edilebilir, consumer group’larıyla yatay tüketim.
at-least-once’ı doğal verir. Bedeli operasyonel: kümeyi ayağa kaldırıp beslemek gerekir. Hacmin kalıcıysa doğru araç odur. - at-least-once’ı consumer’da idempotent kıl. OpenSearch’e yazarken her belgeye deterministik bir
_idver (örn. kaynak+offset hash’i). Aynı mesaj iki kez gelse de aynı_idüstüne yazar; mükerrer kayıt oluşmaz.
Sonuç: Önce Fluent Bit filesystem buffer + OpenSearch tarafında bulk ayarı ve ISM (rollover) ile indexlemeyi rahatlat. Bu yetmiyorsa Kafka’ya geç — Redis’i yalnızca kaybını göze alabildiğin loglarda kullan. Ve altın kural: uygulama konteynerini log yazarken asla bloklatma. Log fire-and-forget olmalı; kritik veriyi (ödeme, audit) log hattı üzerinden taşıma, onu ayrı ve garantili bir yoldan yürüt.
İlgili Yazılar
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.