TiPrometheus:TiDBベースTSDB|TiDB Hackathon 2018優秀プロジェクト共有


著者は菜兄と彼の友达のチームの于暢さんで、彼らのプロジェクトTiPrometheusはすでにPrometheus adapterに合併されています.このプロジェクトは2つの小さなプロジェクトに分けられ,タイミングデータの格納と計算の問題をそれぞれ解決した.ストレージは主にPrometheus構文とデータフォーマットに互換性があり、正確なクエリー、あいまいなクエリーを実現し、既存の構文と完全に互換性があります.すべてのデータはTiKVにのみ存在する.計算は主にTiKV呼び出しLuaにより実現され,Lua動的拡張によりデータ計算の機能が実現される.
プロジェクトの概要
TiDBに注目している以上、Infrastructureに注目している硬骨漢(妹)子に違いない.モニタリングはInfraの不可欠な一環として、その核心はTSDB(time series database)である.
TSDBは時間を主なインデックスとするデータベースで、主に時間をシーケンスとする指標データを大量に格納するために使用され、データ構造も比較的簡単で、通常は特徴情報、指標データ、timestampを含む.一般的なTSDBには、InfluxDB、OpenTSDB、Prometheusがあります.
Prometheusは一連の監視システムであり、タイミングデータベースはその記憶部分であり、以下のアーキテクチャ図はPrometheusの公式から来ており、そのアーキテクチャと生態の構成を簡単に要約している.
Prometheusはまた、リモートの読み書きが可能で、クエリーに対して透明な機能である図に現れていないRemote Storageもサポートしています.この機能は主に長いストレージに使われています.私たちのプロジェクトはTiKVベースのTSDBを実現してPrometheusのRemote Storageを作りました.
コア実装
Prometheusが記録したデータ構造はlabel,samplesの2つの部分に分かれている.Labelはいくつかの特徴情報を記録した.samplesには指標データとtimestampが含まれています.
"labels": [{
	"job":        "node",
	"instance":   "123.123.1.211:9090",
}]
"samples":[{
	"timestamp": 1473305798
	"value": 0.9
}]

Labelと時間範囲を組み合わせると、必要なvalueをクエリーできます.
これらのレコードをクエリーするには、2つのインデックスlabel indexとtime indexを構築し、valueを特殊なkeyで格納する必要があります.
label index
各ペアのlabelはindex:label:#をkeyとし、labelIDはvalueとして格納される.新しいレコードはvalueの後ろに追加されます.これは、検索でよく使用される逆インデックスです.
time index
各sample項目はindex:timeseries::をkeyとし、timestampはvalueとする.splitTimeは、タイムスライスの開始点です.新しいtimestampはvalueの後ろに追加されます.
docストレージ
各samplesレコードはtimeseries:doc::をkeyとしてTiKVに格納され、labelIDはlabel全文のハッシュ値である.
次に整理します
書き込みプロセス
  • labelID
  • を生成する.
  • label index,index:label:# "labelID,labelID"
  • を構築
  • 構築time index,index:timeseries:: "ts,ts"
  • 書き込みタイミングデータ、timeseries:doc:: "value"
  • クエリー・プロシージャ
  • 逆インデックスに基づいてlabelIDの集合を検出し、複数のlabelのクエリはlabelIDの集合に対して交差を求める.
  • は、labelIDおよび時間範囲内のタイムスライスクエリに含まれるtimestampに基づいている.
  • は、labelIDおよびtimestampに基づいて必要なvalueを検出する.

  • これらの無駄な話をし終わったら、まじめな話をしましょう.
    なぜこんなプロジェクトを?
    2018年下半期、PingCAPが組織したHackathonは、当時萌新として試合に出場することになり、必ず文体両開花を考え、開源文化を発揚した.
    4つのアイデアが芽生えました
  • TiKV TSDB
  • Machine Learning on TiSpark
  • 魔改TiKV+Lua做mapreduce
  • geo全文検索
  • 核心的な考え方.
  • ができて、参加の要求に合います.
  • は確かに試合ではなく生産問題を解決することができます.

  • 髪を触ると、ML on TiSparkは硬すぎて、全然できないと思います.
    TiHaoopも硬すぎて、やりきれない.
    geoは工場での生産で何の問題もなかった.
    最後に考え直し、頭をたたいて二線操作を決め、TiKVベースのTSDBとTiKV+Luaを作り、タイミング検索機能を完成させるとともに、より豊かな演算子を増やす(試合前の2日間は何をしたいのか).
    試合の過程.
    金曜日
    予定では、事前にrustを見て、rustとして萌えます.
    そこで前日に同僚とrustの本を借りて、一日でrustになる準備をしました.
    その後、ドラマを見たほうが役に立つことに気づいた.
    Day 1(土)
    土曜日の試合に参加した時、長いオープニング挨拶があると思っていたので、10時にまた行くことにしました.
    现场に着いて、みんながすでにコードをかき回し始めたことに気づきました???
    全体の過程は順調だったが、その中にもいくつかの問題があった.
    Prometheusの依存とTiKVのいくつかの依存は互換性がなくて、そこでforkはPrometheusの依存を1部あげて、野道は2行変えて、互換性があります.
    午後5時にはほぼタイミングが実現したが,連調ではデータの読み書きが一致しないことが分かった.菜兄の1つのバグによって、それから長いdebugが始まり、全部で5時間かかりました(特に、私たちのグループは菜兄と彼の友达を呼んでいます).
    夜10時、家に帰るつもりで、もうdebugをするつもりはありません.1つのbugを5時間調べました.娯楽チームとして、徹夜でコードを書くことは不可能です.
    それぞれの家に帰って、それぞれのお母さんを探します.
    Day 2(日)
    長い半日Lua仮想マシン+rustに精通し始めました.
    なぜTiKVのコンパイルがこんなに遅いのかという問題もありました??1日に24回しかコンパイルする機会がありません???
    午後2時、最初のチームとして、私たちはタイムリーにPPTを生成しました.結局、PPTエンジニアの基礎はまだあります.
    1週間後の月曜日
    前に書いたクズコードは、簡単にREADMEを書いた.試してみる気持ちで、Prometheus adapterにPRをしました.
    そして、意外にも中に入れられた!!!
    午后に书いたコードが闭じ込められたなんて!!!
    成果
  • はTiKVとPrometheusを徹底的に貫通した.
  • は、TiKVのタイミング記憶および計算のためのアイデアを提供する(前にTiDBにタイミングデータを記憶したことがある).
  • Prometheusのロングストレージには、まだ使いやすいスキームが提供されています(M 3は実際にはまあまあですが、Thanosはスライスメカニズムであり、本当の意味の分散ストレージとは言えません).
  • はすでに会社の生産環境で試用されており、既存のシナリオに代わる計画がなければ、ビッグデータ量のテストが必要です.

  • 悟る
    Hackathonに参加するのは、週末に2日間のクラスを追加するのとあまり違いません.
    最初から来たのは、賞品を混ぜたいだけです.例えば、かばんです.去年DevConからもらった布袋に参加して1年使ったが、まだ壊れていないので、今年はもう一つもらうつもりだ.
    私たちより年下ですが、技術的にもいい仲間をたくさん見ました.例えば、蘭海たちのグループ、udfのグループです.少し年上の参加者も見られた.
    彼らの存在は、雑用に満ちた日常の仕事の中で奮闘し続ける原動力をもたらした.
    当時、この業界を選んだのは間違いなく、仕事だけではなかったようだ.
    Just for fun.
    に感謝
    唐劉先生と申礫先生の指導に感謝します.
    PingCAPがこの大規模なネットユーザーに会うイベントを開催したことに感謝し、収穫が豊富です.
    プロジェクトアドレス:github.com/bragfoo/Tip…(コード比較スラグ、考え方参考)
    広告を打つ:
    菜兄と彼の友达が翻訳した本:「Go言語同時の道」はすでに京東、淘宝に上陸した.
    とても素敵なGo言語の本で、検索して購入できます.
    参考資料:
  • fabxc.org/tsdb/
  • docs.influxdata.com/influxdb/v1…
  • github.com/prometheus/…