事前ダウンサンプリングを使用すると、データベースにデータが書き込まれる際に、指定された時間間隔でデータを事前に計算できます。事前ダウンサンプリングされたデータは個別に保存されます。ダウンサンプリングクエリの実行中に、一致する事前ダウンサンプリングデータが自動的にクエリされ、アクセスレイテンシを短縮できます。このトピックでは、事前ダウンサンプリングの概念と、事前ダウンサンプリングルールの作成および管理方法について説明します。また、事前ダウンサンプリングのベストプラクティスも紹介します。
前提条件
Lindorm インスタンスの LindormTSDB バージョンが 3.4.19 以降である必要があります。
Lindorm インスタンスの LindormTSDB バージョンの表示方法とアップグレード方法については、LindormTSDB のリリースノートおよびLindorm インスタンスのマイナーエンジンバージョンのアップグレードをご参照ください。
概要
事前ダウンサンプリング
事前ダウンサンプリングは、データベースに書き込まれる前にデータを集計するために行われます。事前ダウンサンプリングでは、指定された事前ダウンサンプリングルールに基づいて、書き込まれるデータをダウンサンプリングし、個別に保存します。書き込まれたデータをクエリすると、クエリ条件で指定されたダウンサンプリング比率に最も近い事前ダウンサンプリング比率でダウンサンプリングされたデータがクエリされます。次に、クエリされたデータが計算エンジンに送信され、処理されます。これにより、リアルタイムでクエリおよび計算する必要のあるデータ量が削減され、クエリレイテンシが短縮されます。
継続クエリと比較して、事前ダウンサンプリングには次の利点があります。
ダウンサンプリングされたデータは、書き込まれた直後にクエリできます。継続クエリの実行を待つ必要はありません。
事前ダウンサンプリングは書き込みパフォーマンスに影響しません。ダウンサンプリングされたデータは、書き込まれたときにリアルタイムで保存されます。
事前ダウンサンプリングされたデータと生データは同じテーブルに保存されます。事前ダウンサンプリングクエリを実行すると、指定されたルールに最も一致する事前ダウンサンプリングされたデータがクエリされます。事前ダウンサンプリングされたデータが指定されたルールに一致しない場合は、生データがクエリされます。
事前ダウンサンプリングルール
事前ダウンサンプリングルールは、事前ダウンサンプリング操作の時間粒度と、事前ダウンサンプリングでのデータの集計方法を定義します。たとえば、生データの行が毎分生成される場合、1 時間ごとに生データの平均値に基づいて事前ダウンサンプリングを実行するように事前ダウンサンプリングルールを設定できます。事前ダウンサンプリングルールは、データベースまたはテーブルに対して設定できます。次の図は、2 種類の事前ダウンサンプリングルールの違いを示しています。
事前ダウンサンプリングルールの作成
事前ダウンサンプリングルールは、ルールが作成される前にテーブルまたはデータベースに書き込まれたデータにのみ適用されます。
SQL ステートメントを使用してテーブルに事前ダウンサンプリングルールを作成する
例
事前ダウンサンプリング比率が 1 時間に設定され、事前ダウンサンプリングされたデータに対して sum および max 操作が実行される事前ダウンサンプリングルールを設定します。
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `max`) ON sensor;事前ダウンサンプリング比率が 1 時間に設定され、事前ダウンサンプリングされたデータに対して sum および max 操作が実行され、事前ダウンサンプリングされたデータの TTL が 90 日に設定される事前ダウンサンプリングルールを設定します。
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `max`) TTL `90d` ON sensor;
構文リファレンス
API 操作を使用してデータベースに事前ダウンサンプリングルールを作成する
リクエストパスとメソッド
リクエストパス | リクエストメソッド | 説明 |
/api/database |
| 指定されたデータベースに事前ダウンサンプリングルールを設定します。 指定されたデータベース(デフォルトデータベースなど)がすでに存在する場合は、PUT メソッドを使用してデータベースの事前ダウンサンプリングルールを更新します。 データベースの作成時にデータベースに事前ダウンサンプリングルールを設定するには、POST メソッドを使用します。 |
リクエストパラメータ
パラメータ | 必須 | 説明 |
name | はい | データベース名。例: default。 |
downsampleRules | はい | 設定する事前ダウンサンプリングルールのリスト。データベースの事前ダウンサンプリングルールを更新するたびに、リスト内のすべてのルールが更新されます。 |
単一の事前ダウンサンプリングルールのパラメータ
パラメータ | 必須 | 説明 | 例 |
aggregator | はい | 事前ダウンサンプリングで使用される集計関数。 有効な値: sum、count、max、min、first、last、median。 集計関数の詳細については、CREATE PREDOWNSAMPLEをご参照ください。 重要
| "aggregator": "sum" |
intervals | はい | 事前ダウンサンプリングが実行される時間間隔のリスト。サポートされている単位は、s(秒)、m(分)、h(時間)、d(日)です。 | たとえば、パラメータが ["10m", "1h"] に設定されている場合、生データは 10 分間隔と 1 時間間隔に基づいて個別に事前ダウンサンプリングされます。 |
リクエストの例
PUT /api/database
{
"name": "default",
"downsampleRules": {
"rules": [
{
"aggregator": "sum",
"intervals": [
"1m",
"1h"
]
},
{
"aggregator": "max",
"intervals": [
"1m",
"1h"
]
}
]
}
}レスポンスの説明
リクエストが成功すると、HTTP ステータスコード 200 が返されます。
事前ダウンサンプリングルールのクエリ
事前ダウンサンプリングルールをクエリするために使用できるメソッドは、ルールがデータベースに対して設定されているか、テーブルに対して設定されているかによって異なります。 API 操作を使用してデータベースに対して設定された事前ダウンサンプリングルールをクエリし、SQL ステートメントを使用してテーブルに対して設定された事前ダウンサンプリングルールをクエリできます。
SQL ステートメントを使用してテーブルに設定された事前ダウンサンプリングルールをクエリする
例
データベース内のすべてのテーブルに設定されているすべての事前ダウンサンプリングルールをクエリします。
SHOW PREDOWNSAMPLES;sensor という名前のテーブルに設定されているすべての事前ダウンサンプリングルールをクエリします。
SHOW PREDOWNSAMPLES ON sensor;
構文リファレンス
API 操作を使用してデータベースに設定された事前ダウンサンプリングルールをクエリする
リクエストパスとメソッド
リクエストパス | リクエストメソッド | 説明 |
/api/database | GET | データベースに設定された事前ダウンサンプリングルールをクエリします。 |
レスポンスの例
[{
"name": "default",
"downsampleRules": {
"rules": [
{
"aggregator": "sum",
"intervals": [
"1m",
"1h"
]
},
{
"aggregator": "max",
"intervals": [
"1m",
"1h"
]
}
]
}
}]レスポンスの説明
リクエストが成功すると、HTTP ステータスコード 204 が返されます。
事前ダウンサンプリングルールの削除
事前ダウンサンプリングルールを削除するために使用できるメソッドは、ルールがデータベースに対して設定されているか、テーブルに対して設定されているかによって異なります。 API 操作を使用してデータベースに対して設定された事前ダウンサンプリングルールを削除し、SQL ステートメントを使用してテーブルに対して設定された事前ダウンサンプリングルールを削除できます。
事前ダウンサンプリングルールを削除した後、ルールに基づいて事前ダウンサンプリングされたデータはすぐに削除されません。ただし、事前ダウンサンプリングされたデータをクエリすると、データは返されません。事前ダウンサンプリングされたデータは、期限切れになると自動的に削除されます。
SQL ステートメントを使用してテーブルに設定された事前ダウンサンプリングルールを削除する
例
DROP PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `max`) ON sensor;構文リファレンス
API 操作を使用してデータベースに設定された事前ダウンサンプリングルールを削除する
データベースの事前ダウンサンプリングルールを削除するために設定する必要があるリクエストパス、リクエストメソッド、およびリクエストパラメータは、データベースの事前ダウンサンプリングルールを作成する場合と同じです。ただし、downsampleRules フィールドを空に設定する必要があります。レスポンスで返される HTTP ステータスコードも、データベースの事前ダウンサンプリングルールを作成する場合と同じです。詳細については、API 操作を使用してデータベースに事前ダウンサンプリングルールを作成するをご参照ください。
リクエストの例
PUT /api/database
{
"name": "default",
"downsampleRules": {
}
}事前ダウンサンプリングされたデータのクエリ
事前ダウンサンプリングされたデータの一致ルール
データベースとデータベース内のテーブルの両方に事前ダウンサンプリングルールが設定されている場合、事前ダウンサンプリングクエリではテーブルに設定されているルールが優先されます。
クエリで指定されたダウンサンプリング間隔が事前ダウンサンプリングされたデータのダウンサンプリング間隔と完全に一致しない場合、事前ダウンサンプリング間隔が指定されたダウンサンプリング間隔に最も一致する事前ダウンサンプリングされたデータがクエリされます。ほとんどのダウンサンプリングクエリの要件を満たすために、事前ダウンサンプリングが実行される時間間隔を 1m、10m、1h、または 1d に設定することをお勧めします。
説明事前ダウンサンプリングされたデータの事前ダウンサンプリング間隔が、クエリで指定されたダウンサンプリング間隔を除算できる最大値である場合、事前ダウンサンプリングされたデータはクエリに最も一致します。たとえば、生データが 1m、5m、8m、15m に基づいて事前ダウンサンプリングされ、クエリで指定されたダウンサンプリング間隔が 10m の場合、5m に基づいて事前ダウンサンプリングされたデータがクエリに最も一致します。
クエリで指定されたダウンサンプリング間隔に一致する事前ダウンサンプリングされたデータがない場合、生データがクエリされます。
クエリメソッド
SQL ステートメント、または時系列データベース(TSDB)と互換性のあるメソッドを使用して、事前ダウンサンプリングされたデータをクエリできます。 SQL ステートメントを使用して事前ダウンサンプリングされたデータをクエリすることをお勧めします。アプリケーションが OpenTSDB または TSDB に基づいて構築されている場合は、TSDB と互換性のあるメソッドを使用して事前ダウンサンプリングされたデータをクエリできます。
SQL ステートメントを使用して事前ダウンサンプリングされたデータをクエリする
デフォルトでは、事前ダウンサンプリングされたデータをクエリすると、事前ダウンサンプリング前の生データがクエリされます。事前ダウンサンプリングされたデータのみをクエリするには、クエリステートメントに /*+ PREDOWNSAMPLE */ ヒントを追加する必要があります。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature) from sensor
WHERE time >= 1619074800000 AND time <= 1619085600000
SAMPLE BY 1h;TSDB 互換メソッドを使用して事前ダウンサンプリングされたデータをクエリする
API ベースの複数値クエリ、API ベースの単一値クエリ、および SDK を使用して、事前ダウンサンプリングされたデータをクエリできます。
SDK を使用して事前ダウンサンプリングされたデータをクエリする
SDK を使用して事前ダウンサンプリングされたデータをクエリする場合は、MultiFieldSubQuery ビルダーで DownsampleDataSource パラメータを設定する必要があります。
例
long startTime = 1619074800000L;
long endTime = 1619085600000L;
final String metric = "wind";
final String field = "speed";
MultiFieldSubQueryDetails fieldSubQueryDetails = MultiFieldSubQueryDetails
.field(field)
.aggregator(Aggregator.SUM)
.downsample("1h-sum")
.build();
MultiFieldSubQuery subQuery = MultiFieldSubQuery
.metric(metric)
.fieldsInfo(fieldSubQueryDetails)
// 事前ダウンサンプリングされたデータをクエリします。
.downsampleDataSource(DownsampleDataSource.DOWNSAMPLE)
.build();
MultiFieldQuery query = MultiFieldQuery.
start(startTime).
end(endTime).
sub(subQuery).
build();
List<MultiFieldQueryResult> result = tsdb.multiFieldQuery(query); パラメータ
DownsampleDataSource パラメータは、次のいずれかの値に設定できます。
DOWNSAMPLE: 事前ダウンサンプリングされたデータをクエリします。
RAW: 生データをクエリします。このパラメータのデフォルト値は RAW です。
SDK 複数値データモデルを使用して事前ダウンサンプリングされたデータをクエリする方法の詳細については、SDK 複数値データモデルを使用してデータを読み取るをご参照ください。
API ベースの複数値クエリを使用して事前ダウンサンプリングされたデータをクエリする
API ベースの複数値クエリを使用して事前ダウンサンプリングされたデータをクエリする場合は、downsampleSource パラメータを追加し、downsample に設定する必要があります。詳細については、複数値データポイントをクエリするをご参照ください。
リクエストパスとメソッド
リクエストパス | リクエストメソッド | 説明 |
/api/mquery | GET | 事前ダウンサンプリングされたデータをクエリします。 |
リクエストパラメータ
パラメータ | 必須 | 説明 | 例 |
downsampleSource | いいえ | クエリされるデータソース。有効な値:
| downsample |
リクエストの例
POST /api/mquery
{
"start": 1346846400000,
"end": 1346846402000,
"queries": [
{
"downsampleDataSource" : "downsample",
"metric": "wind",
"fields" : [
{
"field" : "speed",
"aggregator" : "none",
"downsample" : "1h-sum"
}
],
"tags":{
"sensor":"IOTE_8859_0002"
}
}
]
}事前ダウンサンプリングのベストプラクティス
秒間隔でサンプリングされたデータの事前ダウンサンプリング
秒間隔でサンプリングされたデータの場合、1 分、1 時間、1 日の間隔に基づいて事前ダウンサンプリングルールを設定することをお勧めします。
事前ダウンサンプリングルールの例
1 分、1 時間、1 日の間隔に基づいて sum、count、min、max 集計関数が指定されている事前ダウンサンプリングルールを設定します。
CREATE PREDOWNSAMPLE `1m` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;
CREATE PREDOWNSAMPLE `1d` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;事前ダウンサンプリングクエリの例
1 分間隔に基づいて設定された事前ダウンサンプリングルールを使用して、任意の分数のダウンサンプリング比率でダウンサンプリングクエリを実行します。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619085600000 SAMPLE BY <N>m;1 時間間隔に基づいて設定された事前ダウンサンプリングルールを使用して、任意の時間のダウンサンプリング比率でダウンサンプリングクエリを実行します。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619085600000 SAMPLE BY <N>h;1 日間隔に基づいて設定された事前ダウンサンプリングルールを使用して、任意の日のダウンサンプリング比率でダウンサンプリングクエリを実行します。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619600400000 SAMPLE BY <N>d;
分間隔でサンプリングされたデータの事前ダウンサンプリング
分間隔でサンプリングされたデータの場合、任意の時間または日のダウンサンプリング比率でダウンサンプリングクエリを実行するために、1 時間および 1 日の間隔に基づいて事前ダウンサンプリングルールを設定することをお勧めします。
事前ダウンサンプリングルールの例
1 時間および 1 日の間隔に基づいて sum、count、min、max 集計関数が指定されている事前ダウンサンプリングルールを設定します。
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;
CREATE PREDOWNSAMPLE `1d` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;事前ダウンサンプリングクエリの例
1 時間間隔に基づいて設定された事前ダウンサンプリングルールを使用して、任意の時間のダウンサンプリング比率でダウンサンプリングクエリを実行します。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619085600000 SAMPLE BY <N>h;1 日間隔に基づいて設定された事前ダウンサプリングルールを使用して、任意の日のダウンサンプリング比率でダウンサンプリングクエリを実行します。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619600400000 SAMPLE BY <N>d;