TSDB for InfluxDB® は、Alibaba Cloud が提供する、InfluxDB API と互換性のあるマネージド時系列データベースサービスです。大量の書き込みおよびクエリ要求を処理でき、DevOps 監視メトリクス、アプリケーションメトリクス、IoT(Internet of Things)センサーデータをリアルタイムで保存します。
主な機能:
Time-Structured Merge Tree(TSM)エンジンを活用した高性能時系列ストレージ。高速な読み取り/書き込み性能と効率的な圧縮を実現
データの書き込みおよびクエリ実行に使用する HTTP ベースの API
時系列データを集約するための SQL に類似したクエリ言語
クエリ速度向上のためのタグベースインデックス
古いデータを自動的に有効期限切れにする保持ポリシー
データモデル
TSDB for InfluxDB® のデータは、以下の 3 つの基本概念を中心に構成されます:
Measurement(メジャー):時系列データを論理的に格納するコンテナ。リレーショナルデータベースにおけるテーブルに相当します。
Tag(タグ):データポイントに付与されるインデックス化されたメタデータ(例:
host=server01)。頻繁にフィルターまたはグループ化対象となるフィールドにはタグを使用します。Field(フィールド):実際に測定された値(例:
value=0.64)。フィールドはインデックス化されません。
単一のデータレコードは Point(ポイント) と呼ばれ、メジャー、ゼロ個以上のタグ、1 個以上のフィールド、およびタイムスタンプで構成されます。
データは Line Protocol(ラインプロトコル) 形式で書き込まれます:
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,...] [timestamp]例:
cpu,host=serverA,region=us_west value=0.64
cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000前提条件
開始する前に、以下の準備を行ってください。
TSDB for InfluxDB® インスタンス。購入後、インスタンス詳細ページから Virtual Private Cloud(VPC)エンドポイントおよびパブリックエンドポイントを確認してください。
読み取りおよび書き込み権限を持つデータベースアカウント。アカウントの作成および権限管理は、インスタンス管理 > アカウント管理 から行います。
データベースおよび保持ポリシーの設定。保持ポリシーを指定しない場合、デフォルトの
autogenが使用されます。
すべての接続は HTTPS を使用する必要があります。このサービスはポート 3242 をリッスンします。エンドポイントの形式は xxx.influxdata.rds.aliyuncs.com です。
データの書き込み
TSDB for InfluxDB® では、複数の書き込み方法がサポートされています。ご自身のワークフローに最も適した方法を選択してください。
| 方法 | 推奨用途 |
|---|---|
| Telegraf | システムおよびアプリケーションメトリクスの自動収集 |
| Go SDK | Go アプリケーションからのプログラムによる書き込み |
| Java SDK | Java アプリケーションからのプログラムによる書き込み |
| Influx CLI | 対話型テストおよび随時書き込み |
| HTTP API(curl) | スクリプト実行および迅速な統合 |
Telegraf を使用したメトリクスの収集
Telegraf は Go 言語で記述されたエージェントであり、システムおよびサービスのメトリクスを収集し、HTTP 経由で TSDB for InfluxDB® に書き込みます。Telegraf の構成ファイルには、少なくとも 1 つの 入力プラグイン(メトリクスの取得元)と 1 つの 出力プラグイン(メトリクスの送信先)が必要です。
ステップ 1:Telegraf のインストール
お使いのオペレーティングシステムに応じた Telegraf インストールガイド を参照してください。
ステップ 2:出力プラグインの構成
Telegraf 構成ファイル内で、TSDB for InfluxDB® への書き込みを行うよう [[outputs.influxdb]] セクションを設定します。
[[outputs.influxdb]]
urls = ["https://xxx.influxdata.rds.aliyuncs.com:3242"]
database = "test"
retention_policy = "" # デフォルトの保持ポリシーを使用する場合は空欄のままにします
username = "test"
password = "test"xxx.influxdata.rds.aliyuncs.com は、インスタンス詳細ページから取得した VPC エンドポイントまたはパブリックエンドポイントに置き換えてください。username および password には、該当データベースに対して書き込み権限を持つアカウント情報を設定してください。
ステップ 3:Telegraf の起動
お使いのオペレーティングシステムに対応するコマンドを実行します。
Ubuntu、Debian、RedHat、CentOS の場合:
sudo service telegraf startUbuntu 15.04+、Debian 8+、CentOS 7+、RHEL 7+ の場合:
sudo systemctl start telegraf
Go SDK を使用したデータの書き込み
GitHub から Go SDK をダウンロードしてください。Go のインストール手順については、Go のドキュメントをご参照ください。
インスタンスのエンドポイントおよび認証情報を使用して HTTPS 接続を行い、バッチ単位でデータを書き込みます。スループットを最大化するために、データサイズに応じて 100~1,000 ポイント/バッチで書き込んでください。
package main
import (
"fmt"
"log"
"math/rand"
"net/url"
"time"
client "github.com/influxdata/influxdb1-client"
)
func main() {
// HTTPS 経由でインスタンスエンドポイントに接続
host, err := url.Parse(fmt.Sprintf("https://%s:%d", "xxx.influxdata.rds.aliyuncs.com", 3242))
if err != nil {
log.Fatal(err)
}
config := client.Config{
URL: *host,
Username: "test",
Password: "test",
}
con, err := client.NewClient(config)
if err != nil {
log.Fatal(err)
}
_, _, err = con.Ping()
if err != nil {
log.Fatal(err)
}
// 1,000 ポイントのバッチを構築
var (
shapes = []string{"circle", "rectangle", "square", "triangle"}
colors = []string{"red", "blue", "green"}
sampleSize = 1000
pts = make([]client.Point, sampleSize)
)
rand.Seed(42)
for i := 0; i < sampleSize; i++ {
pts[i] = client.Point{
Measurement: "shapes",
Tags: map[string]string{
"color": colors[rand.Intn(len(colors))],
"shape": shapes[rand.Intn(len(shapes))],
},
Fields: map[string]interface{}{
"value": rand.Intn(sampleSize),
},
Time: time.Now(),
}
}
// 対象データベースへバッチを書き込み
bps := client.BatchPoints{
Points: pts,
Database: "test",
RetentionPolicy: "autogen",
}
_, err = con.Write(bps)
if err != nil {
log.Fatal(err)
}
}コンパイルおよび実行方法:
go run main.goJava SDK を使用したデータの書き込み
GitHub から Java SDK をダウンロードしてください。
package main;
import java.util.concurrent.TimeUnit;
import org.influxdb.InfluxDB;
import org.influxdb.BatchOptions;
import org.influxdb.InfluxDBFactory;
import org.influxdb.dto.Point;
public class StartMain {
public static void main(String[] args) throws Exception {
StartMain startMain = new StartMain();
try {
startMain.run();
} catch (Exception e) {
System.out.println(e);
}
}
public void run() throws Exception {
// HTTPS 経由でインスタンスエンドポイントに接続
InfluxDB influxDB = InfluxDBFactory.connect(
"https://xxx.influxdata.rds.aliyuncs.com:3242", "test", "test");
String dbName = "test";
influxDB.setDatabase(dbName);
String rpName = "autogen";
influxDB.setRetentionPolicy(rpName);
influxDB.enableBatch(BatchOptions.DEFAULTS);
// CPU メトリクスの書き込み
influxDB.write(Point.measurement("cpu")
.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
.addField("idle", 90L)
.addField("user", 9L)
.addField("system", 1L)
.build());
// ディスクメトリクスの書き込み
influxDB.write(Point.measurement("disk")
.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
.addField("used", 80L)
.addField("free", 1L)
.build());
influxDB.close();
}
}書き込みエラーを処理するには、enableBatch() にカスタム例外ハンドラーを渡します。
influxDB.enableBatch(BatchOptions.DEFAULTS.exceptionHandler(
(failedPoints, throwable) -> { /* ここにカスタムエラー処理を記述 */ })
);Influx CLI を使用したデータの書き込み
-ssl フラグとともにホスト、ポート、ユーザー名、パスワードを指定して接続します。
influx -ssl -host xxx.influxdata.rds.aliyuncs.com -port 3242 -username admin -password adminTSDB for InfluxDB® へクライアントからデータを書き込むには、「ラインプロトコルチュートリアル」をご参照ください。
ラインプロトコルでデータポイントを書き込みます。
> INSERT cpu,host=serverA,region=us_west value=0.64HTTP API を使用したデータの書き込み
curl を使用して、ラインプロトコル形式のデータを書き込みエンドポイントに直接 POST します。
curl -i -XPOST -u test:test \
'https://xxx.influxdata.rds.aliyuncs.com:3242/write?db=test' \
--data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'自己管理型 InfluxDB からのデータ移行
自己管理型環境または他プラットフォームで実行中の InfluxDB インスタンスがある場合、TSDB for InfluxDB® が提供する移行ツールを使用してデータを移行できます。
移行ツールは、宛先データベースを自動的に作成します。移行実行前に宛先データベースを手動で作成すると、書き込み競合が発生する可能性があるため、事前に作成しないでください。
移行後は、TSDB for InfluxDB® がデータを管理するため、上記で説明したインターフェイスを用いて、データの書き込み、クエリ、および分析を実行できます。
データのクエリおよび分析
TSDB for InfluxDB® では、SQL に類似したクエリがサポートされています。クエリは Influx CLI または HTTP API を介して実行できます。
以下の例では、color タグでデータをグループ化し、各グループの平均値を計算しています。
SELECT MEAN("value") FROM "shapes" GROUP BY "color"出力結果:
name: shapes
tags: color=blue
time mean
---- ----
0 216.25
name: shapes
tags: color=green
time mean
---- ----
0 434.25
name: shapes
tags: color=red
time mean
---- ----
0 540.25InfluxDB® は InfluxData 社の登録商標であり、TSDB for InfluxDB® とは関係なく、またこれを推奨するものではありません。