LindormTSDB では、時系列データをクエリするための以下の 3 つの方法がサポートされています:SQL、PromQL、および TSDB 互換 API および SDK。ほとんどのユースケースでは、SQL を使用したクエリが推奨されます。これは、時系列ワークロードに最適化されており、他の方法と比較してパフォーマンスが向上し、リソース使用量が低減します。
SQL を使用したクエリ
LindormTSDB は、標準 SQL を拡張し、ダウンサンプリングクエリ、集約クエリ、最新値クエリなど、時系列特化の機能を追加しています。SQL クエリの実行には Apache Calcite が採用されており、幅広い SQL 計算および分析機能を提供します。
サポートされている SQL 構文の詳細については、「SQL 構文」をご参照ください。
アクセス方法
SQL クエリには、以下の 3 つのアクセス方法が利用可能です。
| 方法 | 推奨用途 | プロトコルおよびデータ形式 | リファレンス |
|---|---|---|---|
| Java Native SDK | Java アプリケーション | Java API — ストリーミング方式でのデータ転送およびスレッドセーフな接続をサポート。接続管理は自動的に行われ、手動での管理は不要です | Java Native SDK |
| JDBC Driver | ORM フレームワークを使用する Java アプリケーション | JDBC — Druid またはその他の接続プールマネージャーを使用。Object-Relational Mapping(ORM)フレームワークが必要です | Java JDBC Driver |
| HTTP SQL API | Java 以外のアプリケーション | HTTP — 結果はストリーミングモードで返却され、言語に依存しません | LindormTSDB の HTTP ベース SQL API の使用 |
SAMPLE BY 句と GROUP BY 句の連携動作
LindormTSDB では、時系列データのダウンサンプリングに SAMPLE BY 句、複数の時系列に対する集約処理に GROUP BY 句を使用します。ただし、これらの 2 つの句は同一クエリレベルで併用できません。代わりに、GROUP BY を含む外部クエリで、SAMPLE BY を含むサブクエリをラップしてください。
単一の時系列をダウンサンプリングする
以下のクエリは、特定のデバイスの湿度測定値を 8 時間間隔でダウンサンプリングします:
SELECT device_id, region, time, count(humidity) AS count_humidity
FROM sensor
WHERE device_id = 'F07A1260'
SAMPLE BY 8h;複数の時系列をダウンサンプリングした後、集約する
以下のクエリは、サブクエリ内で全デバイスのデータを 8 時間間隔でダウンサンプリングし、外部クエリでデバイス ID ごとに結果を集約します:
SELECT device_id, max(avg_humidity) AS max_humidity
FROM (
SELECT device_id, region, time, avg(humidity) AS avg_humidity
FROM sensor
SAMPLE BY 8h
)
GROUP BY device_id;詳細については、以下をご参照ください。
PromQL を使用したクエリ
LindormTSDB では PromQL クエリ機能がサポートされており、Lindorm に格納された時系列データに対して Prometheus 互換のクエリワークフローを実行できます。
TSDB 互換 API および SDK を使用したクエリ
LindormTSDB は、TSDB の機能の約 90 % と互換性があります。既に TSDB を使用してデータを格納しているアプリケーションの場合、コード変更を行わずに LindormTSDB をクエリできます。ただし、長期的なパフォーマンス向上のため、クエリを SQL へ移行することを推奨します。
メトリックとテーブルのマッピング
TSDB では、データはメトリック名で整理されます。一方、LindormTSDB では、メトリックはテーブルに対応付けられます。HTTP SQL API、Java Native SDK、InfluxDB line protocol、または TSDB 互換のマルチ値オペレーションを介して書き込まれたデータをクエリする場合、metric@field 形式でメトリックを指定します:
metric— テーブル名field— 対象データを格納するカラム名
マルチ値データのクエリ
以下のいずれかの方法で書き込まれたマルチ値データは、TSDB 互換のオペレーションでクエリできます:
TSDB 互換 API オペレーション
HTTP SQL API
Java Native SDK
InfluxDB line protocol
手順については、以下をご参照ください。
多変量データポイントのクエリ — API オペレーションを使用する場合
SDK のマルチ値データモデルを使用したデータ読み取り — SDK を使用する場合
シングル値データのクエリ
TSDB 互換 API オペレーションで書き込まれたシングル値データは、同じ TSDB 互換 API オペレーションでクエリできます。ただし、新規開発ではこの方法は推奨されません。代わりに、SQL クエリをご利用ください。
参考情報については、以下をご参照ください。
シングル値データポイントのクエリ — API オペレーションを使用する場合
データのクエリ — SDK を使用する場合
Grafana を使用したクエリ
Grafana を使用すると、LindormTSDB から大量の時系列データを可視化できます。対応している Grafana プラグインは 2 種類あります。
Alibaba Cloud Lindorm データソースプラグイン
Alibaba Cloud Lindorm データソースプラグインでは、Grafana のクエリエディター内で自動生成またはカスタムの SQL ステートメントを直接使用して LindormTSDB をクエリできます。「Grafana を使用した LindormTSDB へのアクセス」をご参照ください。
OpenTSDB データソースプラグイン
LindormTSDB は OpenTSDB 互換の API オペレーションを公開しているため、Grafana 内の OpenTSDB データソースプラグインを接続して、Lindorm の時系列データをクエリできます。
このプラグインを介して、HTTP SQL API、Java Native SDK、InfluxDB line protocol、または TSDB 互換のマルチ値オペレーションで書き込まれたデータをクエリする場合、前述の「メトリックとテーブルのマッピング」で説明した通り、metric@field 形式でメトリックを指定してください。
クエリパフォーマンスの向上
LindormTSDB では、大規模環境におけるクエリパフォーマンスを向上させるための 2 つの仕組みが提供されています。適切な選択肢は、クエリパターンおよびデータの格納方法によって異なります。
| 方法 | 動作概要 | 推奨用途 | データストレージへの影響 |
|---|---|---|---|
| 事前集約 | 継続的クエリ(Continuous Query)を活用して結果を事前に計算し、別途定義された結果テーブルに書き込みます。クエリ実行時には、生データではなくこの結果テーブルから読み取ります。 | 多数の時系列に対するリアルタイム集約 | 結果は別テーブルに格納されます。クエリでは元のテーブルと結果テーブルの両方を参照する必要があります |
| 事前ダウンサンプリング | LindormDFS を活用して、書き込まれたデータを定義済みの比率でダウンサンプリング・格納します。クエリ実行時に、LindormTSDB は要求されたダウンサンプリング間隔に最も近い事前ダウンサンプリング済みデータを自動的に選択し、最終結果を計算します。 | 広範囲の時間帯を対象とするクエリ | 元のデータの時間精度が低下します。ダウンサンプリング済みデータは元のテーブルと同じテーブル内に格納されるため、クエリ構文の変更は不要です |
詳細な設定方法については、「継続的クエリ」および「事前ダウンサンプリング」をご参照ください。