Dağıtılmış görevler için iyi bir günlük kaydı uygulaması nedir?


14

Aşağıdaki ayarlara sahibim:

Birden fazla işçi oluşturun, bir hesaplama yapın ve hesaplama yapıldıktan sonra bunları sonlandırın.

Yani, her seferinde görevi çalıştıran farklı bir örnek olur, böylece her ana bilgisayarın kendi bir günlük dosyası olur, bu çok büyük bir dosya listesine neden olur.

İyi bir uygulama mı? Değilse, bu özel kullanım durumunda görev işlemeyi günlüğe kaydetmenin daha iyi bir yolu ne olabilir?

Not: Altyapım sunucusuz. Şimdilik, (AWS) CloudWatch'a giriş yapıyorum. Ancak, lütfen soruyu AWS'den bağımsız olarak ve mümkün olduğunca sunucusuz bir düzene uygun olarak cevaplayın.

Yanıtlar:


12

"Sunucusuz" çoğunlukla sadece basit bir mikro hizmetiniz olduğu anlamına gelir, genellikle sadece küçük bir web uygulaması veya otomatik olarak bir REST ön ucuna bağlanan tek bir işlev. Daha geleneksel bir web hizmetleri için kullandığınız kavramlar geçerlidir: genellikle uzak sistem günlüğü ve Elastik Arama yazarlarının bir karışımı.

Ağa bağlı veya uzak sistem günlüğü uzun zamandır var ve çevresinde oldukça sağlam bir araç seti var. Merkezi syslog sunucularını çalıştırmanız gerekir, ancak protokol çok basittir ve günlük göndermek için kullanabileceğiniz her dilde saf istemci kitaplıkları vardır. Uzak sistem günlüğü ile ilgili yaygın bir sorun, geleneksel olarak UDP'ye dayalı olmasıdır. Bu, ağır yük altında bazı günlük mesajlarının kaybolabileceği anlamına gelir. Bu, bir kaskad aşırı yüklenmesinden kaçınmaya yardımcı olan iyi bir şey olabilir, ancak farkında olunması gereken bir şeydir. Bazı yeni syslog artalan süreçleri de TCP tabanlı bir protokolü destekler, ancak istemci desteği daha az birleştirilmiştir, bu yüzden sadece araştırmanızı yapın.

Daha yeni fakat çok popüler olan, Elastik Arama'ya giriş yapmaktır. Bu çoğunlukla Kibana kontrol paneli ve Logstash aldı (genellikle ELK, Elastik Arama + Logstash + Kibana olarak adlandırılır) nedeniyle yararlıdır. Amazon, barındırılan bir Elastik Arama seçeneği bile sunarak başlamayı biraz daha kolay hale getiriyor. ES nispeten basit bir REST API kullanır, bu nedenle bir HTTP istemcisi olan herhangi bir dil (okuma: tümü) ES'ye giriş yapmak için uygun olmalıdır, ancak kısmi sistem kesintileri durumunda ağ işlemlerini engellemeye dikkat ettiğinizden emin olun (örn. uygulaması, hiçbir zaman başarılı olmayacak ve kullanıcı isteklerine hizmet vermeyi durduramayacak bir günlük çağrısına takılmaz).

Daha karmaşık günlük topolojileri yalnızca hayal gücünüzle sınırlıdır, ancak bu günlerde Kafka veritabanı / kuyruğu / aramak istediğiniz her şeyi çok karmaşık günlük dağıtım sistemlerinde bir bağlantı noktası olarak çok fazla kullanacaksınız. .

"Sunucusuz" tarafta, genellikle bu sistemlerle doğrudan ağ düzeyinde bütünleşmek isteyeceksiniz, bu nedenle günlük verilerini yerel dosyalara yazmak yerine doğrudan hizmetiniz / işlevinizden syslog veya ES'ye göndermek (belki bunlara yankı yerel hata ayıklama ve geliştirme için).


6

Bu cevap daha çok ölçeklenebilirlik konuları ile ilgilidir - eğer çalışan sayısı fazla olabiliyorsa ve / veya birden fazlası aynı anda yüksek oranda kütük üretebiliyorsa.

Evet, aynı anda birden çok günlük dosyası kullanmak iyi bir uygulamadır.

Gerçek zamanlı olarak birden fazla işçinin tek bir günlük dosyası günlüklerinde birleştirmeye çalışmak sorun yaratacaktır:

  • mesaj kaybını önlemek için engelleme mekanizmalarının kullanılması işçileri yavaşlatır
  • günlük iletileri, birleştirilmiş günlük dosyasında bozuk olabilir
  • sınırlı yazma hızı nedeniyle günlükleri birleştiren merkezi bir günlük kaydı tesisi aşırı yüklenebilir, iletiler kaybolur

Paylaşım günlükleri (aynı anda birden çok günlük dosyasını kullanarak), bazı barındırma sağlayıcıları tarafından yüksek performanslı, ölçeklenebilir merkezi günlük hizmetleri sunan bir tekniktir. Örneğin, günlükleri dosyalara dışa aktarırken Google'ın StackDriver Günlüğü birden çok gölgeli günlük dosyası üretir. Gönderen Google Bulut Depolama Günlüğü girdileri :

Ne zaman günlükleri dışa bir Cloud Storage grubuna, Stackdriver Günlüğü kovaya dosya kümesi yazar. Dosyalar, günlük türüne ve tarihe göre dizin hiyerarşilerinde düzenlenir. Günlük türü, gibi basit bir ad syslogveya benzer bir ad olabilir appengine.googleapis.com/request_log. Bu günlükler adlı bir grupta depolanmışsa my-gcs-bucket, dizinler aşağıdaki örnekte olduğu gibi adlandırılır:

my-gcs-bucket/syslog/YYYY/MM/DD/
my-gcs-bucket/appengine.googleapis.com/request_log/YYYY/MM/DD/

Tek bir grup birden çok günlük türünden günlük içerebilir.

Yaprak dizinleri ( DD/), her biri dosya adında belirtilen bir süre için dışa aktarılan günlük girişlerini tutan birden fazla dosya içerir. Dosyalar parçalanır ve adları bir parça numarasıyla biter Snveya An(n = 0, 1, 2, ...). Örneğin, içinde saklanabilecek iki dosya şunlardır directory my-gcs-bucket/syslog/2015/01/13/:

08:00:00_08:59:59_S0.json
08:00:00_08:59:59_S1.json

Bu iki dosya birlikte syslog0800 UTC'den başlayan saat boyunca tüm örnekler için günlük girişlerini içerir . Tüm günlük girdilerini almak için, her zaman dilimi için tüm parçaları (bu durumda, dosya parçaları 0 ve 1'i) okumalısınız. Yazılan dosya parçaları sayısı, günlük kayıtlarının hacmine bağlı olarak her zaman aralığı için değişebilir.

Bu tür yüksek performanslı günlükleme hizmetleri ayrıca dosyalara günlük kaydı için alternatifler sunabilir, böylece günlük dosyalarının yönetimi ilgiliyse tamamen önlenebilir:

Son olarak - gerçek zamanlı günlük dosyası birleştirme, birden fazla günlük dosyasına sahip olmak çevrimdışı günlük yönetimine yardımcı olabilirse:

  • aşamalı günlük yedekleme, sıkıştırma, arşivleme ve nihai bertaraf planlarını tasarlamak kolaydır
  • birden çok günlük grubunun (logfiles) paralel işlenmesi mümkündür, bu da darboğaz etkilerini azaltır / önler
  • dosya bölme ve yeniden yazma gerekmez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.