SNMPを使用して(おそらく)5分間隔で、CPU使用率、ディスク使用率、温度などのさまざまなメトリックに関するデータをデバイスにポーリングするシステムを作成しています。最終的な目標は、システムのユーザーに時系列グラフの形で視覚化を提供することです。
私は過去にRRDToolの使用を検討しましたが、キャプチャされたデータを無期限に保存することは私のプロジェクトにとって重要であり、キャプチャされたデータへのより高いレベルでより柔軟なアクセスが必要であるため拒否しました。だから私の質問は本当に:
グラフ化のためにデータをクエリするときのパフォーマンスに関しては、リレーショナルデータベース(MySQLやPostgreSQLなど)または非リレーショナルデータベースやNoSQLデータベース(MongoDBやRedisなど)のほうが優れています。
関連した
リレーショナルデータベースが与えられた場合、data_instances
テーブルを使用します。このテーブルには、すべてのデバイスで測定されるすべてのメトリックについてキャプチャされたデータのすべてのインスタンスが格納され、次のフィールドが含まれます。
田畑: id
fk_to_device
fk_to_metric
metric_value
timestamp
特定のデバイスの特定のメトリックのグラフを描画する場合、他のデバイスを除外するこの特異なテーブルと、このデバイスに対して分析されている他のメトリックをクエリする必要があります。
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
このテーブルの行数は次のようになります。
d * m_d * f * t
ここd
で、はデバイスの数、m_d
はすべてのデバイスについて記録されているメトリックの累積数、f
はデータがポーリングされる頻度、およびシステムがデータを収集していt
た合計時間です。
年間5分ごとに3台のデバイスの10のメトリックを記録するユーザーの場合、500万レコード弱になります。
インデックス
インデックスを付けずにこの継続的に拡張するテーブルfk_to_device
をfk_to_metric
スキャンしないと、時間がかかりすぎます。したがって、前述のフィールドにインデックスを付けることと、timestamp
(ローカライズされた期間でグラフを作成するために)要件になります。
非リレーショナル(NoSQL)
MongoDBにはコレクションという概念があります。テーブルとは異なり、これらは設定なしでプログラムで作成できます。これらを使用して、デバイスごとにデータのストレージを分割したり、デバイスごとに記録されたメトリックを分割したりすることもできました。
私はNoSQLの経験がなく、インデックス作成などのクエリパフォーマンス向上機能が提供されているかどうかはわかりませんが、前の段落では、データがNoSQLに格納される構造で従来のリレーショナルクエリ作業のほとんどを実行することを提案しています。
未定
正しいインデックス付けを使用するリレーショナルソリューションは、1年以内にクロールに減少しますか?または、コレクションに基づくNoSQLアプローチの構造(これは、格納されたデータの私のメンタルモデルに一致します)は顕著な利点を提供しますか?