web-dev-qa-db-ja.com

大きな時系列データを効率的に保存する方法は?

非常に大量の時系列データを保存してクエリできるようにする必要があります。

データのプロパティは次のとおりです。

  • シリーズ数:約12.000(12,000)
  • 全世界のデータポイント数:1か月あたり約500.000.000(5億)
  • 混合値タイプ:データポイントの大部分は浮動小数点値で、残りは文字列です
  • サンプリング周期:シリーズ間およびシリーズ内の変数
  • タイムスタンプ:ミリ秒の精度
  • データ保持期間:減衰またはダウンサンプリングなしで数年
  • データアーカイブはほぼリアルタイムで構築する必要がありますが、妥当な遅延(約1時間)は許容されます
  • 過去のデータは必要に応じて再構築できますが、コストがかかります
  • 時々、しかし非常にまれに、いくつかの過去のデータを更新する必要がある

想定されるクエリのプロパティ:

  • データに対するほとんどのクエリはタイムスタンプベースのクエリになります。 1日から数か月/年までの範囲。 90%以上が最新のデータに対するクエリになります

その他の要件:

  • ソリューションは無料のビールのように無料でなければならず、できればオープンソースです

私の最初の考えは、SQLデータベースの代わりにPyTables/Pandas with HDF5 files をバックエンドの格納として使用することでした。

質問:

  1. PyTables/Pandasが「最良の」ルートであると仮定すると、データをいくつかのHDFファイルに分割し、それぞれが所定の期間にわたるか、すべてを巨大になる単一のファイル?

  2. 固定形式とテーブル形式のどちらを選びますか?私には、シリーズ全体がおそらくRAMそして、テーブル形式のインデックスを必要とせずにメモリ内でスライスできます。

そしてそれがではない最善のアプローチである場合、このデータストアをどのように構造化するべきか、またはどのテクノロジーを検討すべきですか?大量の時系列データの保存に取り組むのは私が最初ではありませんが、この課題を解決するための一般的なアプローチは何ですか?


私が検討した他のアプローチ:

  • 配列データベース:配列の開始時間と終了時間、および配列のサンプリング周期のみを保存する必要があるため、これらは一定のサンプリング周期を持つ時系列に最適であり、配列自体の値のみとインデックス付けが簡単です。しかし、シリーズ自体の中で可変サンプリング期間を使用する場合、タイムスタンプと値の関係をより近づける必要があるため、私の見解では、配列DBMSにはあまり適していません。
  • タイムスタンプ、paramID、値を列として持つ標準SQLデータベースですが、その性質上、クエリに対して大量のディスクI/Oを要求します
28
flyingmig

graphite プロジェクトの一部である carbonwhisper をご覧ください。 Carbonは非常に大量の時系列データを処理できます。しかし、ドキュメントを読んだところで(使用してから数年が経過しています)、それは数値データのみです。文字列データもあるので、これは役に立たないかもしれません。ただし、大量のデータを迅速に処理する方法について、いくつかの知識を得ることができるかもしれません。

Orbitzでグラファイトが最初に生産されたとき、どれほど適切にスケーリングできるかを理解するために、グラファイトは 160,000メトリック/分 を処理していました。

5
Bryan Oakley

InfluxDB は、Goで記述されたオープンソースのデータベースです。特に時系列データを処理するように作成されており、Cassandraと比較してはるかに優れたパフォーマンスを示す ベンチマークを公開しています

InfluxDBのパフォーマンスはCassandra 3つすべてのテストで4.5倍の書き込みスループットで、10.8倍のディスクスペースを使用し、テストされたクエリで最大168倍の応答時間を実現しました。

3
Dan Dascalescu

列指向のデータベースをチェックアウトすることもできます。配列データベースの意味がわかりませんが、提案されているアプローチを使用すると、タイムフレームごとに動的に値の数を設定できます。同じタイムスタンプに複数の値を持つこともできます。興味深い部分は、同じタイムスタンプで測定された値がある場合、それらを追加の列として保存できることです(たとえば、温度と湿度を測定するセンサー、株式取引価格と取引のサイズなど)。列指向の性質のため、100列のテーブルを作成できますが、クエリが5列のみにアクセスする場合、データベースは5列のデータのみを読み取ります。

独自の時系列データベースの作成に関するシリーズを書いたので、それを確認してください。

2
hellomichibye