Opentsdb 2.4 Rollup機能で遭遇したピットを使用

7248 ワード

Opentsdb 2.4にはRollupとpre-aggregator機能が追加され、内外のネット検索に関する文章は公式文書とその翻訳以外の資料が少なく、公式文書も非常に粗雑で、使用中に多くの困難に直面しているので、今記録しておきます.
機能の紹介
TSDBの設計はすべての周波数の元のデータを格納することであり、このように広い時間範囲で集約クエリーを行うには通常、メモリオーバーフロー異常によってTSDBを殺すほど多くの時間がかかります.Opentsdbテーブルに4つのノードの500 msあたりの温度が記録されているように、1ヶ月の温度曲線を表示する必要がある場合、queryは非常に遅くなります.
格納されるデータには、次のmetricとtagがあると仮定します.
Series ID
Metric
Tag
Tag 2
ts1
Signal
node=A1
Name=temperature
ts2
Signal
node=B1
Name=temperature
ts3
Signal
node=B2
Name=temperature
ts4
Signal
node=A2
Name=temperature
 
500 msごとに1パケットのデータを送信し、ある時間以内の温度データを以下のように仮定する.
Series ID
12:00:00
+0.5
+1.0
+1.5
+2.0
+2.5
+3.0
……
+3599.5
ts1
13
 
14
15
14
14
13
……
15
ts2
14
14
13
14
14
 
14
……
16
ts3
15
15
15
 
14
14
13
……
13
ts4
15
15
14
14
13
15
15
……
14
毎日15時間実行する場合、1ヶ月の実行時間内、4ノード内の温度のグラフを表示する必要がある場合、バックグラウンドシステムはデータベースに30*15*7200*4=12960000点のデータを要求し、フロントエンドに渡して曲線描画を行う必要があります.これにより、データベース要求に時間がかかり、データがフロントエンドに送信されると帯域幅が大きくなり、ブラウザに大きなレンダリング圧力がかかります.downsampleを使用しても、12960000個のデータをデータベースで集約する必要があります.一方、1ヶ月の稼働時間内に4つのノードの最高温度の曲線を表示する必要がある場合、データベースは12960000個のデータを取り出してnode=A 1/B 1/B 2/A 2の4つのtagに対してmax集約演算を行い、同様に多くの時間と性能を消費する必要がある.
Opentsdbの1つのデータに対する大きな時間スパンのqueryと集約演算が頻繁に必要になる場合、データの事前要約と事前集約を行い、集約結果を記録し、クエリー速度を向上させ、演算圧力を低減することができます.OpenTSDB 2.4バージョンでは、元のデータの要約と集約結果を格納し、クイッククエリーに備えて新しいAPI、Rollup、Pre-Aggregatesが提供されています.
rollupは、元のデータを各整点開始時からinterval間隔時間ごとに指定データ(last/max/min/countなど)に格納する.
pre-aggregatesは、元のデータまたはRollupデータで指定されたtagのグループまたは複数のグループを集約し、opentsdbに演算結果をプリ格納します.
具体的には、500 ms毎に温度信号の元のデータに対して、元のデータを書き込むときにinterval間隔ごとにmax/min/lastなどの要約データとcountを格納し、クエリー時にopentsdbが直接要約データに戻り、クエリー性能を向上させることができる.
例えば、上記の温度のデータはinterval=1 mとすることができ、書き込まれた要約データは以下の表の通りである.
Series ID
12:00:00
+1m
+2m
+3m
+4m
+5m
+6m
……
+59m
Ts1count
59
60
57
59
60
58
59
……
60
Ts1sum
727
741
735
743
746
728
734
……
746
……
……
……
……
……
……
……
……
……
……
 
 
 
 
 
実装方法
Opentsdbでは、要約および事前集約データの生成および格納方法は提供されず、実装案は3つあります.
  • 一括処理
  • しばらく遅延してopentsdbからデータを読み出し、要約と集約を計算し、opentsdbに書き込む.
  • TSDに並ぶ
  • 書き込み対象データはキューに書き込まれ、interval時間経過後にキュー内のデータのsum、count、またはいくつかのtagの集約などを計算し、元のデータと要約/事前集約データをopentsdbに書き込む.
  • ストリーム処理
  • ストリーム処理フレームワーク(Storm,Flink,Sparkなど)を使用して、メッセージルーティングおよびメモリ内の記憶を処理します.
    具体的な操作
    今回のテストはRollup機能のみをテストし、構成とテスト手順は以下の通りです.
  • hbaseにtsdb-test,tsdb-test-pre,tsdb-test-rollup-1 m,tsdb-test-rollup-1 m-pre,tsdb-test-rollup-1 h,tsdb-test-rollup-1 h-preを作成します.
  • 構成/etc/opentsdb/opentsdb.conf,令tsd.storage.hbase.data_table=tsdb-test、tsdを追加する.roolups.enable=true,tsd.rollups.config=/etc/opentsdb/rollup_config.json.
  • 新規/etc/opentsdb/rollup_config.jsonは以下の
  • {
    	"aggregationIds": {
    		"sum": 0,
    		"count": 1,
    		"min": 2,
    		"max": 3,
    		"last": 4
    	},
    	"intervals": [
    		{
    			"table": "tsdb-test",
    			"preAggregationTable": "tsdb-test-pre",
    			"defaultInterval": true,
    			"interval": "1s",
    			"rowSpan": "1h"
    		},
    		{
    			"table": "tsdb-test-rollup-1m",
    			"preAggregationTable": "tsdb-test-rollup-1m-pre",
    			"interval": "1m",
    			"rowSpan": "1d"
    		},
    		{
    			"table": "tsdb-test-rollup-1h",
    			"preAggregationTable": "tsdb-test-rollup-1h-pre",
    			"interval": "1h",
    			"rowSpan": "1y"
    		}
    	]
    }
    

     
    注意:1 rowSpanはintervalの2^14倍の約15 k倍を超えてはいけません.例えば、1時間に1秒、1日に1分が適切で、1日(86 k秒)に1秒が間違っています.
    ②上記の構成は、1秒がデフォルトintervalであり、40 s-avg:および80 s-sum:などの数秒のデータダウンサンプリングを要求するデータは、元のデータを用いて計算されることを意味する.ダウンサンプリングされたintervalが1分と1時間の倍数(例えば120 s−sum,24 h−avg)である場合、データはRollupが格納したデータを用いる.
    ③1 mロールアップデータ書き込みの採取方法2を推奨し、キューキャッシュに書き込む元データを作成し、1分後にこの1分分分分のデータとまとめデータを書き込む.
    1 h rollupデータ書き込み方法1は、フリップフロップが1時間ごとに前の時間のすべての1 m rollupデータを読み出してrollupを行い、生成した1 h rollupデータをrollup-1 hテーブルに書き込み、数日間の信号曲線クエリを表示するために使用する.
    テスト時に元のデータと1 m,1 hの要約データを書き込み、元のデータvalue=10、/ai/rollupに送信された偽データの内容は以下の通りである.
    [
           {
                  "metric": "OpentsdbTest",
                  "aggregator": "sum",
                  "interval": "1m",
                  "value": 3600,
                  "timestamp": 1583721527,
                  "tags": {
                         "node": "A1",
                         "signal": "temperature"
                  }
           },
           {
                  "metric": "OpentsdbTest",
                  "aggregator": "count",
                  "interval": "1m",
                  "value": 120,
                  "timestamp": 1583721527,
                  "tags": {
                         "node": "A1",
                         "signal": "temperature"
                  }
           },
           {
                  "metric": "OpentsdbTest",
                  "aggregator": "sum",
                  "interval": "1h",
                  "value": 720000,
                  "timestamp": 1583721527,
                  "tags": {
                         "node": "A1",
                         "signal": "temperature"
                  }
           },
           {
                  "metric": "OpentsdbTest",
                  "aggregator": "count",
                  "interval": "1h",
                  "value": 70000,
                  "timestamp": 1583721527,
                  "tags": {
                         "node": "A1",
                         "signal": "temperature"
                  }
           },
    {...node A 2の1 mと1 hのデータ...},
                         {……}
    ]
    注意:Rollupデータのtimestampは10ビットの秒タイムスタンプしか使用できません.13ビットのミリ秒タイムスタンプを使用するとエラーが発生します(公式ドキュメントにはミリ秒タイムスタンプが表示されますが)
    1 m rollupデータと1 h rollupデータはテスト用の偽データであり、書き込まれたデータはqueryの異なる時間ダウンサンプリングのためにどのデータが読み込まれたかを観察するためにわざわざ一致しない.しばらく書き込んだ後にデータベースのデータを読み込み、書き込みが1分足らずの部分を除いて、大体次のような結果になります.
    query
    結果
    意味
    sum:
    10
    元のデータ
    sum:1m-sum:
    3600
    1 mロールアップデータ
    sum:60s-sum:
    3600
    1 mロールアップデータ
    sum:70s-sum:
    1400
    元のデータの集約
    sum:2m-sum
    7200
    1 m rollupデータ集約
    sum:1h-sum
    70000
    1 h rollupデータ