Saya membuat sistem yang mengumpulkan data untuk perangkat pada berbagai metrik seperti pemanfaatan CPU, pemanfaatan disk, suhu, dll. Pada interval (mungkin) 5 menit menggunakan SNMP. Tujuan utamanya adalah untuk memberikan visualisasi kepada pengguna sistem dalam bentuk grafik deret waktu.
Saya telah melihat menggunakan RRDTool di masa lalu, tetapi menolaknya karena menyimpan data yang diambil itu penting untuk proyek saya, dan saya ingin tingkat yang lebih tinggi dan akses yang lebih fleksibel ke data yang diambil. Jadi pertanyaan saya benar-benar:
Apa yang lebih baik, database relasional (seperti MySQL atau PostgreSQL) atau database non-relasional atau NoSQL (seperti MongoDB atau Redis) berkenaan dengan kinerja ketika meminta data untuk membuat grafik.
Relasional
Diberikan database relasional, saya akan menggunakan data_instances
tabel, di mana akan disimpan setiap contoh data yang diambil untuk setiap metrik yang diukur untuk semua perangkat, dengan bidang-bidang berikut:
Bidang: id
fk_to_device
fk_to_metric
metric_value
timestamp
Ketika saya ingin menggambar grafik untuk metrik tertentu pada perangkat tertentu, saya harus meminta tabel tunggal ini memfilter perangkat lain, dan metrik lainnya sedang dianalisis untuk perangkat ini:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
Jumlah baris dalam tabel ini adalah:
d * m_d * f * t
di mana d
jumlah perangkat , m_d
adalah jumlah akumulatif dari metrik yang direkam untuk semua perangkat, f
adalah frekuensi di mana data disurvei dan t
adalah jumlah total waktu sistem telah mengumpulkan data.
Untuk pengguna yang merekam 10 metrik untuk 3 perangkat setiap 5 menit selama setahun, kami hanya memiliki di bawah 5 juta catatan.
Indeks
Tanpa indeks fk_to_device
dan fk_to_metric
pemindaian tabel yang terus berkembang ini akan memakan waktu terlalu banyak. Jadi pengindeksan bidang tersebut dan juga timestamp
(untuk membuat grafik dengan periode lokal) adalah persyaratan.
Non-Relasional (NoSQL)
MongoDB memiliki konsep koleksi , tidak seperti tabel ini dapat dibuat secara pemrograman tanpa setup. Dengan ini saya bisa mempartisi penyimpanan data untuk setiap perangkat, atau bahkan setiap metrik yang direkam untuk setiap perangkat.
Saya tidak punya pengalaman dengan NoSQL dan tidak tahu apakah mereka menyediakan fitur peningkatan kinerja kueri seperti pengindeksan, namun paragraf sebelumnya mengusulkan melakukan sebagian besar pekerjaan kueri relasional tradisional dalam struktur di mana data disimpan di bawah NoSQL.
Bimbang
Apakah solusi relasional dengan pengindeksan yang benar akan berkurang menjadi perayapan dalam tahun ini? Atau apakah struktur pengumpulan berdasarkan pendekatan NoSQL (yang cocok dengan model mental saya dari data yang disimpan) memberikan manfaat yang nyata?