プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2019/06/21

InfluxDB の概念

update2019/06/25 event_note2019/06/20 23:01

今まで RDBMS しか使ったことがないので、InfluxDB の基本的な概念についてメモしておきます。

公式のドキュメントは以下です。

また、他には以下のページが体系的にまとめられていて分かりやすかったです。

これらをベースにまとめていますが、間違ったことを書いているかもしれないので、その場合は指摘していただけると助かります。

現在勉強中なので、適宜更新していくと思います。

時系列データベース

InfluxDB は時系列データベースの1つです。
時系列データベース (Time Series Database : TSDB) とはその名の通り、時系列データを扱うのに特化した DB で、NoSQL の一種だそうです。
具体的には以下のように時系列で変化していくようなデータを扱う場合に使われることが多いそうです。

  • イベントログ
  • センサー情報

RDBMS と比較した場合の TSDB の特徴は、例えば以下のようなものがあるらしいです。

  • スキーマレスなため、データの増減に柔軟に対応できる
  • 古いデータを自動で削除することができる
  • 時間ごとの処理を定義できる

用語

公式にも説明があります。

Database

RDBMS では Database はテーブルの集まりであり、Database 自体が1つのインスタンスのことを指します。

InfluxDB でも基本的な概念は同じですが、以下の点が異なるようです。

  • 1つの InfluxDB インスタンスで複数の Database をホストできる
  • Database は複数の Measurement をホストする

うーん、いまいちピンとこない・・・。

Tags と Fields

値が格納される場所で、RDBMS でいえばカラムに相当します。
この2つの一番の違いは、Tags にはインデックスが付加され、Fields にはインデックスが付加されないことです。

Tags は、Measurement におけるデータを定義する付加情報と見なすことができます。
Tags はデータに関する追加情報を提供しますが、データそのものは提供しません。

一方、Fields はただのデータです。

Tags と Fields の使い分けは以下のような感じらしいです。

  • RDBMS でインデックスされるようなデータは Tags
  • Measurement に対する付加的な情報は Tags
  • それ以外は Fields

Tags と Fields はどちらもキー・バリュー (key=value) で定義され、それぞれ Tags Key Tags Value Fields Key Fields Value と呼ばれます。

また複数のキー・バリューをまとめてセットと呼び、それぞれ Tags Set Fields Set と呼ばれます。 つまり、以下です。

  • Tags SetTags Key Tags Value のコレクション
  • Fields SetFields Key Fields Value のコレクション

Timestamp

日時です。
時系列データベースでは全ての情報に Timestamp が存在します。

Point

ある時刻におけるデータの集まりで、以下のデータから構成されます。

  • Timestamp
  • 所属する Measurement
  • Tags Set (必須ではない)
  • Fields Set

Point は RDBMS でいえばレコードに相当します。
InfluxDB ではこの Point でデータを格納していくようです。

Measurement

Tags, Fields, TimeStamp のコンテナであり、RDBMS でいえばテーブルに相当します。
(しかし、後述の Series も RDBMS のテーブルだと説明しているサイトもあり、いまいちよくわかりません。)

Measurement の名前はそこに含まれる Fields を説明したものにするようです。

Retention policy

データの保存期間のことです。
デフォルトは autogen で、永続的に保存されるようになっているそうです。

Series

Tags, Measurement, Retention policy の組み合わせで定義されるデータ系列のことです。

例えば、特定の Tags で複数の Measurement からデータ系列を抽出するというような使い方をするようです。

実際に使っていくにあたり

Measurement と Tags の使い分け

例えばリソースモニターのようなものを考えたとき、以下のようにするのが望ましいようです。

  • CPU メモリー ネットワーク などの区別は Measurement で行う
  • CPU1 CPU2 のような区別は Tags で行う