mongodbに時系列を保存するにはどうすればよいですか


11

時系列のデータベースを作成し、次のタスクを実行する必要があります。

  • 新しい時系列を作成する
  • 既存の時系列を更新する
  • 一度に1つまたは複数の時系列をクエリします(たとえば、同じ日付のすべての時系列など)。

Mongoはそれに適合していますか?適合している場合、データベースをどのように構成すればよいですか?(1つのタイムセリエ= 1つのドキュメント?または1つのドキュメント=タイムセリエの1つのエントリ。これらのすべてのドキュメントは、時系列全体であるコレクションを形成しますか?)

私はここで少し迷っています。通常、Mongoは非常に柔軟であり、ユーザーがインフラストラクチャで選択できるため、情報を見つけるのが困難です。

Mongoで時系列を管理する方法を具体的に説明するチュートリアルへのリンクは大歓迎です。

ありがとうございました!


今日、MongoDBの時系列データのスキーマ設計をお読みください。これについては非常に良い書き込みです。
akauppi 2014

MongoDBの時系列について説明する最新のホワイトペーパーがあります。 mongodb.com/collat​​eral/time-series-best-practices
ロバートウォルターズ

回答:


6

ドキュメントごとに1つの時系列エントリをお勧めします。ドキュメントごとに複数のエントリを保存すると、いくつかの問題があります。

  • 1つのドキュメントは特定のサイズ(現在は16 MB)に制限されています。これにより、1つのドキュメントに保存できるエントリの数が制限されます
  • ドキュメントにエントリが追加されると、ドキュメント全体(および時系列)が不必要に削除され、より大きなメモリに再割り当てされます。
  • サブドキュメントに対するクエリは、通常のドキュメントに対するクエリに比べて制限されています
  • 非常にフラットな構造のドキュメント(毎秒1つのサブドキュメントなど)はパフォーマンスが良くありません
  • 組み込みのmap-reduceはサブドキュメントではうまく機能しません

また、タイムスタンプがデフォルトのMongoDB ObjectIdに組み込まれていることにも注意してください。時系列の精度が1秒未満の場合に使用できます

ここでのMongoDBを使用してイベントロギングライブラリから例のBSONドキュメントは

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

イベントログは時系列に似ているため、コードの残りの部分を調べる価値があるかもしれません。Java、C#、PHP、Pythonのバージョンがあります。

次に、同様のオープンソースプロジェクトをもう1つ示します。


[更新] @RockScienceのコメントに応えて、さらにいくつかの参照を追加しました:


私の時系列に数日間の日中データがある場合、それは多くのドキュメントになります!!! 非常に多くのドキュメントがあることは問題ではありませんか?SQLのバックグラウンドから来て、私はそれがあまりメモリ効果がないと思います。(同じ時系列のすべてのデータポイントについて多くの繰り返しがあるため)
RockScience 2013

@RockScience:MongoDBは、他の多くのNoSQLデータベースと同様に、柔軟性、速度、CPU使用率の削減などの他の要素を優先して、正規化とメモリ効率を避けています。メモリ効率が必要な場合、MongoDBは適切なソリューションではない可能性があります。MongoDBは、大声で叫ぶために、各フィールドのフルテキスト名をすべてのドキュメントにコピーします。とにかく、MongoDBを使用して非常に大規模な時系列を格納する方法のケーススタディを含む、さらにいくつかのリソースで回答を更新しました。
Leftium 2013

2

私はこの質問をSO(/programming/4814167/storing-time-series-data-relational-or-non)で見つけました。OPは時系列を保存する方法を尋ねます。彼の質問はNoSQLデータベースまたはRDBMSの使用を中心にしていますが、あなたはNoSQLデータベースの使用にかなり慣れているようです。

時系列データの固有のデータベース要件」に関するこの記事も参考になります。

お役に立てれば。


2

はい、間違いなく、NoSQLデータベースは従来のRDBMSよりも時系列データの保存に適しています。

はいMongoDBは、このユースケースに例外的に適合しています。

-データベースをどのように構成する必要がありますか?1つのドキュメント= 1つの時系列入力VS複数の時系列。

答えは、1つのドキュメントに複数の時系列を格納することです。ドキュメントが少ないと、読み取りが少なくなり、パフォーマンスが向上します。1つのトリックは、事前定義された値を使用してドキュメントを準備することです。これにより、レコードのパディングが回避され、ドキュメントの更新が最適化されます。

1分間隔で1時間分の時系列を最適に格納する方法のスキーマの例を次に示します。

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

値0で開始すると、更新が最適化されます。60の代わりに1つのドキュメントが読み取られるため、読み取りは最適化されます。1日分のデータを保存する必要がある場合、または同じ手法で1か月間保存する必要がある場合は、アイデアがわかります。

ここでは、具体的公式MongoDBのブログからMongoDBのに時系列を管理する方法について説明チュートリアルへのリンクがあります: http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- Mongodb


1
ドキュメント内のデータのバケット化は、パフォーマンスとリソースの使用の点で優れています。MongoDBベストプラクティスホワイトペーパーの更新された時系列で説明されている3つのスキーマシナリオがあります。 mongodb.com/collat​​eral/time-series-best-practices
ロバートウォルターズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.