Olay günlüğü metrikleri için veri mimarisi?


17

Hizmetimin devam eden çok sayıda kullanıcı etkinliği var ve " D tarihinden bu yana T olay türünün oluşumunu say" gibi şeyler yapmak istiyoruz .

İki temel karar vermeye çalışıyoruz:

  1. Ne saklanır? Her etkinliğin depolanması ve sadece agregaların depolanması

    • (Olay günlüğü stili) her olayı günlüğe kaydeder ve daha sonra sayar.
    • (Zaman serisi stili) her gün için tek bir toplu " D tarihi için E etkinliği sayısı" nı depolar
  2. Veriler nerede saklanır?

    • İlişkisel bir veritabanında (özellikle MySQL)
    • İlişkisel olmayan (NoSQL) bir veritabanında
    • Düz günlük dosyalarında (üzerinden ağ üzerinden merkezi olarak toplanır syslog-ng)

Standart uygulama nedir / farklı sistem türlerini karşılaştırma hakkında daha fazla bilgiyi nerede bulabilirim?


Ek detaylar:

  • Toplam etkinlik akışı büyüktür, günde potansiyel olarak yüz binlerce giriş
  • Ancak şu andaki ihtiyacımız sadece içindeki belirli olayları saymak
  • Ham verilere veya toplama sonuçlarına gerçek zamanlı erişime gerek yoktur.

IMHO, "tüm olayları dosyalara kaydet, akışı filtrelemek ve birleştirmek için daha sonra tara


1
Bu projede şansın var mı?
hiwaylon

2
@hiwaylon Hibrit bir sistem kullandık: 1) Mümkünse MySQL (düşük hacimli) (birleştirme kullanımını kolaylaştırır SELECT...GROUP BY, SELECTs sonuçlarını kolayca saklayabilir ), 2) basit büyük ölçekli toplama ve görselleştirme için Graphite kullanarak ve 3) referans için tüm olayların günlüğe kaydedilmesi ve veri akışının detaylarının gerçek zamanlı olarak izlenmesi için. Her biri farklı şekillerde değerli olmuştur.
elliot42

Harika bir çözüm gibi geliyor, yaptığımızla oldukça benzer.
Ocak'ta hiwaylon

1
Bir yıl sonra GÜNCELLEME, her şeyi kaydeden bir sistem oluşturduk ve düzenli olarak şeyleri sayan günlükler üzerinde yineledik ve daha sonra bu sayılan sayıları bir veritabanında sakladık (bir zaman serisi veritabanı olabilirdi / olması gerekirdi, ancak MySQL yeterliydi). Bu birkaç haftalık bir çalışma oldu, ancak şaşırtıcı derecede güçlü / hızlı bir yaklaşım oldu - sadece günlüğe kaydedilmiş JSON üzerinde yinelenen kodunuz olduğunda, çok fazla meta veri eklemek kolaydır ve kodunuzun tam olarak ne için esnek kurallara sahip olması kolaydır saymak istiyor.
elliot42

1
Güncelleme 2016: Kafka bu tür şeyleri bugünlerde, en azından ham depolama için yapabilir. Daha sonra bunları büyük bir MapReduce veya Spark işine ya da sorgulamak / toplamak için Vertica vb. Gibi büyük bir depoya yapıştırabilirsiniz.
elliot42

Yanıtlar:


4

Her zaman bağlıdır, size yeni bir bakış açısı sunmak için tavsiyemi vereceğim

Ne saklanır? Her etkinliğin depolanması ve sadece agregaların depolanması

(Olay günlüğü stili) her olayı günlüğe kaydeder ve daha sonra sayar.

Herhangi bir ayrıntıyı kaçırmamayı planlıyorsanız, şimdi alakalı olmasalar bile, gözlerimde en iyi yaklaşım budur, çünkü bazen, sonuçlar geldiğinde, X veya Y için alakalı olmadıkları başka olaylar bulursunuz , veya herhangi bir ekstra bilgi getirmediler, ancak bazı analizlerden sonra, basitçe yapar ve bunu da izlemeniz gerekir, o zaman kaydedilen ancak hesaplanmadığı için resme ekleyebilmeniz biraz zaman alacaktır. .

(Zaman serisi stili) her gün için tek bir toplu "D tarihi için E etkinliği sayısı" nı depolar

Yarın uygulamak ve kullanmak istiyorsanız, işe yarayabilir, ancak yeni bir gereksiniminiz varsa veya herhangi bir nedenle atladığınız başka bir etkinlikle bir korelasyon bulursanız, bu yeni etkinliği eklemeniz ve biraz beklemeniz gerekir. güzel toplama seviyelerine sahip olmak için uzun zaman

Veriler nerede saklanır?

İlişkisel bir veritabanında (özellikle MySQL)

Tüm seçenekleri kaydetmek için giderseniz ilk seçenek bir DB için ağır olabilir, bu yüzden korkarım MySQL çok küçük olabilir ve RDBMS çözümleri için gitmek istiyorsanız, PostgreSQL gibi daha büyük veya Oracle veya DB2 gibi tescilli düşünebilirsiniz .

Ancak toplama için iyi bir seçim olacaktır, üretilen yüke bağlı olarak kodda toplayabilir ve bu toplamaları DB'ye ekleyebilirsiniz.

İlişkisel olmayan (NoSQL) bir veritabanında

Bu çözüm için giderseniz , wikipedia'da güzel okumayı takip etmek istediğiniz yaklaşımı size yardımcı olabilir, bu konuda size çok yardımcı olamıyorum çünkü yeterli tecrübem yok, çoğunlukla rdbms kullanıyorum.

Düz günlük dosyalarında (sistem üzerinden ağ üzerinden merkezi olarak toplanır)

Şahsen bu seçenek için gitmenizi önermem, Dosya çok büyürse, ayrıştırmak daha zor olurdu, ama yine de asıl amacı bilmiyorum, bir sistemi takip etmek veya sadece bir günlüğü kontrol etmek dosya ...

Umarım yardımcı olur!


1
Günlük dosyaları boyut veya uzunlukta döndürülmelidir. Son endişenin bir sorun olacağını sanmıyorum.
hiwaylon

1

Günlükleri ayrıştırmak, saymak ve sonuçları bir DB'de saklamak için fikrinizin geçerli olduğunu düşünüyorum. Zaten DB tüm bu ham günlükleri istediğiniz emin değilim (Ben senin yurttaşların önerdiğini söylediğini düşünüyorum). Günlüklerde dosyalarınız zaten var, değil mi? Bunları arşivleyebilirsiniz. Bu bitin gerçekten kullanım durumunuza bağlı olduğunu düşünüyorum.

Ayrıca @ Thorbjørn Ravn Andersen ile "yorum cevabını" soruya taşıma konusunda hemfikir.


1

Kullanım amacınıza bağlıdır. Toplam değerleri gösteren standart bir grafiğiniz veya raporunuz varsa, olayları geldikçe filtrelemek ve bunları ilgili grupta toplamak istersiniz. Belirli olayları ayrıntılı bir şekilde incelemeniz gerekiyorsa veya daha sonra geri dönüp olayları daha sonra yeniden analiz etmek / yeniden kategorize etmek isteyebileceğinizi düşünüyorsanız, tek tek etkinlikleri depolamanız gerekir.

Zaman ve alanınız varsa, tipik olarak yapmaktan hoşlandığım veriler toplamaktır, ancak ayrıntıları (sıkıştırılmış) bir dosyada saklamaktır. Ayrıntılara kolayca erişilebilir olmak zorunda değilim, çünkü neredeyse hiç onlara ihtiyacım yok, ancak sınıflandırma kriterleri değişirse toplu yeniden işleme için kullanılabilirler.


msgstr "verileri toplayın, ancak ayrıntıları (sıkıştırılmış) bir dosyada saklayın". Özellikle büyük düşünce, teşekkürler!
elliot42

Bahsedilen OP'nin günlüğe kaydedilmesi ve geldikçe filtreleme + toplama yapılmasıyla ilgili endişeler var mı? Günlük hacmi yüksekse ve / veya toplama önemsizse tehlikeli bir darboğaz olabilir.
hiwaylon

OP, "günde yüz binlerce olay" hacminden bahsetti. Günde bir milyon olay dakikada yedi yüzden az veya yaklaşık on bir saniyedir. Giriş uzun bir XML değilse, ortalama sunucunuz bunu terlemeden işleyebilmelidir. Yine de, çözümü tasarlarken (ve dağıtırken) kesinlikle dikkate alınması gereken bir şey.
TMN

1

Herhangi bir mimari karar, iş ihtiyaçları tarafından yönlendirilmelidir. Sizin durumunuzda, günlük sisteminizden hangi bilgileri almak istediğiniz hakkında daha net bir fikriniz olmalı ve nasıl saklanacağınıza, bu bilgileri ne sıklıkta isteyeceğinize ve sonucu almak için ne kadar bekleyebileceğinize karar vermelisiniz. . Günlük toplayıcıların, olay korelatörlerinin ve benzer uygulamaların tasarımını yönlendiren budur.

Size fikrimi vermek yerine, geliştirmeye çalıştığınız şeye benzer bazı uygulamalara bakmanızı öneririm. Bazıları, geliştirmeyi düşündüğünüzden çok daha güçlü olabilir, ancak takip edilen mimariye ve depolama politikalarına bakarsanız zarar vermez. Profesyonel tarafta, RSA ve Arcsight gibi SIEM uygulamalarınız var ve Açık Kaynak tarafında Kiwi veya OSSIM (aynı zamanda profesyonel bir cihaz tabanlı versiyona sahip) gibi girişimler var.

Dikkate alınması gereken başka bir şey, araç tarafından elde edilen sonuçları kullanmaya başladığınızda, daha fazla bilgi ve daha ayrıntılı bir bilgi için yönetiminizden çok fazla istek almaya başlayacağınızdır. Bu yüzden ... dikkatlice kullanın ve ufuktaki görüşünüzle planlayın. Size daha fazla iş verebilir, ancak kesinlikle çok fazla destek ve görünürlük elde edebilirsiniz (basınç pakete gelir).

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.