TSDB for InfluxDB® について、シリーズカーディナリティ、管理、データクエリ、書き込み、CLI の使用、データ型、InfluxQL 関数、移行に関するよくある質問とその回答をまとめています。
トラブルシューティング
シリーズとシリーズカーディナリティ
管理
データクエリ
データ書き込み
コマンドラインインターフェイス (Influx CLI)
データ型
InfluxQL 関数
InfluxDB データ移行
シリーズとシリーズカーディナリティ
シリーズカーディナリティの重要性
TSDB for InfluxDB® は、シリーズごとにインメモリインデックスを保持します。シリーズ数が増加すると、RAM 使用量も増加します。カーディナリティが過度に高くなると、メモリ不足 (OOM) 例外をトリガーし、プロセスが終了する可能性があります。「InfluxQL Reference」
モデリングの方法と注意事項
時系列の数を 100 万未満に保つようにしてください。大規模な時系列シナリオの場合は、LindormTSDB の概要を使用してください。InfluxDB のスキーマとデータレイアウトガイドを確認してください。InfluxDB はタグにインデックスを付けてクエリを高速化しますが、タグが多すぎるとシリーズ数が増加し、読み取りと書き込みが遅くなります。主な考慮事項は次のとおりです。
-
ID、ハッシュ値、ランダムな文字列など、高カーディナリティ値を持つタグの使用は避けてください。
-
メジャーメント名やタグ名にデータを格納しないでください。データはタグとフィールドに格納してください。
-
1 つのタグに複数の情報を格納しないでください。情報を複数のタグに分割してください。
-
GROUP BY 句でフィールドを頻繁に使用する場合は、そのフィールドをタグとしてモデル化してください。
管理
システムの安定性のために注意すべき点は何ですか?
-
メモリ使用量を 80% 未満に保ちます。
-
時系列の数を 100 万未満に保ちます。モデリングの注意事項 に従ってスキーマを計画してください。
-
メジャーメント数を制御します。モデリングの注意事項 のガイドラインに従ってください。
-
データ量を制御します。データ保持ポリシーを設定して、古いデータを定期的に削除します。
-
適切なシャードグループ期間を設定し、データ保持ポリシーを設定して古いシャードを削除します。
メジャーメントのディスク使用率を確認するにはどうすればよいですか?
ディスク使用率はメジャーメントレベルでは確認できません。メジャーメントは論理的な概念であり、同じデータベース内のすべてのメジャーメントは、基礎となるデータファイルを共有します。
データを効率的かつ安全に削除するにはどうすればよいですか?
InfluxDB の drop measurement、drop series、および delete 操作は論理削除を行いますが、これらには次の欠点があります。
-
InfluxDB 1.x は、コード実装レベルでデッドロックが発生する可能性があります。
-
クエリでは削除された時系列を除外する必要があり、クエリ効率に深刻な影響を与えます。
-
論理削除ではディスク領域をすぐに解放できません。バックグラウンドでのデータマージスケジューリングを待つ必要があり、これにより領域の解放が遅くなります。
保持ポリシーを変更して古いデータを削除するか、drop shard または drop database を使用して物理削除を実行してください。
変更した保持ポリシーが有効にならないのはなぜですか?
v1.8.13 以降では、保持ポリシーの変更はすぐに有効になります。変更が有効にならない場合は、以下を確認してください。
-
バージョンが v1.8.12 以前かどうかを確認してください。以前のバージョンでは、保持ポリシーの変更にはバックグラウンドスケジューリングが必要です。30 分から 60 分お待ちください。
-
シャードが広い時間範囲をカバーしています。
show shardsを実行して確認してください。シャードは、現在時刻がシャードの終了時刻を超えた後にのみ削除できます。
サービスが頻繁に中断するのはなぜですか?
メモリ使用量を確認してください。80% を超えると、OOM エラーによってプロセスが停止する可能性があります。FAQ: メモリ使用量が高いのはなぜですか? で原因を特定するか、インスタンスをアップグレードしてください。
メモリ使用量が高い場合、アップグレードは必要ですか?
メモリ使用量が高くなる一般的な原因は次のとおりです。
-
時系列の数が多い。インデックスのマージには大量のメモリが消費されます。時系列数は 100 万未満にしてください。大規模な時系列シナリオの場合は、LindormTSDB の概要 をご検討ください。
-
データ量が多い、またはシャードが多い。データが多いほど、ファイルマージによるメモリへの負荷が増加し、再起動時間が長くなります。FAQ: データを効率的かつ安全に削除する方法 に従ってデータを削減してください。大規模ストレージの場合は、LindormTSDB の概要 をご検討ください。
-
大規模なクエリ。大規模なクエリは避けてください。タグと時間フィルターを追加して、スキャン範囲を縮小してください。
-
Grafana をクエリに使用する場合、グラフの設定時に Grafana が
show tag keysクエリを発行することで、OOM エラーが発生する可能性があります。show tag keysクエリを無効にするには、v1.8.13 以降にアップグレードしてください。
それでもメモリ使用量が 80% を超える場合は、インスタンスをアップグレード してください。インスタンスのアップグレードまたはダウングレード。
ストレージのスケールインはサポートされていますか?
InfluxDB のディスクはスケールインをサポートしていません。
ディスクを拡張すると再起動が発生しますか?
ディスクを拡張すると、InfluxDB プロセスが再起動します。Basic Edition インスタンスは短時間利用できなくなる可能性があります。High-availability Edition インスタンスはローリングリスタートを実行するため、通常はサービスへの影響はありません。
再起動にはどのくらいの時間がかかりますか?
再起動時間はデータ量に依存します。データが多いほど再起動に時間がかかります。
InfluxDB の内蔵 Grafana はサポートされていますか?
代わりに Alibaba Cloud の Managed Service for Grafana を使用してください。InfluxDB の内蔵 Grafana は古く、現在はメンテナンスされていません。
アクセス時に ip block エラーが発生するのはなぜですか?
v1.8.12 以前のバージョンでは、パスワードの試行失敗が多すぎると、一時的に IP アドレスがブロックされます。v1.8.13 以降にアップグレードしてください。
TSDB for InfluxDB® のバージョンを識別するにはどうすればよいですか?
次のいずれかの方法で確認できます。
-
curl /ping$ curl -i 'https://<endpoint>:3242/ping?u=<username>&p=<password>' HTTP/1.1 204 No Content Content-Type: application/json X-Influxdb-Build: OSS X-Influxdb-Version: 1.7.x -
TSDB for InfluxDB® のコマンドラインインターフェイスを開始します
$ influx -ssl -username <username> -password <password> -host <endpoint> -port 3242 Connected to https://<endpoint>:3242 version 1.7.x
シャードグループ期間と保持ポリシーの関係
TSDB for InfluxDB® は、シャードグループにデータを格納します。シャードグループは、特定の期間を対象とします。TSDB for InfluxDB® は、関連する保持ポリシー (RP) の DURATION を確認して期間を決定します。次の表に、RP の DURATION とシャードグループの期間のデフォルトの関係を示します。
|
RP 期間 |
シャードグループの時間間隔 |
|
< 2 日 |
1 時間 |
|
>= 2 日かつ <= 6 か月 |
1 日 |
|
> 6 か月 |
7 日 |
保持ポリシーのシャードグループの期間を表示するには、SHOW RETENTION POLICIES を使用します。
保持ポリシーを変更してもデータが失われないのはなぜですか?
保持ポリシーを変更しても、次の理由によりデータがすぐに失われない場合があります。
-
考えられる最初の理由 (最も可能性の高いシナリオ): デフォルトでは、TSDB for InfluxDB® は 30 分ごとに RP をチェックして適用します。RP の新しい
DURATIONの範囲外にあるデータは、次回の RP チェックが行われるまで TSDB for InfluxDB® によって削除されないため、待機する必要がある場合があります。 -
2つ目の考えられる理由: RP の
DURATIONとSHARD DURATIONを変更すると、予期しないデータ保持が発生する可能性があります。 TSDB for InfluxDB® は、データをシャードグループに格納します。 各シャードグループは、特定の RP と時間間隔を対象とします。 TSDB for InfluxDB® が RP を適用する際、個々のデータポイントではなく、シャードグループ全体を削除します。 TSDB for InfluxDB® はシャードグループを分割できません。 RP の新しいDURATIONが古いSHARD DURATIONよりも短く、かつ TSDB for InfluxDB® がより長いDURATIONを持つ古いシャードグループにデータを書き込んでいる場合、システムはそのシャードグループ内のすべてのデータを格納せざるを得なくなります。 これは、シャードグループ内の一部のデータが新しいDURATIONの範囲外であっても発生します。 シャードグループ内のすべてのデータが新しいDURATIONの範囲外になると、TSDB for InfluxDB® はシャードグループ全体を削除します。 その後、システムは新しい、より短いSHARD DURATIONを持つシャードグループへのデータの書き込みを開始します。 これにより、それ以上の予期しないデータ保持が回避されます。
TSDB for InfluxDB® がマイクロ秒単位を解析できないのはなぜですか?
マイクロ秒の時間単位を指定するための構文は、TSDB for InfluxDB® のコマンドラインインターフェイス (Influx CLI) での書き込み、クエリ、精度の設定で異なります。次の表に、各カテゴリでサポートされている構文を示します。
|
HTTP API によるデータ書き込み |
すべてのクエリ |
Influx CLI での精度設定 |
|
|
u |
√ |
√ |
√ |
|
us |
❌ |
❌ |
❌ |
|
µ |
❌ |
√ |
❌ |
|
µs |
❌ |
❌ |
❌ |
データクエリ
低速クエリのトラブルシューティング方法
低速クエリは、通常、スキャンする時系列や生データが多すぎることが原因で発生します。すべてのクエリにタグおよび時間範囲フィルターを追加してください。EXPLAIN ANALYZE コマンドを使用してパフォーマンスを診断します。execution_time はデータの読み取りと計算を、planning_time は系列のスキャンを反映します。
GROUP BY time() クエリで返される時間間隔を決定する要素
GROUP BY time() クエリが返す時間間隔は、TSDB for InfluxDB® のプリセットの時間バケット、またはユーザー指定のオフセット間隔と一致します。以下の例をご参照ください。
-
事前設定された時間バケット
次のクエリは、午後 6:15 から 7:45 までの
sunflowersの平均を計算し、1 時間ごとにグループ化します。SELECT mean("sunflowers") FROM "flower_orders" WHERE time >='2016-08-29T18:15:00Z' AND time <='2016-08-29T19:45:00Z' GROUP BY time(1h)次の結果は、TSDB for InfluxDB® が事前設定された時間バケットを維持する方法を示しています。
この例では、午後 6 時はあらかじめ設定された時間バケットであり、午後 7 時もあらかじめ設定された時間バケットです。
WHERE句がクエリの時間範囲を指定しているため、午後 6 時の時間バケットの平均を計算する際に、午後 6 時 15 分より前のデータは含まれません。ただし、午後 6 時の時間バケットの平均を計算するために使用されるデータは、午後 6 時台に発生したものでなければなりません。午後 7 時の時間バケットにも同じことが当てはまります。午後 7 時の時間バケットの平均を計算するために使用されるデータは、午後 7 時台に発生したものでなければなりません。破線は、各平均の計算に使用されたデータポイントを示しています。結果の最初のタイムスタンプは
2016-08-29T18:00:00Zですが、そのタイムバケットのクエリ結果には、WHERE句で指定された開始時刻2016-08-29T18:15:00Zより前のデータは含まれない点にご注意ください。生データ:
name: flower_orders name: flower_orders —————————------------------- time sunflowers time mean 2016-08-29T18:00:00Z 34 2016-08-29T18:00:00Z 22.332 |--| 2016-08-29T19:00:00Z 62.75 2016-08-29T18:15:00Z |28| 2016-08-29T18:30:00Z |19| 2016-08-29T18:45:00Z |20| |--| |--| 2016-08-29T19:00:00Z |56| 2016-08-29T19:15:00Z |76| 2016-08-29T19:30:00Z |29| 2016-08-29T19:45:00Z |90| |--| 2016-08-29T20:00:00Z 70 -
オフセット間隔
次のクエリでは、午後 6:15 から 7:45 までの
sunflowersの平均を計算して 1 時間ごとにグループ化し、TSDB for InfluxDB® のプリセットタイムバケットを15分オフセットします。SELECT mean("sunflowers") FROM "flower_orders" WHERE time >='2016-08-29T18:15:00Z' AND time <='2016-08-29T19:45:00Z' GROUP BY time(1h,15m) --- | offset intervalこの例では、ユーザー指定のオフセット間隔により、TSDB for InfluxDB® のプリセットされたタイムバケットが
15分前方にシフトします。この結果、午後 6 時のタイムバケットの平均値には、午後 6 時 15 分から午後 7 時 15 分までのデータが含まれるようになります。午後 7 時のタイムバケットの平均値には、午後 7 時 15 分から午後 8 時 15 分までのデータが含まれるようになります。破線は、各平均値の計算に使用されたデータポイントを示しています。結果の最初のタイムスタンプが
2016-08-29T18:00:00Zではなく2016-08-29T18:15:00Zになったことにご注意ください。生データと結果:
name: flower_orders name: flower_orders —————————------------------- time sunflowers time mean 2016-08-29T18:00:00Z 34 2016-08-29T18:15:00Z 30.75 |--| 2016-08-29T19:15:00Z 65 2016-08-29T18:15:00Z |28| 2016-08-29T18:30:00Z |19| 2016-08-29T18:45:00Z |20| 2016-08-29T19:00:00Z |56| |--| |--| 2016-08-29T19:15:00Z |76| 2016-08-29T19:30:00Z |29| 2016-08-29T19:45:00Z |90| 2016-08-29T20:00:00Z |70| |--|
クエリでデータが返されない、または一部のデータしか返されないのはなぜですか?
一般的な原因は次のとおりです:
-
保持ポリシー
最も一般的な最初の説明は、保持ポリシー (RP) に関するものです。 TSDB for InfluxDB® は、データベースの
DEFAULTRP からデータを自動的にクエリします。 データがデフォルトの RP に保存されていない場合、使用する RP を明示的に指定しない限り、TSDB for InfluxDB® は結果を返しません。 -
SELECT 句のタグキー
クエリがデータを返すには、
SELECT句に少なくとも 1 つのフィールドキーを含める必要があります。SELECT句に 1 つ以上のタグキーのみが含まれている場合、クエリは空の結果を返します。詳細については、「データ探索」をご参照ください。 -
クエリの時間範囲
考えられるもう 1 つの説明は、クエリの時間範囲に関連しています。 デフォルトでは、ほとんどの
SELECTクエリは、1677-09-21 00:12:43.145224194UTC から2262-04-11T23:47:16.854775806ZUTC までの時間範囲を対象とします。 ただし、SELECT句を含むGROUP BY time()クエリは、1677-09-21 00:12:43.145224194からnow()までの時間範囲を対象とします。 データがnow()以降に発生する場合、GROUP BY time()クエリはnow()以降に発生するデータを対象としません。 クエリ文にGROUP BY time()句が含まれており、かつnow()以降に発生するデータがある場合は、時間範囲の上限を指定する必要があります。 -
識別子名
最後によくある原因として、スキーマにおいてフィールドとタグが同じ名前を持つケースが挙げられます。フィールドキーとタグキーが同一の場合、すべてのクエリでフィールドが優先されます。クエリでタグキーを指定するには、
::tag構文を使用する必要があります。
GROUP BY time() クエリで now() 以降のタイムスタンプが返されないのはなぜですか?
ほとんどの SELECT 文のデフォルトの時間範囲は、1677-09-21 00:12:43.145224194 UTC と 2262-04-11T23:47:16.854775806Z UTC の間です。SELECT 文に GROUP BY time() 句が含まれている場合、デフォルトの時間範囲は 1677-09-21 00:12:43.145224194 と now() の間です。
now() 以降のタイムスタンプを持つデータをクエリするために、SELECT 文で GROUP BY time() 句を使用する場合、WHERE 句に時間の上限を指定する必要があります。
以下の例では、最初のクエリはタイムスタンプが 2015-09-18T21:30:00Z から now() までのデータを対象とします。2 番目のクエリは、タイムスタンプが 2015-09-18T21:30:00Z から now() の 180 週間後までのデータを対象とします。
> SELECT MEAN("boards") FROM "hillvalley" WHERE time >='2015-09-18T21:30:00Z' GROUP BY time(12m) fill(none)
> SELECT MEAN("boards") FROM "hillvalley" WHERE time >='2015-09-18T21:30:00Z' AND time <= now()+180w GROUP BY time(12m) fill(none)
WHERE 句では、デフォルトの上限である now() を上書きするために、時間の上限を指定する必要があることに注意してください。 次のクエリは下限を now() にリセットするだけのため、クエリの時間範囲は now() と now() の間になります。
> SELECT MEAN("boards") FROM "hillvalley" WHERE time >= now() GROUP BY time(12m) fill(none)
>
time 構文の詳細については、「Data exploration」をご参照ください。
タイムスタンプに対して数学演算を実行できますか?
TSDB for InfluxDB® は、タイムスタンプに対する数学演算をサポートしていません。時間計算はクライアント側で実行してください。
TSDB for InfluxDB® では、タイムスタンプに対して使用できる InfluxQL 関数は限定されています。ELAPSED() 関数は、単一フィールド内のタイムスタンプ間の差分を返します。
返されるタイムスタンプから書き込み精度を特定できますか?
TSDB for InfluxDB® は、書き込み精度にかかわらず、すべてのタイムスタンプをナノ秒で保存します。データベースは、返されるタイムスタンプの末尾の 0 を暗黙的に削除するため、元の書き込み精度を特定することは困難です。
次の例では、タグ precision_supplied および timestamp_supplied は、ユーザーがデータを書き込むときに指定した時間精度とタイムスタンプを示します。 TSDB for InfluxDB® は返されたタイムスタンプから末尾のゼロを自動的に削除するため、返されたタイムスタンプから書き込み精度を特定することは困難です。
name: trails
-------------
time value precision_supplied timestamp_supplied
1970-01-01T01:00:00Z 3 n 3600000000000
1970-01-01T01:00:00Z 5 h 1
1970-01-01T02:00:00Z 4 n 7200000000000
1970-01-01T02:00:00Z 6 h 2
データをクエリする際、シングルクォーテーションとダブルクォーテーションはいつ使用しますか?
タグ値などの文字列値は、シングルクォーテーションで囲みます。識別子はシングルクォーテーションで囲まないでください。識別子には、データベース名、保持ポリシー名、ユーザー名、メジャメント名、タグキー、フィールドキーが含まれます。
識別子が数字で始まる場合、[A-z,0-9,_] 以外の文字を含む場合、または InfluxQL のキーワードである場合は、識別子を二重引用符で囲みます。識別子がこれらのいずれのカテゴリにも該当しない場合、二重引用符で囲む必要はありません。ただし、囲むことを推奨します。
例:
有効なクエリ: SELECT bikes_available FROM bikes WHERE station_id='9'
有効なクエリ:SELECT "bikes_available" FROM "bikes" WHERE "station_id"='9'
有効なクエリ: SELECT MIN("avgrq-sz") AS "min_avgrq-sz" FROM telegraf
有効なクエリ: SELECT * from "cr@zy" where "p^e"='2'
無効なクエリ:SELECT 'bikes_available' FROM 'bikes' WHERE 'station_id'="9"
不正なクエリ: SELECT * from cr@zy where p^e='2'
日時文字列を囲むには、シングルクォーテーションを使用します。ダブルクォーテーションを使用すると、TSDB for InfluxDB® からエラー (ERR: invalid operation: time and *influxql.VarRef are not compatible) が返されます。
例:
有効なクエリ: SELECT "water_level" FROM "h2o_feet" WHERE time > '2015-08-18T23:00:01.232000000Z' AND time < '2015-09-19'
無効なクエリ: SELECT "water_level" FROM "h2o_feet" WHERE time > "2015-08-18T23:00:01.232000000Z" AND time < "2015-09-19"
time 構文の詳細については、「Data exploration」をご参照ください。
新しい DEFAULT 保持ポリシーを作成した後にデータが失われるのはなぜですか?
データベースで新しいデフォルト保持ポリシー (RP) を作成した場合、古いデフォルト RP のデータは古い RP に残ります。RP を指定しないクエリは、新しいデフォルト RP からデータを自動的にクエリするため、古いデータがすべて失われたように見える場合があります。古いデータをクエリするには、クエリでデータを完全修飾する必要があります。次の例をご参照ください:
メジャーメント fleeting 内のすべてのデータは、one_hour という名前のデフォルト RP に属します:
> SELECT count(flounders) FROM fleeting
name: fleeting
--------------
time count
1970-01-01T00:00:00Z 8
次に、新しいデフォルト RP (two_hour) を作成し、同じクエリを実行します:
> SELECT count(flounders) FROM fleeting
>
古いデータをクエリするには、fleeting を完全修飾して古いデフォルトの RP を指定する必要があります:
> SELECT count(flounders) FROM fish.one_hour.fleeting
name: fleeting
--------------
time count
1970-01-01T00:00:00Z 8
WHERE OR time 句を含むクエリで結果が空になるのはなぜですか?
TSDB for InfluxDB® は、OR を WHERE 句で使用して複数の時間範囲を指定することをサポートしていません。クエリの WHERE 句で OR を使用して複数の時間範囲を指定しても、TSDB for InfluxDB® は結果を返しません。
例:
> SELECT * FROM "absolutismus" WHERE time ='2016-07-31T20:07:00Z' OR time ='2016-07-31T23:07:17Z'
>
fill(previous) で結果が空になるのはなぜですか?
直前の値がクエリの時間範囲外にある場合、fill(previous) はそのタイムバケットの値を補完しません。
次の例では、クエリの時間範囲に前のタイムバケットが含まれていないため、TSDB for InfluxDB® はタイムバケット 2016-07-12T16:50:00Z-2016-07-12T16:50:10Z の値でタイムバケット 2016-07-12T16:50:20Z-2016-07-12T16:50:30Z を補完しません。
サンプルデータ:
> SELECT * FROM "cupcakes"
name: cupcakes
--------------
time chocolate
2016-07-12T16:50:00Z 3
2016-07-12T16:50:10Z 2
2016-07-12T16:50:40Z 12
2016-07-12T16:50:50Z 11
GROUP BY time() クエリ:
> SELECT max("chocolate") FROM "cupcakes" WHERE time >='2016-07-12T16:50:20Z' AND time <='2016-07-12T16:51:10Z' GROUP BY time(20s) fill(previous)
name: cupcakes
--------------
time max
2016-07-12T16:50:20Z
2016-07-12T16:50:40Z 12
2016-07-12T16:51:00Z 12
INTO クエリでデータが失われるのはなぜですか?
デフォルトでは、INTO クエリはソースデータのタグを新しく書き込まれたデータのフィールドに変換します。これにより、TSDB for InfluxDB® が、以前はタグによって区別されていたデータポイントを上書きする可能性があります。新しく書き込まれたデータ内のタグを保持するには、すべての INTO クエリに GROUP BY * を含めます。
この方法は、TOP() または BOTTOM() クエリには適用されません。これらの関数は、InfluxDB 関数に記載されています。
サンプルデータ
メジャーメント french_bulldogs には、タグ color とフィールド name が含まれています。
> SELECT * FROM "french_bulldogs"
name: french_bulldogs
---------------------
time color name
2016-05-25T00:05:00Z peach nugget
2016-05-25T00:05:00Z grey rumple
2016-05-25T00:10:00Z black prince
-
GROUP BY * なしの INTO クエリ
INTOクエリにGROUP BY *句がない場合、タグcolorは新しく書き込まれたデータ内のフィールドに変換されます。 ソースデータでは、データポイントnuggetとrumpleは、タグcolorによってのみ区別されます。colorがフィールドになると、TSDB for InfluxDB® はデータポイントnuggetとrumpleを重複とみなします。 その結果、データポイントnuggetはデータポイントrumpleによって上書きされます。> SELECT * INTO "all_dogs" FROM "french_bulldogs" name: result ------------ time written 1970-01-01T00:00:00Z 3 > SELECT * FROM "all_dogs" name: all_dogs -------------- time color name 2016-05-25T00:05:00Z grey rumple <---- no more nugget 2016-05-25T00:10:00Z black prince -
GROUP BY * ありの INTO クエリ
GROUP BY *句を含むINTOクエリは、新しく書き込まれたデータ内でタグcolorを保持します。この場合、データポイントnuggetとrumpleは別個のデータポイントとして残り、TSDB for InfluxDB® はデータを上書きしません。> SELECT "name" INTO "all_dogs" FROM "french_bulldogs" GROUP BY * name: result ------------ time written 1970-01-01T00:00:00Z 3 > SELECT * FROM "all_dogs" name: all_dogs -------------- time color name 2016-05-25T00:05:00Z peach nugget 2016-05-25T00:05:00Z grey rumple 2016-05-25T00:10:00Z black prince
タグキーとフィールドキーの名前が同じ場合、データをどのようにクエリしますか?
キーがフィールドキーかタグキーかを指定するには、:: 構文を使用します。サンプルデータ:
> INSERT candied,almonds=true almonds=50,half_almonds=51 1465317610000000000
> INSERT candied,almonds=true almonds=55,half_almonds=56 1465317620000000000
> SELECT * FROM "candied"
name: candied
-------------
time almonds almonds_1 half_almonds
2016-06-07T16:40:10Z 50 true 51
2016-06-07T16:40:20Z 55 true 56
-
キーがフィールドであることを指定
> SELECT * FROM "candied" WHERE "almonds"::field > 51 name: candied ------------- time almonds almonds_1 half_almonds 2016-06-07T16:40:20Z 55 true 56 -
キーがタグであることを指定
> SELECT * FROM "candied" WHERE "almonds"::tag='true' name: candied ------------- time almonds almonds_1 half_almonds 2016-06-07T16:40:10Z 50 true 51 2016-06-07T16:40:20Z 55 true 56
メジャメントをまたいでデータをクエリするにはどうすればよいですか?
メジャメントをまたいだ数値演算やグループ化はサポートされていません。すべてのデータは同じメジャメント内にある必要があります。TSDB for InfluxDB® はリレーショナルデータベースではありません。メジャメントをまたいでデータをマッピングすることは避けてください。
タイムスタンプの順序は重要ですか?
いいえ。テスト結果から、TSDB for InfluxDB® が次のクエリを完了するまでにかかる時間には、ほとんど差がないことがわかっています:
SELECT ... FROM ... WHERE time > 'timestamp1' AND time < 'timestamp2'
SELECT ... FROM ... WHERE time < 'timestamp2' AND time > 'timestamp1'
SELECT タグキーはあるがタグ値がないデータを取得する方法
空のタグ値を指定するには、'' を使用します。例:
> SELECT * FROM "vases" WHERE priceless=''
name: vases
-----------
time origin priceless
2016-07-20T18:42:00Z 8
データ書き込み
書き込みジッターが定期的に発生するのはなぜですか?
書き込みジッターは、TSDB for InfluxDB® がパーティションを切り替える際に発生します。ジッターの周期が保持ポリシーのシャードグループ期間と同じかどうかを確認できます。メジャメント数と時系列数を減らすことで、ジッターの振れ幅を抑えられます。
ラインプロトコル書き込み時の注意事項
ラインプロトコルで書き込む際は、次の点に注意してください:
-
整数を指定するには、数値に
iを付加します。 たとえば、value=100iは整数であり、value=100は浮動小数点数です。 -
ダブルクォーテーションは、文字列のフィールド値にのみ使用します。メジャメント、タグキー、タグ値、フィールドキーに含まれるダブルクォーテーションは、名前の一部として扱われます。
-
特殊文字は、クォーテーションで囲むのではなく、バックスラッシュでエスケープしてください。
書き込み後にデータが表示されないのはなぜですか?
InfluxDB は、リテンションポリシーに従って期限切れのデータを破棄します。partial write: points beyond retention policy が表示された場合は、書き込みタイムスタンプをリテンションポリシーの TTL と照らし合わせて確認してください。
ディスクがフルの状態から空き容量を確保しても書き込みが再開されないのはなぜですか?
InfluxDB のディスクがフルになると、書き込みが失敗し、空き容量を確保しても自動的には再開されません。スケールアウトするかデータを削除した後、コンソールからプロセスを再起動してください。
整数のフィールド値はどのように書き込みますか?
整数を書き込むには、フィールド値の末尾に i を付加します。i を付加しない場合、TSDB for InfluxDB® はフィールド値を浮動小数点数として扱います。
整数を書き込むには、value=100i とします。 浮動小数点数を書き込むには、value=100 とします。
TSDB for InfluxDB® は重複するデータポイントをどのように処理しますか?
データポイントは、メジャメント名、タグセット、およびタイムスタンプによって一意に識別されます。既存のデータポイントと同じメジャメント、タグセット、タイムスタンプを持ち、かつフィールドセットが異なるデータポイントを送信した場合、そのデータポイントのフィールドセットは、古いフィールドセットと新しいフィールドセットの和集合になります。競合がある場合は、新しいフィールドセットが優先されます。これは想定される動作です。
例:
古いデータポイント:cpu_load,hostname=server02,az=us_west val_1=24.5,val_2=7 1234567890000000
新しいデータポイント:cpu_load,hostname=server02,az=us_west val_1=5.24 1234567890000000
新しいデータポイントを送信すると、TSDB for InfluxDB® によって val_1 の値は新しいフィールド値で上書きされ、val_2 の値は保持されます:
> SELECT * FROM "cpu_load" WHERE time =1234567890000000
name: cpu_load
--------------
time az hostname val_1 val_2
1970-01-15T06:56:07.89Z us_west server02 5.24 7
両方のデータポイントを保存するには、次のいずれかを実行します:
-
一意性を確保するために、新しいタグを追加します。
古いデータポイント:
cpu_load,hostname=server02,az=us_west,uniq=1 val_1=24.5,val_2=7 1234567890000000新しいデータポイント:
cpu_load,hostname=server02,az=us_west,uniq=2 val_1=5.24 1234567890000000TSDB for InfluxDB® に新しいデータポイントを書き込んだ後:
> SELECT * FROM "cpu_load" WHERE time =1234567890000000 name: cpu_load -------------- time az hostname uniq val_1 val_2 1970-01-15T06:56:07.89Z us_west server02 1 24.5 7 1970-01-15T06:56:07.89Z us_west server02 2 5.24 -
タイムスタンプを 1 ナノ秒インクリメントします。
古いデータポイント:
cpu_load,hostname=server02,az=us_west val_1=24.5,val_2=7 1234567890000000新しいデータポイント:
cpu_load,hostname=server02,az=us_west val_1=5.24 1234567890000001TSDB for InfluxDB® に新しいデータポイントを書き込んだ後:
> SELECT * FROM "cpu_load" WHERE time >=1234567890000000 and time <=1234567890000001 name: cpu_load -------------- time az hostname val_1 val_2 1970-01-15T06:56:07.89Z us_west server02 24.5 7 1970-01-15T06:56:07.890000001Z us_west server02 5.24
HTTP API に必要なラインフィードは何ですか?
TSDB for InfluxDB® のラインプロトコルでは、改行文字 (\n、ASCII 0x0A) が 1 行の終わりと新しい行の始まりを示します。\n 以外の改行文字を使用するファイルまたはデータでは、bad timestamp または unable to parse エラーが発生します。
Windows では \r\n (キャリッジリターン + ラインフィード) を使用するため、互換性がありません。
TSDB for InfluxDB® にデータを書き込む際、避けるべき単語や文字は何ですか?
-
InfluxQL キーワード
InfluxQL キーワードを識別子として使用する場合は、すべてのクエリでその識別子をダブルクォーテーションで囲む必要があります。使用しないとエラーになります。識別子には、継続クエリ名、データベース名、フィールドキー、メジャメント名、保持ポリシー名、タグキー、ユーザー名が含まれます。
-
Time
キーワード
timeは特殊なケースです。timeは、継続的なクエリ名、データベース名、メジャメント名、リテンションポリシー名、およびユーザー名にすることができます。これらのケースでは、クエリでtimeをダブルクォーテーションマークで囲む必要はありません。timeは、フィールドキーまたはタグキーにすることはできません。TSDB for InfluxDB® は、フィールドキーまたはタグキーとしてtimeを使用するデータの書き込みを拒否します。このような書き込みに対して、TSDB for InfluxDB® はエラーを返します。次の例をご参照ください。-
time をメジャメントとしてデータを書き込み、クエリします。
> INSERT time value=1 > SELECT * FROM time name: time time value --------- 2017-02-07T18:28:27.349785384Z 1TSDB for InfluxDB® では、
timeは有効なメジャーメント名です。 -
time をフィールドキーとしてデータを書き込み、クエリを試行します。
> INSERT mymeas time=1 ERR:{"error":"partial write: invalid field name: input field \"time\" on measurement \"mymeas\" is invalid dropped=1"}TSDB for InfluxDB® では、
timeは有効なフィールドキーではありません。システムはデータポイントを書き込むことができず、400エラーを返します。 -
time をタグキーとしてデータを書き込み、クエリを試行します。
> INSERT mymeas,time=1 value=1 ERR:{"error":"partial write: invalid tag key: input tag \"time\" on measurement \"mymeas\" is invalid dropped=1"}TSDB for InfluxDB® では、
timeは有効なタグキーではないため、システムはデータポイントを書き込むことができず、400エラーを返します。
-
-
文字
正規表現とクォーティングを簡潔に保つため、識別子には次の文字を使用しないでください:
\(バックスラッシュ)、^(キャレット)、$(ドル記号)、'(単一引用符)、"(二重引用符)、=(等号)、および,(コンマ)。
データを書き込む際、シングルクォーテーションとダブルクォーテーションはいつ使用しますか?
-
ラインプロトコルで書き込む際は、識別子をクォーテーションで囲まないでください。クエリが複雑になります。識別子には、継続クエリ名、データベース名、フィールドキー、メジャメント名、保持ポリシー名、サブスクリプション名、タグキー、ユーザー名が含まれます。
-
メジャーメント名を二重引用符で囲んで書き込みます:
INSERT "bikes" bikes_available=3。 対応するクエリ:SELECT * FROM "\"bikes\"" -
メジャーメントを単一引用符で囲んで書き込みます:
INSERT 'bikes' bikes_available=3。 対応するクエリ:SELECT * FROM "\'bikes\'" -
メジャメントを引用符なしで書き込みます:
INSERT bikes bikes_available=3。該当するクエリ:SELECT * FROM "bikes"
-
-
文字列のフィールド値は、ダブルクォーテーションで囲みます。
書き込み:
INSERT bikes happiness="level 2"。対応するクエリ:SELECT * FROM "bikes" WHERE "happiness"='level 2' -
特殊文字は、クォーテーションで囲むのではなく、バックスラッシュでエスケープしてください。
書き込み:
INSERT wacky va\"ue=4。適用可能なクエリ:SELECT "va\"ue" FROM "wacky"
タイムスタンプの精度は重要ですか?
書き込みパフォーマンスを最適化するには、可能な限り粗い時間精度を使用してください。
次の 2 つの例では、1 つ目のリクエストはデフォルトの精度 (ナノ秒) を使用し、2 つ目のリクエストは精度を秒に設定しています:
curl -i -XPOST "https://<endpoint>:3242/write?db=weather&u=<username>&p=<password>" --data-binary 'temperature,location=1 value=90 1472666050000000000'
curl -i -XPOST "https://<endpoint>:3242/write?db=weather&precision=s&u=<username>&p=<password>" --data-binary 'temperature,location=1 value=90 1472666050'
トレードオフ:精度を粗くすると、タイムスタンプの重複が発生する可能性が高くなり、データの上書きが発生する場合があります。
コマンドラインインターフェイス (Influx CLI)
コマンドラインインターフェイスで TSDB for InfluxDB® に接続できない問題
次の条件を 1 つずつ確認してください:
-
実行権限が必要です。
chmod +x ./influxコマンドを実行して権限を追加できます。 -
接続ステートメントで -ssl オプションを指定する必要があります。
-
-host オプションには、
ts-bp17j28j2y7pm****.influxdata.rds.aliyuncs.comのような接続文字列のみを指定します。プロトコルとポート番号は追加しないでください。
Influx CLI で人間が判読可能な形式のタイムスタンプを返す方法
Influx CLI に初めて接続する際に、rfc3339 の精度を指定します:
$ influx -ssl -username <username> -password <password> -host <endpoint> -port 3242 -precision rfc3339
または、Influx CLI に接続した後に精度を指定します:
$ influx -ssl -username <username> -password <password> -host <endpoint> -port 3242
Connected to https://<endpoint>:3242 version 1.7.x
> precision rfc3339
詳細については、「コマンドラインインターフェイス (Influx CLI)」をご参照ください。
非管理者ユーザーが USE ステートメントでデータベースを指定する方法
非管理者ユーザーが、データベースに対する READ および WRITE 権限、または READ 権限のみを持っている場合、USE <database_name> ステートメントを実行できます。 非管理者ユーザーが USE を使用して、READ および WRITE 権限、または READ 権限のないデータベースを指定しようとすると、システムはエラーを返します:
ERR: Database <database_name> doesn't exist. Run SHOW DATABASES for a list of existing databases.
SHOW DATABASES クエリは、非管理者ユーザーが READ または WRITE 権限を持つデータベースのみを返します。
Influx CLI を使用してデフォルト以外の保持ポリシーにデータを書き込む方法
デフォルト以外のリテンションポリシーにデータを書き込むには、構文 INSERT INTO [<database>.]<retention_policy> <line_protocol> を使用します。(このデータベースとリテンションポリシーの指定方法は、Influx CLI でのみ許可されています。HTTP 経由でデータを書き込む場合は、db および rp パラメーターを使用して、それぞれデータベースとリテンションポリシーを指定する必要があります。リテンションポリシーの指定は任意です。) 次の例をご参照ください。
> INSERT INTO one_day mortality bool=true
Using retention policy one_day
> SELECT * FROM "mydb"."one_day"."mortality"
name: mortality
---------------
time bool
2016-09-13T22:29:43.229530864Z true
デフォルト以外の保持ポリシーのデータをクエリするには、メジャーメントを次の構文で完全修飾する必要があります:
"<database>"."<retention_policy>"."<measurement>"
データ型
ブール値のフィールド値をクエリできないのはなぜですか?
ブール値の書き込みとクエリでは、構文が異なります。
|
ブール値の構文 |
書き込み |
クエリ |
|
|
√ |
❌ |
|
|
√ |
❌ |
|
|
√ |
√ |
|
|
√ |
√ |
|
|
√ |
√ |
たとえば、SELECT * FROM "hamlet" WHERE "bool"=True は、bool が TRUE と等しいすべてのデータポイントを返します。一方、SELECT * FROM "hamlet" WHERE "bool"=T は結果を返しません。
TSDB for InfluxDB® は、シャード間でフィールド型が一致しない場合をどのように処理しますか?
フィールド値は、浮動小数点数、整数、文字列、またはブール値です。シャード内では、フィールド値のデータ型は一致している必要があります。一方、異なるシャード間では、フィールド値のデータ型が異なる場合があります。
-
SELECT 文
SELECT文は、デフォルトでは同じデータ型のフィールド値をすべて返します。異なるシャード間でフィールド値のデータ型が一致しない場合、TSDB for InfluxDB® は、可能であれば最初に型変換を実行します。その後、浮動小数点数、整数、文字列、ブール値の順に、すべての値を返します。データ内でフィールド値の型が異なる場合は、<field_key>::<type>構文を使用して、異なるデータ型をクエリします。次の例をご参照ください:メジャメント
just_my_typeには、my_fieldという名前のフィールドがあります。my_fieldには、4 つの異なるシャードに 4 つのフィールド値があり、それぞれのフィールド値のデータ型は異なります (浮動小数点数、整数、文字列、ブール値)。SELECTは、浮動小数点数と整数のフィールド値のみを返します。結果では、TSDB for InfluxDB® が整数を浮動小数点数に強制的に変換します。> SELECT * FROM just_my_type name: just_my_type ------------------ time my_field 2016-06-03T15:45:00Z 9.87034 2016-06-03T16:45:00Z 7SELECT <field_key>::<type> [...]は、すべてのデータ型を返します。TSDB for InfluxDB® は、型ごとのデータを個別の列に出力し、列名をインクリメントします。可能な場合、TSDB for InfluxDB® はフィールド値を別のデータ型に変換します。1 列目では整数7を浮動小数点数に変換し、2 列目では浮動小数点数9.87034を整数に変換します。TSDB for InfluxDB® は、浮動小数点数または整数を文字列やブール値に変換できません。> SELECT "my_field"::float,"my_field"::integer,"my_field"::string,"my_field"::boolean FROM just_my_type name: just_my_type ------------------ time my_field my_field_1 my_field_2 my_field_3 2016-06-03T15:45:00Z 9.87034 9 2016-06-03T16:45:00Z 7 7 2016-06-03T17:45:00Z a string 2016-06-03T18:45:00Z true -
SHOW FIELD KEYS クエリ
SHOW FIELD KEYSは、フィールドキーに対応する各シャードのすべてのデータ型を返します。次の例をご参照ください:メジャメント
just_my_typeには、my_fieldという名前のフィールドがあります。my_fieldには、4 つの異なるシャードに 4 つのフィールド値があり、それぞれのフィールド値のデータ型は異なります (浮動小数点数、整数、文字列、ブール値)。SHOW FIELD KEYSは、4 つすべてのデータ型を返します:> SHOW FIELD KEYS name: just_my_type fieldKey fieldType ----------------- my_field float my_field string my_field integer my_field boolean
TSDB for InfluxDB® が保存できる整数の最小値と最大値は何ですか?
TSDB for InfluxDB® は、すべての整数を符号付き int64 データ型として保存します。int64 の最小および最大の有効値は、それぞれ -9223372036854775808 と 9223372036854775807 です。詳細については、Go builtins をご参照ください。
最小値または最大値に近い値であっても範囲内の値を使用すると、想定外の結果になる場合があります。一部の関数と演算子は、計算中に int64 データ型を float64 に変換するため、オーバーフローが発生する場合があります。
TSDB for InfluxDB® が保存できるタイムスタンプの最小値と最大値は何ですか?
タイムスタンプの最小値は -9223372036854775806 または 1677-09-21T00:12:43.145224194Z、最大値は 9223372036854775806 または 2262-04-11T23:47:16.854775806Z です。この範囲外のタイムスタンプは解析エラーを返します。
フィールドに保存されているデータ型はどのように確認しますか?
SHOW FIELD KEYS クエリは、フィールドのデータ型も返します。
> SHOW FIELD KEYS FROM all_the_types
name: all_the_types
-------------------
fieldKey fieldType
blue string
green boolean
orange integer
yellow float
フィールドのデータ型を変更できますか?
TSDB for InfluxDB® は、フィールドのデータ型変更を限定的にサポートしています。<field_key>::<type> 構文では、フィールド値を整数から浮動小数点数に変換する、または浮動小数点数から整数に変換することができます。変換の詳細は Data exploration に記載されています。浮動小数点数または整数を文字列やブール値に変換すること、およびその逆はできません。
フィールドのデータ型を変更する方法:
-
別のフィールドにデータを書き込む
最も簡単な方法は、同じシリーズ内の別のフィールドに、新しいデータ型でデータを書き込むことです。
-
シャードシステムを使用する
シャード内では、フィールド値のデータ型を変えることはできません。一方、異なるシャード間では、フィールド値のデータ型を変えられます。
フィールドのデータ型を変更するには、
SHOW SHARDSクエリを使用して、現在のシャードのend_timeを特定します。データポイントのタイムスタンプがend_timeよりも後の場合、TSDB for InfluxDB® は既存のフィールドへの異なるデータ型の書き込みを許可します。たとえば、元々は整数を受け付けていたフィールドでも、end_timeの後は浮動小数点数を受け付けられます。なお、この操作では、元のシャード内のフィールドのデータ型は変更されません。
InfluxQL 関数
関数内で数学演算を実行するにはどうすればよいですか?
TSDB for InfluxDB® は、関数内での数学演算をサポートしていません。回避策としてサブクエリを使用してください:
InfluxQL は次の構文をサポートしていません:
SELECT MEAN("dogs"-"cats") from "pet_daycare"
代わりに、サブクエリを使用して同じ結果を得ることができます:
> SELECT MEAN("difference") FROM (SELECT "dogs"-"cats" AS "difference" FROM "pet_daycare")
サブクエリの詳細については、「データ探索」をご参照ください。
クエリがタイムスタンプとしてエポック 0 を返すのはなぜですか?
TSDB for InfluxDB® では、エポック 0 (1970-01-01T00:00:00Z) は、しばしば null タイムスタンプとして使用されます。時間範囲が指定されていない集計関数など、タイムスタンプを返せないクエリをリクエストすると、TSDB for InfluxDB® はタイムスタンプとしてエポック 0 を返します。
ネストをサポートしている InfluxQL 関数はどれですか?
次の InfluxQL 関数はネストをサポートしています:
-
ネストされた
DISTINCT()を含むCOUNT() -
CUMULATIVE_SUM() -
DERIVATIVE() -
DIFFERENCE() -
ELAPSED() -
MOVING_AVERAGE() -
NON_NEGATIVE_DERIVATIVE() -
HOLT_WINTERS()およびHOLT_WINTERS_WITH_FIT()
ネストされた関数の代わりにサブクエリを使用する方法については、「データ探索」をご参照ください。
InfluxDB データ移行
セルフマネージド InfluxDB のクラウドへの移行
InfluxDB 公式の influx_inspect ツールを使用して、セルフマネージド InfluxDB サーバーからラインプロトコルファイルをエクスポートします。次に、コマンドラインインターフェイス (Influx CLI) を使用して、ファイルを TSDB for InfluxDB® にインポートします。
クラウド上の異なる InfluxDB インスタンス間でのデータ移行
InfluxDB インスタンス間に組み込みの移行ツールはありません。クエリを使用してデータをエクスポートし、手動でインポートしてください。時間およびタグフィルターを使用してバッチで移行し、安定性に影響を与える大規模なクエリは避けてください。
InfluxDB から LindormTSDB へのデータ移行
TSDB for InfluxDB® インスタンスから LindormTSDB に全量データをインポートします。詳細については、「TSDB for InfluxDB® の履歴データ移行ソリューション」をご参照ください。