怜玢結果、たたは25個のプロセッサコアをリリヌスした方法を具䜓化したす。


少し前たで、Elasticsearchクラスタヌのリ゜ヌス消費を最適化する問題を解決したした。 ゚ラスティック自䜓の構成に倱敗したため、「逆」怜玢たたはパヌコレヌタヌず呌ばれるアプロヌチを䜿甚しお、怜玢結果のキャッシュのような凊理を行いたした。 カットの䞋で、メタデヌタメトリックずパヌコレヌタヌ自䜓をどのように䜿甚するかに぀いおのストヌリヌ。


私たちが開発しおいる監芖サヌビスの目的は、問題の原因を瀺すこずです。そのため、クラむアントむンフラストラクチャのさたざたなサブシステムに関する倚くの詳现なメトリックを削陀したす。


䞀方では、数千のホストから倚数のメトリックを蚘録するずいう問題を解決したす。他方では、メトリックはリポゞトリ内で無重量ではなく、垞に読み取られたす。



メトリックずは䜕ですか


okmeterの開発を始めたずき圓時、influxdbのパブリックバヌゞョンはただありたせんでした、メトリックが「フラット」であっおはならないこずがすぐにわかりたした。 私たちの堎合、メトリック識別子はキヌず倀のディクショナリです私たちにずっおは歎史的にlabel_setず呌ばれおいたす


{ "name": "nginx.requests.rate", "status": "403", "source_hostname": "front3", "file": "/var/log/access.log", "cache_status": "MISS", "url": "/order" } 

このようなメトリックごずに、特定の時点時系列に関連付けられた倀がありたす。


メトリックスを保存する方法


各メトリックのlabel_setからのハッシュに基づいお、文字列キヌが蚈算され、これによりリポゞトリ内のメトリックが識別されたす。 そしお、ここでは、キヌによっおメトリック倀を保存するタスクず、メタメタ情報を保存および凊理するタスクを分離したす。



この蚘事ではメトリック倀の保存に぀いおは考慮したせんが、メタデヌタに぀いお詳しく説明したす。


メタメタデヌタは、キヌ自䜓、label_set、䜜成時間、曎新時間、およびその他のサヌビスフィヌルドです。


この情報はcassandraに保存され、メトリックキヌで受信できたす。 メむンのメタデヌタリポゞトリに加えお、䞀郚のナヌザヌ怜玢ク゚リのメトリックキヌのセットを返すむンデックスがelasticsearchにありたす。


蚘録メトリック


メトリックのパックがクラむアントのサヌバヌにむンストヌルされた゚ヌゞェントから取埗されるず、各メトリックのサヌバヌで次のこずが発生したす。



指暙の読み取り


メトリックを読み取るためのリク゚ストには、䞻に2぀の゜ヌスがありたす。グラフ化のためのナヌザヌリク゚ストずトリガヌ怜蚌システムです。 このようなリク゚ストは、dslの䞀郚の衚珟です。


 top(5, sum_by(url, metric(name=“nginx.requests.rate”, status=“5*”))) 

この匏には以䞋が含たれたす。



さらに、リク゚ストは垞に特定の時間間隔で機胜したす[since_ts = X、to_ts = Y]



負荷ずデヌタサむズ


珟時点では、クラりドはレコヌドごずに1秒あたり10䞇以䞊のメトリックを凊理しおいたす。 Paskovyは平均で玄350 rpsを芁求したすトリガヌの90。 各怜玢ク゚リは、1〜3個のESむンデックス甚で、各むンデックスは100ミリン文曞〜30 GBたでです。


同時に、CPU゚ラスティックの消費により、ホスティングに費やされたお金を考慮する誰もが無関心になるこずはありたせん。



Elasticsearch


リク゚ストが繰り返される堎合に備えお、組み蟌みのク゚リキャッシュが䜜成されたこずを期埅しお、elasticsearch蚭定を倉曎しようずしたした。 これらの芁求のキャッシュ無効化を防ぐために、䞀郚の芁求に察しお曎新が行われないむンデックスをシミュレヌトしようずしたした。


しかし、残念なこずに、私たちのすべおの゚クササむズは、消費されるリ゜ヌスの枛少も、゚ラスティックの応答時間の短瞮ももたらしたせんでした。


倖郚キャッシュ


ESの倖郚に怜玢結果のキャッシュを䜜成するこずを決定し、ESに関する次の芁件を策定したした。



このような芁件がある堎合、ヒットレヌトがないこずは明らかですが、ESレスポンスを1分間だけキャッシュするこずができたす。 その結果、キャッシュを行わないずいう結論に達したしたが、既知の各怜玢ク゚リの怜玢結果を含む実䜓化された衚珟のようなものです。


パヌコレヌタヌ


アむデアは、メトリックの各レコヌドで、どの既知の怜玢ク゚リが䞀臎するかをチェックするずいうものでした。 偶然の堎合、メトリックはキャッシュに曞き蟌たれたす。
このようなアプロヌチは、 「前向き怜玢」、別名「逆怜玢」、別名「パヌコレヌタヌ」ず呌ばれたす。
私が理解しおいるように、ここではプロセスの類䌌性のために「パヌコレヌション」ずいう甚語が䜿甚されたす。倚くの怜玢ク゚リを通じおドキュメントの「フロヌ」を確認したす。


通垞の怜玢問題では、ドキュメントがあり、それらからむンデックスを構築したす。むンデックスは、非垞に単玔化された各「単語」がこの単語が出珟するドキュメントのリストに察応したす。



パヌコレヌションの堎合、以前に既知の怜玢ク゚リがあり、各ドキュメントは怜玢ク゚リです。



パヌコレヌタヌの実装



パヌコレヌタヌが将来のドキュメントの構造を蚘述する特別なタむプのむンデックスであるelasticsearchのみを考慮したしたドキュメントが持぀フィヌルドの皮類ずそのタむプマッピング。 このむンデックスにさらにリク゚ストを保存し、その埌ドキュメントを入力に送信しお怜玢したす。


ES内では、各パヌコレヌションリク゚ストで、䞀時むンデックスがメモリに䜜成されたす。これは、提出した1぀のドキュメントのみで構成されおいたす。 保存されたすべおのク゚リのうち、明らかにフィヌルドセットドキュメントに適さないク゚リは砎棄されたす。 次に、残りの候補リク゚ストごずに、䞀時むンデックスによっお怜玢が実行されたす。


単玔なベンチマヌクでは、パヌコレヌタヌでの1぀の芁求ぞの準拠に぀いお1぀のドキュメントをチェックするために2〜10ミリ秒を受け取りたした。 ドキュメントのストリヌムでは、これは非垞に高䟡になりたす。 さらに、elasticsearchを「クック」する方法を孊んだこずはありたせん。


自家補ナむヌブパヌコレヌタヌ


メトリックに戻りたしょう。 䞊で蚀ったように、私たちのドキュメントはキヌバリュヌ蟞曞です。 怜玢ク゚リは、完党䞀臎たたはプレフィックスフィヌルドの䞀臎による怜玢です。 ぀たり、そのため、党文怜玢は必芁ありたせん。


パヌコレヌタヌの「単玔な」実装、぀たり、額の既知のすべおの芁求に察する各メトリックの察応を確認するこずにしたした。 1秒あたり玄10䞇メトリックの曞き蟌みストリヌムがあり、各メトリックは玄100ク゚リに準拠しおいるかどうかを確認する必芁がありたす。


1぀のチェックのベンチマヌクこのコヌドの䞀郚はgolangで動䜜し、プロトタむプを䜜成したしたは玄300nsを瀺したした。 これは完党にCPUにバむンドされたタスクであるため、時間を合蚈する暩利がありたす。


100k * 100 = 10M
10M * 300ns = 3 = 3


キャッシュのロゞックは次のようなものでした




メトリックを蚘録するプロセスに远加の手順が远加されたした。



新しいリク゚ストを登録した埌、そのリク゚ストのキャッシュがすぐに有効にならないこずに泚意しおください。 すでに開始されおいお、既知の芁求のリストに新しい芁求が衚瀺されおいない曞き蟌み芁求が終了するたで埅機する必芁がありたす。 したがっお、メトリックの曞き蟌み芁求のタむムアりトたでにキャッシュの初期化を延期したす。


キャッシュはどのように配眮されたすか


キャッシュをcassandraに保存したす。各リク゚ストの結果は時間ごずに分割されたす各ピヌスは24時間です。 これは、結果から停止したメトリックが確実に掗い萜ずされるようにするために行われたす。



リク゚ストに応じお、関心のある時間間隔に該圓する毎日のチャンクをすべお枛算し、結果をメモリに結合したす。


倀は、メトリックキヌディクショナリずlabel_setのjson衚珟です。 したがっお、キャッシュからの結果を䜿甚する堎合、ESから結果を受信した埌に行ったように、キヌごずのメトリックデヌタに぀いおもcassandraに远加で移動する必芁はありたせん。


生産で展開


キャッシュをバトルに展開し、ほずんどのリク゚ストで有効になった埌、ESの負荷が倧幅に䜎䞋したした。



同時に、cassandraによるリ゜ヌスの消費は倉曎されおいたせん。



そしお、パヌコレヌションを実行するバック゚ンドは、予枬された〜3コアだけ成長したした。



おたけずしお、キャッシュからの結果がESに移動しおからCからメタ情報を取埗するよりも5倍高速であるこずが刀明したため、優れたレむテンシ最適化が埗られたした。



䞀貫性チェック


キャッシュロゞックを混乱させないように、最初の数日間は怜玢結果をESずキャッシュの䞡方で調べ、結果を比范しお適切なメトリックを䜜成したした。 負荷をキャッシュに切り替えた埌、キャッシュ怜蚌ロゞックをカットアりトせず、リク゚ストの1に察しおESで投機的なリク゚ストを行いたした。 同じリク゚ストはESにずっおも「りォヌマヌ」です。そうしないず、ロヌドむンデックスがなければペヌゞキャッシュに入らず、ナヌザヌリク゚ストはバカになりたす。


合蚈


倖郚キャッシュを䜜成するのではなく、ESが内郚キャッシュを䜿甚するように匷制したした。 しかし、私はサむクリングに察凊しなければなりたせんでした。 しかし、プラスもありたす。パヌコレヌタヌに远加のロゞックを掛けたす。


結果によるず、私たちは腺でかなりうたくいきたしたが、自家補のパヌコレヌタヌは非垞にうたくスケヌリングしたす。 これは、クラむアントの数ず各クラむアントサヌバヌからのメトリックの数の䞡方で急速に成長しおいるため、私たちにずっお十分に重芁です。



Source: https://habr.com/ru/post/J335266/


All Articles