SNMP kullanarak (muhtemelen) 5 dakikalık aralıklarla CPU kullanımı, disk kullanımı, sıcaklık vb. Gibi çeşitli metriklerle ilgili verileri toplayan bir sistem oluşturuyorum. Nihai amaç, sistemin bir kullanıcısına zaman serisi grafikleri şeklinde görselleştirmeler sağlamaktır.
Geçmişte RRDTool kullanmaya baktım, ancak yakalanan verileri süresiz olarak saklamanın projem için önemli olduğu için reddedildim ve yakalanan verilere daha yüksek seviye ve daha esnek erişim istiyorum. Yani sorum gerçekten:
Daha da iyisi, grafik için verileri sorgularken performansla ilgili bir ilişkisel veritabanı (MySQL veya PostgreSQL gibi) veya ilişkisel olmayan veya NoSQL veritabanı (MongoDB veya Redis gibi).
ilişkisel
İlişkisel bir veritabanı göz önüne alındığında, data_instances
tüm cihazlar için ölçülen her metrik için yakalanan her veri örneğini, aşağıdaki alanlarla depolanacak bir tablo kullanacağım :
Alanlar: id
fk_to_device
fk_to_metric
metric_value
timestamp
Belirli bir cihazda belirli bir metrik için bir grafik çizmek istediğimde , diğer cihazları filtreleyen bu tekil tabloyu ve bu cihaz için analiz edilen diğer metrikleri sorgulamalıyım :
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
Bu tablodaki satır sayısı:
d * m_d * f * t
burada d
sayısıdır cihazlar , m_d
biriktiricidir metrik değerlerin sayısı , tüm cihazlar için kaydedilen f
bir frekans veri için sıralı olarak çağırıldığında ve edildiği t
toplam miktarı zaman , sistem verilerini toplamak olmuştur.
Bir yıl boyunca her 5 dakikada bir 3 cihaz için 10 ölçüm kaydeden bir kullanıcı için 5 milyonun biraz altında kayıt olurdu .
endeksleri
Dizinler olmadan fk_to_device
ve fk_to_metric
sürekli olarak genişleyen bu tablo çok fazla zaman alacaktır. Bu nedenle, yukarıda belirtilen alanların endekslenmesi ve ayrıca timestamp
(yerelleştirilmiş periyotlarla grafikler oluşturmak için) bir gerekliliktir.
İlişkisel Olmayan (NoSQL)
MongoDB bir koleksiyon kavramına sahiptir, tabloların aksine bunlar kurulum olmadan programlı olarak oluşturulabilir. Bunlarla, her bir cihaz için veri depolamasını, hatta her cihaz için kaydedilen her bir metriği bölümlere ayırabilirim.
NoSQL ile hiçbir deneyime sahip ve indeksleme gibi herhangi bir sorgu performans artırıcı özellikler sağlayıp sağlamadıklarını bilmiyorum, ancak önceki paragraf, verilerin NoSQL altında depolandığı yapıda geleneksel ilişkisel sorgu çalışmalarının çoğunu yapmayı öneriyor.
Kararsız
Doğru endekslemeye sahip ilişkisel bir çözüm, yıl içinde taramayı azaltır mı? Yoksa NoSQL yaklaşımlarının koleksiyon tabanlı yapısı (saklanan verilerdeki zihinsel modelimle eşleşen) fark edilir bir fayda sağlıyor mu?