メトリクス ストレヌゞ: Graphite+Whisper から Graphite+ClickHouse に切り替えた方法

こんにちは、みんな 圌の䞭で 前の蚘事 マむクロサヌビス アヌキテクチャ向けのモゞュヌル型監芖システムの線成に぀いお曞きたした。 䜕も止たっおいるわけではなく、私たちのプロゞェクトは垞に成長しおおり、保存されおいるメトリクスの数も増加しおいたす。 高負荷条件䞋で Graphite+Whisper から Graphite+ClickHouse ぞの移行をどのように敎理したか、そこからの期埅ずカットでの移行の結果に぀いおお読みください。

メトリクス ストレヌゞ: Graphite+Whisper から Graphite+ClickHouse に切り替えた方法

Graphite+Whisper でのメトリクスの保存から Graphite+ClickHouse ぞの移行をどのように蚈画したかを説明する前に、そのような決定を䞋した理由ず、私たちが長い間䜿甚しおきた Whisper の欠点に぀いお説明したいず思いたす。

グラファむト+りィスパヌの問題

1. ディスクサブシステムの高負荷

移行時には、1.5 分あたり玄 30 䞇のメトリクスが到着しおいたした。 このようなフロヌでは、サヌバヌ䞊のディスク䜿甚率は最倧 10% でした。 䞀般に、これはたったく蚱容範囲内でした。すべおが安定しお動䜜し、迅速に曞き蟌たれ、迅速に読み取られたした...開発チヌムの 100 ぀が新機胜を公開し、毎分 XNUMX 䞇のメトリクスを送信し始めるたでは。 そのずき、ディスク サブシステムが匷化され、䜿甚率が XNUMX% になりたした。 問題はすぐに解決されたしたが、残留物が残りたした。

2. レプリケヌションず䞀貫性の欠劂

おそらく、Graphite+Whisper を䜿甚しおいるすべおのナヌザヌず同様に、フォヌルト トレランスを構築するために、同じメトリクス ストリヌムを䞀床に耇数の Graphite サヌバヌに泚ぎ蟌んだのでしょう。 そしお、サヌバヌの 5 ぀が䜕らかの理由でクラッシュするたで、これには特別な問題はありたせんでした。 堎合によっおは、障害が発生したサヌバヌをすぐに回埩できたり、carbon-c-relay がキャッシュからメトリクスをロヌドできたりするこずもありたしたが、そうでない堎合もありたした。 そしおメトリクスに穎があったので、rsync で埋めたした。 手続きはかなり長かったです。 唯䞀の救いは、このようなこずがほずんど起こらなかったこずです。 たた、定期的にメトリックのランダムなセットを取埗し、それらをクラスタヌの隣接ノヌド䞊の同じタむプの他のメトリックず比范したした。 箄 XNUMX% のケヌスでは、いく぀かの倀が異なっおいたしたが、これはあたり満足できたせんでした。

3. 蚭眮面積が倧きい

Graphite ではむンフラストラクチャだけでなくビゞネス メトリクス (そしお珟圚は Kubernetes のメトリクスも) を蚘述しおいるため、メトリクスに数個の倀しか含たれおおらず、すべおの保持を考慮しお .wsp ファむルが䜜成されおいるずいう状況がよく発生したす。事前に割り圓おられた量のスペヌスを占有したす (私たちの堎合、最倧 2MB でした)。 時間の経過ずずもに類䌌したファむルが倚数出珟し、それらのファむルに基づいおレポヌトを䜜成するずきに空のポむントを読み取るのに倚くの時間ずリ゜ヌスがかかるずいう事実によっお、問題はさらに悪化したす。

䞊蚘の問題は、さたざたな方法を䜿甚し、効果の皋床はさたざたですが、受信するデヌタが増えれば増えるほど、問題はさらに悪化するこずにすぐに泚意しおください。

䞊蚘をすべお満たしおいるこず前述の内容を考慮しお 蚘事、受信したメトリクスの数が垞に増加しおいるため、すべおのメトリクスを 30 秒の保存間隔で転送したいずいう芁望もありたす。 (必芁に応じお最倧 10 秒)、Whisper の有望な代替手段ずしお Graphite+ClickHouse を詊すこずにしたした。

グラファむト+クリックハりス。 期埅

Yandex のメンバヌの亀流䌚をいく぀か蚪れ、以䞋の蚘事を読んだこずがありたす。 ハブレに関するいく぀かの蚘事ドキュメントを調べお、Graphite で ClickHouse をバむンドするための適切なコンポヌネントを芋぀けたので、行動を起こすこずにしたした。

以䞋のものを受け取りたいず思いたす。

  • ディスク サブシステムの䜿甚率を 30% から 5% に削枛したす。
  • 占有スペヌスの量を 1TB から 100GB に削枛したす。
  • 毎分 100 億のメトリクスをサヌバヌに受信できる。
  • すぐに䜿えるデヌタ耇補ずフォヌルトトレランス。
  • このプロゞェクトを XNUMX 幎間攟眮せず、劥圓な期間内に移行しおください。
  • ダりンタむムなしで切り替えられたす。

かなり野心的ですよね

グラファむト+クリックハりス。 コンポヌネント

Graphite プロトコル経由でデヌタを受信し、それを ClickHouse に蚘録するには、次のオプションを遞択したした。 カヌボンクリックハりス (ゎヌラン)。

ClickHouse の最新リリヌスである安定バヌゞョン 1.1.54253 が、時系列を保存するデヌタベヌスずしお遞択されたした。 䜜業䞭に問題が発生したした。山ほどの゚ラヌがログに蚘録され、それらをどう凊理すればよいのか完党に明確ではありたせんでした。 ずの議論䞭 ロマン・ロモノヌ゜フ (カヌボンクリックハりス、グラファむトクリックハりス、その他倚数の䜜者) 叀いものが遞択されたした リリヌス1.1.54236。 ゚ラヌは消え、すべおが順調に動䜜し始めたした。

ClickHouse からデヌタを読み取るように遞択されたした グラファむトクリックハりス (ゎヌラン)。 GraphiteのAPIずしお- カルボナピ (ゎヌラン)。 ClickHouse はテヌブル間のレプリケヌションを敎理するために䜿甚されたした 動物園の飌育係。 ルヌティング メトリクスに぀いおは、最愛のメトリクスをそのたた残したした。 カヌボン-c-リレヌ C 前回の蚘事を参照.

グラファむト+クリックハりス。 テヌブル構造

「graphite」はテヌブルを監芖するために䜜成したデヌタベヌスです。

「graphite.metrics」 - ReplicatedReplacingMergeTree ゚ンゞンを備えたテヌブル (耇補された マヌゞツリヌの眮き換え。 このテヌブルには、メトリクスの名前ずそれらぞのパスが保存されたす。

CREATE TABLE graphite.metrics ( Date Date, Level UInt32, Path String, Deleted UInt8, Version UInt32 ) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/replicator/graphite.metrics', ‘r1’, Date, (Level, Path), 8192, Version);

「graphite.data」 - ReplicatedGraphiteMergeTree ゚ンゞンを備えたテヌブル (耇補された) グラファむトマヌゞツリヌ。 このテヌブルにはメトリック倀が保存されたす。

CREATE TABLE graphite.data ( Path String, Value Float64, Time UInt32, Date Date, Timestamp UInt32 ) ENGINE = ReplicatedGraphiteMergeTree('/clickhouse/tables/replicator/graphite.data', 'r1', Date, (Path, Time), 8192, 'graphite_rollup')

「graphite.date_metrics」は、ReplicatedReplacingMergeTree ゚ンゞンを䜿甚しお条件付きで入力されるテヌブルです。 このテヌブルには、その日䞭に発生したすべおのメトリクスの名前が蚘録されたす。 その䜜成理由に぀いおは、セクションで説明されおいたす。 「問題」 この蚘事の最埌に。

CREATE MATERIALIZED VIEW graphite.date_metrics ( Path String,  Level UInt32,  Date Date) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/replicator/graphite.date_metrics', 'r1', Date, (Level, Path, Date), 8192) AS SELECT toUInt32(length(splitByChar('.', Path))) AS Level, Date, Path FROM graphite.data

「graphite.data_stat」 - ReplicatedAggregatingMergeTree ゚ンゞン (耇補された) を䜿甚しお、条件に埓っお入力されたテヌブル 集玄マヌゞツリヌ。 このテヌブルには、受信メトリクスの数が 4 ぀のネスト レベルに分類されお蚘録されたす。

CREATE MATERIALIZED VIEW graphite.data_stat ( Date Date,  Prefix String,  Timestamp UInt32,  Count AggregateFunction(count)) ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/replicator/graphite.data_stat', 'r1', Date, (Timestamp, Prefix), 8192) AS SELECT toStartOfMonth(now()) AS Date, replaceRegexpOne(Path, '^([^.]+.[^.]+.[^.]+).*$', '1') AS Prefix, toUInt32(toStartOfMinute(toDateTime(Timestamp))) AS Timestamp, countState() AS Count FROM graphite.data  GROUP BY Timestamp, Prefix

グラファむト+クリックハりス。 コンポヌネントの盞互䜜甚図

メトリクス ストレヌゞ: Graphite+Whisper から Graphite+ClickHouse に切り替えた方法

グラファむト+クリックハりス。 デヌタ移行

このプロゞェクトからの期埅からわかるように、ClickHouse ぞの移行はダりンタむムなしで行われる必芁があるため、ナヌザヌに察しお可胜な限り透過的に監芖システム党䜓を䜕らかの方法で新しいストレヌゞに切り替える必芁がありたした。
これが私たちのやり方です。

  • ClickHouse テヌブルのレプリケヌションに参加しおいるサヌバヌの XNUMX ぀のカヌボン クリックハりスに远加のメトリクス ストリヌムを送信するためのルヌルがカヌボン C リレヌに远加されたした。

  • 私たちは Python で小さなスクリプトを曞き、りィスパヌダンプ ラむブラリを䜿甚しおストレヌゞからすべおの .wsp ファむルを読み取り、このデヌタを 24 スレッドで前述のカヌボン クリックハりスに送信したした。 カヌボンクリックハりスで受け入れられるメトリクス倀の数は 125 億 XNUMX 侇/分に達し、ClickHouse は汗をかくこずさえありたせんでした。

  • 既存のダッシュボヌドで䜿甚される関数をデバッグするために、Grafana に別の DataSource を䜜成したした。 䜿甚した関数のリストを特定したしたが、それらは Carbonapi に実装されおいたせんでした。 これらの機胜を远加し、carbonapi の䜜者に PR を送りたした (特別に感謝したす)。

  • バランサヌ蚭定で読み取り負荷を切り替えるために、゚ンドポむントをgraphite-api (Graphite+WhisperのAPIむンタヌフェヌス)からcarbonapiに倉曎したした。

グラファむト+クリックハりス。 結果

  • ディスク サブシステムの䜿甚率が 30% から 1% に枛少したした。

    メトリクス ストレヌゞ: Graphite+Whisper から Graphite+ClickHouse に切り替えた方法

  • 占有スペヌスの量が 1 TB から 300 GB に枛少したした。
  • 毎分 125 億 XNUMX 䞇のメトリクスをサヌバヌに受信する胜力がありたす (ピヌクは移行時に発生したす)。
  • すべおのメトリクスを XNUMX 秒の保存間隔に転送したした。
  • 受信したデヌタの耇補ずフォヌルト トレランス。
  • ダりンタむムなしで切り替え可胜。
  • すべお完了するたでに玄 7 週間かかりたした。

グラファむト+クリックハりス。 問題点

私たちの堎合、いく぀かの萜ずし穎がありたした。 これは移行埌に私たちが遭遇したものです。

  1. ClickHouse は垞にその堎で蚭定を再読み蟌みするわけではなく、堎合によっおは再起動が必芁になるこずがありたす。 たずえば、ClickHouse 構成内の Zookeeper クラスタヌの説明の堎合、クリックハりス サヌバヌが再起動されるたで䜿甚されたせんでした。
  2. 倧芏暡な ClickHouse リク゚ストは通過しなかったため、graphite-clickhouse では ClickHouse 接続文字列は次のようになりたす。
    url = "http://localhost:8123/?max_query_size=268435456&max_ast_elements=1000000"
  3. ClickHouse は安定版リリヌスの新しいバヌゞョンを頻繁にリリヌスしたすが、それらには予期せぬものが含たれる堎合がありたすので泚意しおください。
  4. Kubernetes で動的に䜜成されたコンテナヌは、短くおランダムな有効期間で倧量のメトリクスを送信したす。 このようなメトリクスのポむントはそれほど倚くなく、スペヌスに問題はありたせん。 ただし、ク゚リを䜜成するずき、ClickHouse は、「メトリクス」テヌブルからこれらの同じメトリクスを倧量に取埗したす。 90% のケヌスでは、時間枠 (24 時間) を超えるずデヌタがありたせん。 ただし、「デヌタ」テヌブルでこのデヌタを怜玢するのに時間がかかり、最終的にはタむムアりトになっおしたいたす。 この問題を解決するために、私たちは XNUMX 日䞭に発生したメトリクスに関する情報を別個のビュヌで維持するようになりたした。 したがっお、動的に䜜成されたコンテナヌのレポヌト (グラフ) を䜜成する堎合、垞にク゚リを実行するのではなく、特定のりィンドり内で発生したメトリックのみをク゚リするため、コンテナヌに関するレポヌトの構築が倧幅に高速化されたした。 䞊蚘の解決策のために、私は以䞋を収集したした グラファむトクリックハりスフォヌクこれには、date_metrics テヌブルの操䜜の実装が含たれたす。

グラファむト+クリックハりス。 タグ

バヌゞョン 1.1.0 で Graphite が正匏になりたした サポヌトタグ。 そしお私たちは、グラファむト + クリックハりス スタックでこの取り組みをサポヌトするために䜕をどのように行うかを積極的に怜蚎しおいたす。

グラファむト+クリックハりス。 異垞怜出噚

䞊蚘のむンフラストラクチャに基づいお、異垞怜出噚のプロトタむプを実装したした。これは機胜したす。 しかし、圌に぀いおは次の蚘事で詳しく説明したす。

賌読しお䞊矢印を抌しお幞せになっおください!

出所 habr.com

コメントを远加したす