Zaman serilerini mongodb'da nasıl saklamalıyım


11

Zaman serisi bir veritabanı oluşturmak ve aşağıdaki görevleri gerçekleştirmek gerekir:

  • yeni zaman serileri oluştur
  • mevcut zaman serilerini güncelle
  • aynı anda bir veya birkaç zaman serisini sorgulayın (örneğin, aynı tarih için tüm zaman serileri vb.)

Mongo buna uyarlanmış mı ve evet ise, veritabanını nasıl yapılandırmalıyım? (bir kez serie = bir belge? Veya bir belge = zaman serisinin bir girişi ve tüm bu belgeler tüm zaman serileri olan koleksiyonu oluşturur?)

Burada biraz kayboldum ve genellikle Mongo çok esnek sunulduğu için herhangi bir bilgi bulmakta zorlanıyorum, böylece kullanıcı altyapıda seçim yapabiliyor.

Moğol'daki zaman serilerinin nasıl yönetileceğini özel olarak açıklayan herhangi bir öğretici bağlantısı çok hoş geldiniz.

Teşekkür ederim!


Okuma MongoDB Zaman Serisi Verileri için Şema Tasarım bugün. Bu konuda çok iyi bir yazı.
akauppi

MongoDB'de zaman serilerini tartışan güncellenmiş bir teknik inceleme var. mongodb.com/collateral/time-series-best-practices
Robert Walters

Yanıtlar:


6

Doküman başına tek bir zaman serisi girişi öneriyorum. Doküman başına birden fazla giriş saklama konusunda bazı sorunlar var:

  • tek bir belge belirli bir boyutla sınırlıdır (şu anda 16 MB); bu, tek bir belgede kaç girişin depolanabileceğini sınırlar
  • bir belgeye daha fazla giriş eklendiğinden, tüm belge (ve zaman serileri) gereksiz yere silinecek ve daha büyük bir belleğe yeniden tahsis edilecektir
  • alt belgelerdeki sorgular normal belgelerdeki sorgularla karşılaştırıldığında sınırlıdır
  • çok düz yapıya sahip belgeler (her saniye için bir alt belge gibi) performans göstermez
  • yerleşik harita küçültme alt belgelerde de çalışmaz

Ayrıca, zaman damgasının varsayılan MongoDB ObjectId'de yerleşik olduğunu unutmayın . Zaman serisi hassasiyeti bir saniyeden azsa bunu kullanabilirsiniz .

İşte bir olan MongoDB kullanan bir olay günlüğü kütüphanesinden örnek BSON belge :

Example format of generated bson document:
{
    'thread': -1216977216,
    'level': 'ERROR',
    'timestamp': Timestamp(1290895671, 63),
    'message': 'test message',
    'fileName': '/var/projects/python/log4mongo-python/tests/test_mongo_handler.py',
    'lineNumber': 38,
    'method': 'test_emit_exception',
    'loggerName':  'testLogger',
    'exception': {
        'stackTrace': 'Traceback (most recent call last):
                       File "/var/projects/python/log4mongo-python/tests/test_mongo_handler.py", line 36, in test_emit_exception
                       raise Exception(\'exc1\')
                       Exception: exc1',
        'message': 'exc1',
        'code': 0
    }
}

Bir olay günlüğü bir zaman serisine benzer olduğundan , kodun geri kalanını incelemeye değer olabilir . Java, C #, PHP ve Python sürümleri vardır.

İşte benzer bir açık kaynak projesi: Zarkov


[güncelleme] @ RockScience'ın yorumuna yanıt olarak, birkaç referans daha ekledim:


Eğer zaman serim birkaç yıl boyunca gün içi verisi varsa bu bir sürü LOT olacak !!! bu kadar çok belgeye sahip olmak sorun değil mi? Bir sql arka plan geliyor, sadece çok bellek etkili bulmuyorum. (Aynı zaman serisinin tüm veri noktası için çok fazla tekrar olacağı için)
RockScience

@RockScience: MongoDB, diğer pek çok NoSQL veritabanı gibi, esneklik, hız ve daha az CPU kullanımı gibi diğer şeylerin lehine normalizasyon ve bellek verimliliğinden kaçınır. Bellek verimliliğine ihtiyacınız varsa MongoDB sizin için doğru çözüm olmayabilir. MongoDB , yüksek sesle ağlamak için her alanın tam metin adını her belgeye kopyalar ! Her neyse, cevabımı MongoDB'nin çok büyük bir zaman serisini depolamak için nasıl kullanıldığına dair bir örnek olay da dahil olmak üzere birkaç kaynakla güncelledim.
Leftium


2

Evet kesinlikle, NoSQL veritabanı geleneksel RDBMS'den daha fazla zaman çizelgesi verisi depolamaya daha uygundur.

Evet MongoDB, istisnai olarak bu kullanım durumuna uyarlanmıştır.

- Veritabanını nasıl yapılandırmalısınız? Bir belge = bir zaman serisi girişi VS çoklu zaman serisi.

Cevap bir belgede birden çok kez saklamaktır. Daha az belgeye sahip olmak, daha az okuma ile performansa yardımcı olacaktır. Bir numara, belgenizi önceden tanımlanmış değerlerle hazırlamaktır. Bu, Kayıt Dolgusu'ndan kaçınarak belgenin güncellenmesini optimize eder .

Aşağıda, bir dakikalık aralıklarla bir saatlik değere sahip zaman çizelgelerinin en iyi şekilde nasıl depolanacağına ilişkin bir şema örneği verilmiştir:

{
  timestamp_hour: ISODate("2015-07-02T23:00:00.000Z"),
  type: memory_used”,
  values: {
    0: 999999,
    1: 1000000, 
    …,
    58: 0,
    59: 0
  }
}

0 değeriyle başlatırsınız ve güncellemeler en iyi duruma getirilir. Okumalar optimize edilmiştir, çünkü 60 yerine bir belge okunur. Bir günlük veri depolamanız gerekiyorsa veya aynı teknikle bir ay devam ederseniz, fikir elde edersiniz.

Resmi MongoDb Blogundan MongoDb'de zaman serilerinin nasıl yönetileceğini özel olarak açıklayan bir eğiticinin bağlantısı: http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- mongodb


1
Belgede verilerin bölümlenmesi performans ve kaynak kullanımından daha iyi olacaktır. MongoDB en iyi uygulamaları tanıtım belgesi için güncellenmiş zaman serisinde tartışılan üç şema senaryosu vardır. mongodb.com/collateral/time-series-best-practices
Robert Walters
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.