Bagaimana cara menyimpan deret waktu di mongodb


11

Saya perlu membuat database deret waktu, dan melakukan tugas-tugas berikut:

  • buat seri waktu baru
  • perbarui deret waktu yang ada
  • permintaan satu atau beberapa seri waktu sekaligus (misalnya semua seri waktu untuk tanggal yang sama dll ...)

Apakah Mongo disesuaikan dengan itu dan jika ya, bagaimana saya harus menyusun database? (satu kali seri = satu dokumen? Atau satu dokumen = satu entri dari seri waktu, dan semua dokumen ini merupakan kumpulan yang merupakan seluruh rangkaian waktu?)

Saya agak tersesat di sini dan saya merasa sulit untuk menemukan informasi karena biasanya Mongo disajikan sangat fleksibel sehingga pengguna memiliki pilihan dalam infrastruktur.

Setiap tautan ke tutorial yang secara khusus menjelaskan cara mengelola deret waktu dalam bahasa Mongo sangat disambut.

Terima kasih!


Baca Skema Desain untuk Data Time Series di MongoDB hari ini. Sangat bagus menulis ini.
akauppi

Ada kertas putih yang diperbarui yang membahas time-series dalam MongoDB. mongodb.com/collateral/time-series-best-practices
Robert Walters

Jawaban:


6

Saya menyarankan entri seri waktu tunggal per dokumen. Ada beberapa masalah dengan menyimpan beberapa entri per dokumen:

  • satu dokumen terbatas pada ukuran tertentu (saat ini 16 MB); ini membatasi berapa banyak entri yang dapat disimpan dalam satu dokumen
  • karena lebih banyak entri ditambahkan ke dokumen, seluruh dokumen (dan seri waktu) tidak perlu dihapus dan dialokasikan kembali ke memori yang lebih besar
  • pertanyaan pada sub-dokumen terbatas dibandingkan dengan permintaan pada dokumen biasa
  • dokumen dengan struktur yang sangat datar (seperti satu sub-dokumen untuk setiap detik) tidak memiliki kinerja
  • pengurangan peta bawaan tidak berfungsi dengan baik pada sub-dokumen

Perhatikan juga stempel waktu bawaan ke ObjectId MongoDB default . Anda dapat menggunakan ini jika ketepatan deret waktu kurang dari satu detik.

Berikut adalah contoh dokumen BSON dari pustaka pencatatan peristiwa yang menggunakan MongoDB :

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
    }
}

Karena log peristiwa mirip dengan rangkaian waktu, mungkin ada baiknya mempelajari sisa kode . Ada versi dalam Java, C #, PHP, dan Python.

Berikut ini adalah proyek open source serupa lainnya: Zarkov


[pembaruan] Menanggapi komentar @ RockScience, saya telah menambahkan beberapa referensi lagi:


itu akan menjadi BANYAK dokumen jika seri waktu saya memiliki data intraday selama beberapa tahun !!! bukankah masalah memiliki begitu banyak dokumen? Berasal dari latar belakang sql, saya hanya merasa tidak terlalu efektif untuk memori. (Karena akan ada banyak pengulangan untuk semua titik data dari seri waktu yang sama)
RockScience

@RockScience: MongoDB, seperti banyak basis data NoSQL lainnya, menghindari normalisasi dan efisiensi memori demi hal-hal lain seperti fleksibilitas, kecepatan, dan pengurangan penggunaan CPU. Jika Anda membutuhkan efisiensi memori, MongoDB mungkin bukan solusi yang tepat untuk Anda. MongoDB menyalin nama teks lengkap dari setiap bidang ke setiap dokumen, untuk menangis dengan suara keras! Bagaimanapun, saya telah memperbarui jawaban saya dengan beberapa sumber daya lebih banyak, termasuk studi kasus tentang bagaimana MongoDB digunakan untuk menyimpan rangkaian waktu yang sangat besar.
Leftium


2

Ya tentu saja, basis data NoSQL lebih baik menyimpan data jadwal waktu daripada RDBMS tradisional.

Ya MongoDB sangat disesuaikan dengan kasus penggunaan ini.

-Bagaimana seharusnya Anda menyusun basis data? Satu dokumen = satu input seri waktu VS seri waktu ganda.

Jawabannya adalah menyimpan dalam satu dokumen beberapa kali pengaturan waktu. Memiliki lebih sedikit dokumen akan membantu kinerja dengan lebih sedikit membaca. Salah satu triknya adalah menyiapkan dokumen Anda dengan nilai yang telah ditentukan. Ini akan mengoptimalkan memperbarui dokumen dengan menghindari Padding Catatan .

Berikut adalah contoh skema tentang cara menyimpan jam waktu senilai satu jam secara optimal dengan interval menit:

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

Anda memulai dengan nilai 0, dan kemudian pembaruan akan dioptimalkan. Bacaan dioptimalkan karena satu dokumen dibaca bukan 60. Jika Anda perlu menyimpan data satu hari, atau sebulan Anda melanjutkan dengan teknik yang sama, Anda mendapatkan ide.

Berikut tautan ke tutorial yang secara khusus menjelaskan cara mengelola rangkaian waktu dalam MongoDb dari Blog MongoDb resmi: http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- mongodb


1
Mengumpulkan data dalam dokumen akan lebih baik dari kinerja dan penggunaan sumber daya. Ada tiga skenario skema yang dibahas pada seri waktu yang diperbarui untuk buku putih praktik terbaik MongoDB. mongodb.com/collateral/time-series-best-practices
Robert Walters
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.