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ı.
Kısa cevap
Yaşadığın şey klasik backpressure: OpenSearch’in indeksleme 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.
Neden
-
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’ını 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.
Ne yapmalı
-
Ö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. -
Hacim kalıcıysa Kafka’ya geç. Buffer’ı bir kuyruğa taşıma kararını 40k/s’in geçici bir tepe mi yoksa yeni taban mı olduğuna bakarak ver; geçici tepeler için disk buffer yeter.
-
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. Kuyruk tarafının worker ve yeniden deneme mekaniği için Laravel queue ve Supervisor yazısına bakabilirsin.
Sonuç: Önce Fluent Bit filesystem buffer + OpenSearch tarafında bulk ayarı ve ISM (rollover) ile indekslemeyi 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.