InfluxDBに入門してみる

# InfluxDBに入門してみる

### 参考

https://docs.influxdata.com/influxdb/v1.7/introduction/getting-started/

この記事はほぼ上記のドキュメントの拙訳(±α)になっています。

### 環境

Ubuntu18.04

### インストール

```
$ wget https://dl.influxdata.com/influxdb/releases/influxdb_1.7.6_amd64.deb
$ sudo dpkg -i influxdb_1.7.6_amd64.deb
```

### データベースを作成する

```
$ service influxdb start # サーバーの起動
$ influx -precision rfc3339 # influxDBに接続
Connected to http://localhost:8086 version 1.7.6
InfluxDB shell version: 1.7.6
Enter an InfluxQL query
> 
```

**注意** : InfluxDB HTTP APIはデフォルトで8086ポート上で起動する。したがって、influxはデフォルトでローカルホストに8086ポートで接続しようとする。もしデフォルトから変える必要があれば、`influx --help`を実行するとよい。
`-precision`引数は任意の返ってきたタイムスタンプのformat/precisionを特定する。この例では、rfc3339はInfluxDBにRFC3339 format (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ)でタイムスタンプを返すように指定している。



話を戻す。 InfluxDBのフレッシュインストール後には(`_internal`は別として)データベースが存在しないので、まずはデータベースを作成する。`CREATE DATABASE <db-name>`でデータベースを作成ですることができる。`<db-name>`は作りたいデータベースの名前。データベースの名前は文字列がダブルクオーテーションで挟まれていればどんなユニコード文字列を含んでいてもよい。アスキー文字、ディジット、あるいはアンダースコアのみを含んでいてディジットで始まらない限りはクオーテーションでDB名を囲う必要はない。

```
> CREATE DATABASE mydb
```

データベースが無事作られたかどうか調べるために`SHOW DATABASES`と打ち込んで存在するすべてのデータベースを表示してみる。

```
> SHOW DATABASES
name: databases
name
----
_internal
mydb
```


**注意**: `_internal`データベースは内部のランタイムメトリクスを保存するために作成され、InfluxDBに使われる。

`SHOW DATABASES`とは異なりほとんどのInfluxQLステートメントは特定のデータベースに対して不利に働かなければならない(most InfluxQL statements must operate against a specific database)。各々のクエリでデータベースに名前をつけても良いが、CLIは便利なステートメントを用意している。`USE <db-name>`はすべての将来に渡るリクエストに対して、データベースを自動的にセットする。例えば:

```
> USE mydb
Using database mydb
>
```

これで、今後のコマンドは`mydb`データベースに対してのみ実行される。

### データを書き込んで探索する

今やデータベースが存在するので、InfluxDBはクエリの発行や書き込みの準備が出来ていることになる。

まずはじめに、データ保存に関する短い入門から始める。InfluxDB内のデータは"time series"(時系列)によって組織化されており、“cpu_load"や"temperature"のように測定された値を含んでいる。時系列はゼロから複数の`points`(各々の測定からの離散的サンプルに対する一つ(one for each discrete sample of the metric))を持つ。Pointsは`time`(タイムスタンプ)、`measurement`(例えば"cpu_load")、少なくとも１つのkey-value`field`(測定された値そのもので、例えば"value=0.64"や"temperature=21.2")、そして値に対するメタデータを含んだzero to many key value `tags`(例えば、“host=server01”, “region=EMEA”, “dc=Frankfurt”)で構成される。

概念的には`measurement`をSQLテーブルとして考えることができる。プライマリーインデックスが常に時間であると考えればよい。`tags`と`fields`は実質的にはテーブル内のカラムである。`tags`はインデックス化され、`fields`はされない。(SQLテーブルとの)違いはというと、InfluxDBを使うことで数百万のmeasurementの値をもつことが出来、スキーマを前もって定義する必要がなくヌル値は保存されないということである。

PointsはLine Protocolを使って次のようなフォーマットにしたがってInfluxDBに書かれる。

```
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
```

InfluxDBに書き込むことが出来るpointsのすべての例は次のようになる:

```
cpu,host=serverA,region=us_west value=0.64
payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230
stock,symbol=AAPL bid=127.46,ask=127.48
temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000
```

CLIを使って単一の時系列データポイントをInfluxDBに挿入するためにpointがあとに続く`INSERT`文を入力する:

```
> INSERT cpu,host=serverA,region=us_west value=0.64
> 
```

`cpu`というmeasurementの名前と`host`および`region`というタグを伴ったpointは今、測定された`value`が`0.64`という形でデータベースに書き込まれる。

書き込んだデータに対してクエリを発行してみる:

```
> SELECT "host", "region", "value" FROM "cpu"
name: cpu
time                           host    region  value
----                           ----    ------  -----
2019-06-24T21:59:49.117249421Z serverA us_west 0.64
>
```

別の種類のデータを保存してみる。同じmeasurement内で２つのフィールドを持ったものとする:

```
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
>
```

クエリによってすべてのフィールドとタグを返すために、`*`演算子を使うことができる:

```
> SELECT * FROM "temperature"
name: temperature
time                           external internal machine type
----                           -------- -------- ------- ----
2019-06-24T22:05:42.841203137Z 25       37       unit42  assembly
```

InfluxQLはここではカバーされていない多くのフィーチャーやキーワードを持っており、その中にはGo-style regexのためのサポートも含まれている。例えば:

```
> SELECT * FROM /.*/ LIMIT 1
--
> SELECT * FROM "cpu_load_short"
--
> SELECT * FROM "cpu_load_short" WHERE "value" > 0.9
```

これでInfluxDBにデータを書き込みクエリを返すために知っておく必要があることは全てである。InfluxDB write protocolについてもっと学ぶためには[Writing Data](https://docs.influxdata.com/influxdb/v1.7/guides/writing_data/)に関するガイドをチェックするとよい。クエリ言語をさらに探索するためには、[Querying Data](https://docs.influxdata.com/influxdb/v1.7/guides/querying_data/)に関するガイドをチェックするとよい。InfluxDBに関するさらなる情報に関しては、[Key Concepts](https://docs.influxdata.com/influxdb/v1.7/concepts/key_concepts/)ページをチェックするとよい。