分散システムのヘルスチェックず段階的な䜎䞋



い぀ものように、この蚘事の草案を読んで貎重なアドバむスを提䟛しおくれたFred HebertずSargun Dhillonに感謝したす。







BoxのTamar Berkovichiは、速床に関する講挔で 、自動デヌタベヌスフェヌルオヌバヌのパフォヌマンスチェックの重芁性を匷調したした。 特に、デヌタベヌスの健党性を刀断する方法ずしお、゚ンドツヌ゚ンドク゚リの実行時間を監芖する方が、単玔なpingpingよりも優れおいるこずに泚目したした。







...別のノヌドレプリカにトラフィックを転送し、䞍掻動を排陀するために、バりンスやその他の境界状況からの保護手段を構築する必芁がありたす。 難しくありたせん。 効果的な䜜業を敎理する際の焊点は、い぀デヌタベヌスを最初の䜍眮に眮くかを知るこずです。 デヌタベヌスの正垞性を正しく評䟡できる必芁がありたす。 珟圚、泚意を払うのに䜿甚されおいる倚くのパラメヌタヌたずえば、プロセッサヌの負荷、レむテンシヌ、゚ラヌ率は二次的な信号です。 これらのパラメヌタヌはいずれも、デヌタベヌスがクラむアントトラフィックを凊理する胜力を実際に語っおいたせん。 したがっお、それらを䜿甚しお切り替えに関する決定を䞋すず、停陜性ず停陰性の䞡方の結果を埗るこずができたす。 ヘルスチェッカヌは実際にデヌタベヌスノヌドに察しお簡単なク゚リを実行し、完了したク゚リず倱敗したク゚リのデヌタを䜿甚しお、デヌタベヌスの状態をより正確に評䟡したす。

これに぀いお友人ず話し合ったずころ、ヘルスチェックは非垞に簡単であり、実際のトラフィックがプロセスの健康状態を評䟡するための最良の基準であるこずが提案されたした。







倚くの堎合、ヘルスチェックの実装に関連する議論は、単玔な通信/信号テストたたは耇雑な゚ンドツヌ゚ンドテストの2぀の反察のオプションを䞭心に展開したす。 この蚘事では、特定の皮類の負荷分散゜リュヌションに前述の圢匏のヘルスチェックを䜿甚する問題ず、プロセスのヘルスを評䟡するためのより詳现なアプロヌチの必芁性を匷調したす。







2皮類のヘルスチェック



ヘルスチェックは、倚くの最新のシステムであっおも、原則ずしお、ノヌドレベルずサヌビスレベルの2぀のカテゎリに分類されたす。







たずえば、Kubernetesは、 レディネスずサバむバビリティを分析するこずで怜蚌を実装しおいたす。 可甚性チェックは、囲炉裏がトラフィックを凊理する胜力を刀断するために䜿甚されたす。 準備チェックが実行されない堎合、 サヌビスを構成する゚ンドポむントから削陀されたす。そのため、炉内では、チェックが完了するたでトラフィックはルヌティングされたせん。 䞀方、存続可胜性チェックは、ハングたたはロックに察するサヌビスの応答を刀別するために䜿甚されたす。 倱敗するず、 kubeletの個々のコンテナが再起動されたす。 同様に、 Consulはいく぀かの圢匏のchecks



蚱可しchecks



 script



ベヌス、特定のURLに向けられたHTTPベヌスの怜蚌、TTLベヌスの怜蚌、たたぱむリアス。







サヌビスレベルでヘルスチェックを実装する最も䞀般的な方法は、ヘルスチェックの゚ンドポむントを決定するこずです。 たずえば、gRPCでは、ヘルスチェック自䜓がRPCコヌルになりたす。 gRPCでは、サヌビスレベルのヘルスチェックず䞀般的なgRPCサヌバヌのヘルスチェックも可胜です。







以前は、ホストレベルのヘルスチェックがアラヌトをトリガヌするシグナルずしお䜿甚されおいたした。 たずえば、平均的なプロセッサ負荷を䌎うアラヌト珟圚はアンチデザむンパタヌンず芋なされおいたす。 ヘルスチェックが通知に盎接䜿甚されない堎合でも、たずえば負荷分散や堎合によっおは断線に関するなど、他の倚くの自動むンフラストラクチャ決定の基盀ずしお機胜したす。 Envoyなどのサヌビスグリッドデヌタスキヌムでは、 ヘルスチェックデヌタは、むンスタンスぞのトラフィックのルヌティングを決定する際に、サヌビスディスカバリデヌタに関しお先に進みたす。







効率はスペクトルであり、バむナリ分類ではありたせん



゚コヌ芁求、぀たりpingは、サヌビスが機胜しおいるかどうかのみを確認できたすが、゚ンドツヌ゚ンドテストは、システムが特定の䜜業単䜍を実行できるかどうかを確認するためのプロキシです。䜜業単䜍はデヌタベヌスク゚リたたは特定の蚈算になりたす。 ヘルスチェックの圢匏に関係なく、その結果は玔粋にバむナリであるず芋なされたす「合栌」たたは「倱敗」。







珟代の動的でしばしば「自動スケヌラブル」なむンフラストラクチャオプションでは、特定の䜜業単䜍を実行できない堎合でも、単に「機胜する」1぀のプロセスは重芁ではありたせん。 ゚コヌテストなどの簡易チェックはほずんど圹に立たないこずがわかりたす。







サヌビスが完党に切断されたずきを刀断するのは簡単ですが、実行䞭のサヌビスの操䜜性の皋床を確立するこずははるかに困難です。 プロセスが実行されおいる぀たり、ヘルスチェックに合栌しおいる、トラフィックがルヌティングされおいる可胜性は十分にありたすが、たずえばp99サヌビスの遅延期間䞭に特定の䜜業単䜍を実行するには、これでは䞍十分です。







倚くの堎合、プロセスが過負荷のため䜜業を完了できたせん。 非垞に競争の激しいサヌビスでは、「茻茳」は過床のキュヌむングを䌎う1぀のプロセスのみで凊理される同時リク゚ストの数ず適切に盞関し、RPCコヌルの遅延の増加に぀ながる可胜性がありたす倚くの堎合、䞋䜍レベルのサヌビスは単にリク゚ストを保留し、再詊行したすタむムアりト。 これは、ヘルスチェック゚ンドポむントがHTTP 200ステヌタスコヌドに自動的に戻るように構成されおいる堎合に特に圓おはたりたすが、サヌビスによっお実行される実際の操䜜にはネットワヌクI / Oたたは蚈算が含たれたす。







画像







プロセスのパフォヌマンスはスペクトルです。 たず、 サヌビスの品質、たずえば、特定の䜜業単䜍の結果を埩元するプロセスに必芁な時間、結果の粟床に関心がありたす 。







プロセスは、耐甚幎数䞭のさたざたな皋床の䜜業胜力の間で倉動する可胜性がありたす完党な䜜業胜力 たずえば、予想される䞊列レベルで機胜する胜力から動䜜䞍胜のポむントキュヌがいっぱいになり始めるずきずプロセスが完党に動䜜䞍胜ゟヌンに入るポむントフェルトサヌビス品質の䜎䞋。 䞀郚の機胜が動䜜し、他の機胜がオフになり、「䞀郚の芁求が実行されるだけでなく、䞀郚が実行されない」こずを意味する期間に郚分的な障害の皋床がないずいう前提で、最も些现なサヌビスのみを構築できたす。 サヌビスアヌキテクチャが郚分的な障害を正しく修正しない堎合、゚ラヌを修正するタスクは自動的にクラむアントに委ねられたす 。







このような倉動は完党に正垞であるずいう理解の䞋で、適応性のある自己修埩むンフラストラクチャを構築する必芁がありたす。 たた、この違いは負荷分散に関しおのみ重芁であるこずに泚意するこずも重芁です。たずえば、オヌケストレヌタヌにずっおは、プロセスが過負荷状態にあるずいう理由だけでプロセスを再起動しおも意味がありたせん。







蚀い換えるず、オヌケストレヌションのレベルでは、プロセスの操䜜性をバむナリ状態ず芋なし、障害たたはフリヌズの埌にのみプロセスを再起動するこずが非垞に合理的です。 ただし、 負荷分散レむダヌEnvoyなどの倖郚プロキシ、たたはクラむアント偎の内郚ラむブラリでは、プロセスの操䜜性に関するより詳现な情報に基づいお動䜜するこずが非垞に重芁です-回線の切断ず負荷のダンプに関する適切な決定を行う堎合 サヌビスのパフォヌマンスレベルをい぀でも正確に刀断できない堎合、サヌビスを埐々に䜎䞋させるこずはできたせん。







経隓から教えおください。無制限の同時実行は、倚くの堎合、サヌビスの䜎䞋や生産性の氞続的な䜎䞋を匕き起こす䞻な芁因です。 負荷分散およびその結果ずしおの負荷制限は、倚くの堎合、効率的に䞊行性を管理し、バックプレッシャを適甚するこずにより、システムの過負荷を防ぎたす。







バックプレッシャヌを適甚するずきのフィヌドバックの必芁性



Matt Ranneyは、無制限の䞊行性ずNode.jsのバックプレッシャヌの必芁性に関する驚異的な蚘事を曞きたした。 蚘事党䜓は䞍思議ですが、䞻な結論は少なくずも私にずっおはプロセスずその出力ナニットの間のフィヌドバックの必芁性でした通垞、これはロヌドバランサヌですが、時には別のサヌビスです。







秘trickは、リ゜ヌスが䜿い果たされたずき、どこかに䜕かを䞎えなければならないずいうこずです。 需芁は増倧しおおり、生産性を魔法のように高めるこずはできたせん。 着信タスクを制限するには、最初に、サむトレベルで、IPアドレス、ナヌザヌ、セッション、たたはせいぜいアプリケヌションにずっお重芁な芁玠ごずに特定の速床制限を蚭定したす。 倚くのロヌドバランサヌは、着信Node.jsサヌバヌを制限するよりも耇雑な方法で速床を制限できたすが、通垞、プロセスが困難な状況になるたで問題に気付きたせん。

静的なしきい倀ず制限に基づく速床制限ず開回路は、正確さずスケヌラビリティの䞡方の点で信頌性が䜎く、䞍安定になる可胜性がありたす。 䞀郚のロヌドバランサ特にHAProxyは、 各サヌバヌおよびサヌバヌパヌツの内郚キュヌの長さに関する倚くの統蚈を提䟛したす 。 さらに、HAProxyはagent-check



通垞のヘルスチェックずは独立した補助チェックを可胜にしたす。これにより、プロセスはより正確で動的なヘルスフィヌドバックをプロキシサヌバヌに提䟛できたす。 ドキュメントぞのリンク 







゚ヌゞェントのヘルスチェックは、指定されたagent-port



パラメヌタヌに基づいおポヌトぞのTCP接続によっお実行され、ASCII文字列を読み取りたす。 行は、スペヌス、タブ、たたはコンマで区切られた䞀連の単語で構成され、オプションで/r



および/たたは/n



終わり、次の芁玠が含たれたす。



75%



など、ASCIIの正の敎数パヌセント倀の衚瀺。 この圢匏の倀は、初期倀に比䟋しお重量を決定したす

HAProxyの起動時に蚭定された重み付きサヌバヌ倀。 サヌバヌぞの同様の圱響の瞬間から、統蚈ペヌゞにれロの重み倀がDRAIN



ずしお瀺されるこずに泚意しおくださいLBファヌムから削陀されたす。



-文字列パラメヌタヌmaxconn



敎数スペヌスなしが続きたす。 の倀

この圢匏は、 maxconn



サヌバヌmaxconn



定矩しmaxconn



。 最倧数

サヌバヌが確立できる接続の合蚈数を取埗するには、このヘルスチェックを䜿甚しお、宣蚀された接続にロヌドバランサヌずさたざたなサヌバヌパヌツの数を掛ける必芁がありたす。 䟋 maxconn:30







- ready



ずいう蚀葉。 これにより、サヌバヌの管理状態が

READY



モヌド、 DRAIN



たたはMAINT



キャンセル。



-単語drain



。 これにより、サヌバヌの管理状態が

DRAIN



モヌド「ドレむン」。その埌、サヌバヌは、デヌタベヌスを介しお受け入れられる接続を陀き、新しい接続を受け入れたせん。



-単語maint



。 これにより、サヌバヌの管理状態が

MAINT



モヌド「メンテナンス」。その埌、サヌバヌは新しい接続を受け入れず、ヘルスチェックは停止したす。



down



、 failed



たたはstopped



の単語。シャヌプ蚘号の埌に説明行が続く堎合がありたす。 それらはすべおDOWN



サヌバヌの動䜜ステヌタス「オフ」を瀺したすが、単語自䜓が統蚈ペヌゞに衚瀺されるため、管理者はこの違いにより状況が予想されるかどうかを刀断できたす。サヌビスが意図的に停止され、確認テストが衚瀺されおも合栌しない堎合がありたす。たたは、無効ずみなされたすプロセスなし、ポヌトからの応答なし。



-ヘルスチェックもサヌビスの可甚性を確認する堎合、upずいう語はUP



サヌバヌの動䜜ステヌタス「オン」を瀺したす。



゚ヌゞェントが芁求しおいないパラメヌタヌは倉曎されたせん。 たずえば、゚ヌゞェントは、プロセッサの䜿甚状況を監芖し、動䜜状態ず察話せずに盞察的な重み倀のみを報告するように蚭蚈できたす。 同様に、゚ヌゞェントプログラムは、管理者が管理状態のみを倉曎できる3぀のスむッチを備えた゚ンドナヌザヌむンタヌフェむスずしお蚭蚈できたす。



ただし、゚ヌゞェントのみが自身のアクションをキャンセルできるため、゚ヌゞェントを䜿甚しおサヌバヌをDRAINモヌドたたはDOWNに蚭定した堎合、゚ヌゞェントは他の同等のアクションを実行しおサヌビスを再起動する必芁があるこずに泚意しおください。



゚ヌゞェントぞの接続の倱敗ぱラヌずは芋なされたせん。これは、checkパラメヌタヌを䜿甚しお開始されるヘルスチェックを定期的に実行するこずで接続機胜がテストされるためです。 ただし、シャットダりンメッセヌゞが到着した堎合、゚ヌゞェントを停止するには、シャットダりンを報告する゚ヌゞェントのみがサヌバヌを再床有効にできるため、譊告はお勧めできたせん。

サヌビスず出力ナニットの動的通信のこのスキヌムは、自己適応型むンフラストラクチャを䜜成するために非垞に重芁です。 䟋は、私が前の仕事で働いたアヌキテクチャです。







私は、リアルタむム画像凊理のスタヌトアップ䌁業であるimgixで働いおいたした。 シンプルなAPI URLを䜿甚しお、画像がリアルタむムで取埗および倉換され、CDNを介しお䞖界䞭のどこでも䜿甚されたす。 䞊蚘のように 、スタックは非垞に耇雑でしたが、芁するに、むンフラストラクチャには、゜ヌスからのデヌタの受信レベルず䞊行しお、䞀定レベルのバランシングずロヌドバランシング、゜ヌスキャッシングのレベル、画像凊理のレベル、コンテンツ配信のレベルが含たれおいたした。







画像







負荷分散レベルは、リバヌスプロキシおよびリク゚ストブロヌカヌずしお機胜するSpillwayサヌビスに基づいおいたした。 これは玔粋に内郚的なサヌビスでした。 瀬戞際で、nginxずHAProxyずSpillwayを開始したので、TLSを完成したり、通垞は境界プロキシの胜力にある無数のセットから他の機胜を実行するようには蚭蚈されおいたせん。







Spillwayは、クラむアント郚分Spillway FEずブロヌカヌの2぀のコンポヌネントで構成されおいたした。 最初は䞡方のコンポヌネントが同じバむナリファむルにありたしたが、ある時点で、同じホストに同時に展開される別々のバむナリファむルに分けるこずにしたした。 䞻に、これらの2぀のコンポヌネントのパフォヌマンスプロファむルが異なり、クラむアント郚分がほが完党にプロセッサに接続されおいたためです。 クラむアント偎のタスクは、゜ヌスキャッシングレベルでの予備怜蚌を含む各リク゚ストの予備凊理を実行し、゚グれキュヌタヌにむメヌゞ倉換のリク゚ストを送信する前に、むメヌゞがデヌタセンタヌにキャッシュされたこずを確認するこずでした。







垞に、同じスピルりェむブロヌカヌに接続できるアヌティストの固定プヌルメモリがあれば12個皋床がありたした。 アヌティストは、画像の実際の倉換トリミング、サむズ倉曎、PDF凊理、GIFレンダリングなどを担圓したした。 数癟ペヌゞのPDFや数癟フレヌムのGIFから単玔な画像ファむルたで、すべおを凊理したした。 請負業者のもう1぀の機胜は、すべおのネットワヌクが完党に非同期であるにもかかわらず、GPU自䜓に実際の倉換がなかったこずです。 リアルタむムで䜜業しおいるため、特定の時点でトラフィックがどのようになるかを予枬するこずは䞍可胜でした。 むンフラストラクチャは、さたざたな圢態の着信トラフィックに適応する必芁がありたした-オペレヌタの手動介入なし。







よく出䌚う異皮および異皮のトラフィックパタヌンを考えるず、接続を受け入れるずパフォヌマヌが過負荷になる恐れがある堎合、パフォヌマヌは着信リク゚ストの受け入れを拒吊するこずが必芁になりたした完党に動䜜しおいる堎合でも。 実行者ぞの各芁求には、芁求の性質に関するメタデヌタの特定のセットが含たれおいたため、実行者はこの芁求を凊理できるかどうかを刀断できたした。 各゚グれキュヌタには、珟圚䜜業䞭のリク゚ストに関する独自の統蚈デヌタのセットがありたした。 埓業員は、これらの統蚈をリク゚ストメタデヌタおよび゜ケットバッファサむズデヌタなどの他のヒュヌリスティックデヌタず組み合わせお䜿甚​​し、着信リク゚ストを正しく受信したかどうかを刀断したした。 埓業員は、リク゚ストを受け入れるこずができないず刀断した堎合、そのパフォヌマンスに぀いお出力ブロックスピルりェむに通知するHAProxy゚ヌゞェントチェックず倉わらない応答を䜜成したした。







Spillwayは、すべおのプヌルパフォヌマヌのパフォヌマンスを監芖したした。 最初に、リク゚ストを3回連続で異なる゚グれキュヌタヌに送信しようずしたしたロヌカルデヌタベヌスに元のむメヌゞがあり、過負荷になっおいないナヌザヌに優先暩が䞎えられたした。 ブロヌカヌは、LIFOキュヌ、FIFOキュヌ、優先床キュヌの3぀の圢匏のキュヌをサポヌトしおいたした。 3぀のキュヌすべおがいっぱいになった堎合、ブロヌカヌは単に芁求を拒吊し、クラむアントHAProxyが遅延期間埌に再詊行できるようにしたした。 芁求が3぀のキュヌのいずれかに配眮されるず、任意の無料の゚グれキュヌタヌがそこから削陀しお凊理できたす。 リク゚ストに優先床を割り圓お、3぀のキュヌLIFO、FIFO、優先床ベヌスのキュヌのどれを配眮するかを決定するこずに関連する特定の困難がありたすが、これは別の蚘事のトピックです。







サヌビスを効果的に運甚するために、この圢匏の動的フィヌドバックに぀いお議論する必芁はありたせんでした。 ブロヌカヌのキュヌ3぀すべおのキュヌのサむズを泚意深く監芖し、キュヌのサむズが特定のしきい倀非垞にたれを超えたずきに、Prometheusは重芁な譊告の1぀を発行したした。







画像







2016幎11月のGoogle NYCでのプロメテりス監芖システムに関する私のプレれンテヌションの画像







画像







この譊告は、2017幎5月のOSCON䌚議でのプロメテりス監芖システムに関する私のプレれンテヌションから取埗されたした。







今幎の初めに、Uberは興味深い蚘事を公開したした。この蚘事では、サヌビス品質に基づいお負荷制限レベルを実装するアプロヌチを明らかにしたした。







過去6か月間の障害を分析したずころ、 スムヌズな劣化によっお28の障害を軜枛たたは防止できるこずがわかりたした。



最も䞀般的な3皮類の障害は、次の芁因に関連しおいたした。



-茻茳や䞍良オペレヌタノヌドなど、着信リク゚ストのスキヌマの倉曎。

-プロセッサ、メモリ、入出力回路、ネットワヌクリ゜ヌスなどのリ゜ヌスの枯枇。

-むンフラストラクチャ、デヌタりェアハりス、ダりンストリヌムサヌビスなどの䟝存関係の障害。



CoDelアルゎリズムに基づく過負荷怜出噚を実装したした。 有効な゚ンドポむントごずに、軜量の芁求バッファヌgourutinずchannelsに基づいお実装されたす が远加され、呌び出し元から芁求を受信しお​​からハンドラヌで芁求の凊理を開始するたでの遅延を远跡したす。 , , .

, , , - . 2013 Google «The Tail at Scale» , ( ), ( ) .







画像







, . , .







画像







( )







, , :







  1. , , QCon London 2018.
  2. : - , , LISA 2017.
  3. – , , Strangeloop 2017.
  4. : , , , Strangeloop 2017.
  5. « » .


おわりに



, TCP/IP ( ), IP ECN ( IP ) Ethernet, , .







オヌケストレヌションシステムでは倧芏暡なパフォヌマンスチェックで十分な堎合がありたすが、分散システムでサヌビスの品質を確保し、連鎖的な障害を防ぐこずはできたせん。ロヌドバランサヌは、顧客に察するバックプレッシャヌの適切か぀正確な適甚のために、アプリケヌションのレベルを確認する必芁がありたす。サヌビスのパフォヌマンスのレベルをい぀でも正確に刀断するこずが䞍可胜な堎合、サヌビスの段階的な䜎䞋は䞍可胜です。タむムリヌか぀十分なバックプレッシャヌがない堎合、サヌビスはすぐに障害の山に陥るこずがありたす。








All Articles