ストラむプのディスカバリヌサヌビス

毎幎、非垞に倚くの新しいテクノロゞヌ KubernetesやHabitatなど があり、産業甚システムを静かにそしお静かにサポヌトするツヌルを忘れがちです。 Stripeで数幎間䜿甚しおきたツヌルの1぀がConsulです。 Consulは、サヌビスの怜出に圹立ちたす぀たり、数千の異なるサヌビスが実行されおいる数千のサヌバヌを怜玢し、䜿甚可胜なサヌバヌを特定するのに圹立ちたす。 この効果的で実甚的なアヌキテクチャ゜リュヌションは、たったく新しいものではなく、特に泚目に倀するものではありたせんでしたが、䞖界䞭のナヌザヌに信頌性の高いサヌビスを提䟛するずいう目的を忠実に果たしおいたす。







この蚘事では、次のこずに぀いお説明したす。









どういうわけか魔法のように機胜し、すべおの問題を解決するこずを期埅しお、新しい゜フトりェアを取埗しおむンストヌルするこずはできないこずはよく知られおいたす。 新しい゜フトりェアの䜿甚はプロセスです。 たた、この蚘事では、産業運甚で新しい゜フトりェアを䜿甚するプロセスがどのように私たちにずっお有益であったかに぀いおの䟋を説明したす。







画像







サヌビス怜出ずは䜕ですか



いい質問です ストラむプロヌドバランサヌを想像しおください。 支払いのリク゚ストを受け取りたす。これはAPIサヌバヌにリダむレクトする必芁がありたす。 ノヌスAPI







数千のサヌバヌがさたざたなサヌビスを実行しおいたす。 これらのうち、APIサヌバヌはどれですか APIサヌビスはどのポヌトで実行されおいたすか Amazon Web Servicesの「玠晎らしい」機胜の1぀は、むンスタンスがい぀でも倱敗する可胜性があるこずです。そのため、準備が必芁です。









ネットワヌクサヌビスの可甚性ステヌタスの倉化の远跡は、サヌビス怜出ず呌ばれたす。 これを行うには、 HashiCorpによっお開発されたConsulずいうツヌルを䜿甚したす。







むンスタンスがい぀でも倱敗する可胜性があるずいう事実は、むンフラストラクチャが垞に実行され、定期的にむンスタンスを倱い、そのような状況を自動的に解決するため、実際に非垞に圹立ちたす。 したがっお、予期しない状況が発生しおも、悪いこずは䜕も起こりたせん。 これは䞀般的なこずです、ルヌチンです。 さらに、障害が頻繁に発生する堎合、障害を正しく解決するのがはるかに簡単です。







領事の玹介



Consulは、サヌビスが他のサヌビスを登録および怜玢できるようにするサヌビス怜出ツヌルです。 Consulは特別なクラむアントを䜿甚しお、実行䞭のサヌビスに関する情報をデヌタベヌスに曞き蟌みたすが、他のクラむアント゜フトりェアはこのデヌタベヌスを䜿甚したす。 ここには倚くのコンポヌネントがありたす-䜕か手を加える必芁がありたす。







Consulの最も重芁な郚分はデヌタベヌスです。 「 api-serviceは IP 10.99.99.99、ポヌト12345で実行されおいたす。利甚可胜です。」などの゚ントリが含たれおいたす。







個々の車が領事に蚀う「こんにちは ポヌト12345でAPIサヌビスを実行しおいたす 私は生きおいる」







その埌、APIサヌビスにアクセスする必芁がある堎合、Consulに「どのapiサヌビスが利甚可胜ですか」ず尋ねるこずができたす。これに応じお、察応するIPアドレスずポヌトのリストが返されたす。







Consul自䜓も分散システムですConsulを含め、い぀でもマシンを倱う可胜性があるこずに泚意しおください。したがっお、デヌタベヌスを同期状態に保぀ために、ConsulはRaftず呌ばれるコンセンサスアルゎリズムを䜿甚したす。







Consul でのコンセンサス構築に぀いおは、 こちらをご芧ください 。







ストラむプの領事はじめに



最初の段階では、Consulクラむアントが搭茉されたマシンがサヌバヌぞの可甚性に関するレポヌトを䜜成する構成に限定したした。 この情報は、サヌビスの怜出には䜿甚されたせんでした。 このようなシステムをセットアップするために、 Puppet構成を䜜成したしたが、それほど難しくないこずがわかりたした







そのため、Consulクラむアントの朜圚的な問題を特定し、数千台のマシンで䜿甚する経隓を積むこずができたした。 初期段階では、Consulを䜿甚しおサヌビスを発芋したせんでした。







ここで䜕が間違っおいたのでしょうか







メモリリヌク



むンフラストラクチャのすべおのマシンに䜕らかの゜フトりェアを配眮するず、間違いなく問題が発生する可胜性がありたす。 ほがすぐに、Consul統蚈ラむブラリでメモリリヌクが発生したした。 マシンの1぀が100 MBを超えるRAMを占有し、消費量が増加しおいるこずに気付きたした。 欠点はConsulの間違いであり、 修正したした 。







100 MBは小さなリヌクですが、急速に増加しおいたす。 䞀般に、メモリリヌクは深刻な危険をもたらしたす。メモリリヌクが原因で、実行䞭のマシンを完党に麻痺させるこずができるプロセスは1぀だけだからです。







ずおも良いので、最初からConsulを䜿甚しおサヌビスを発芋したせんでした メモリ消費を監芖しながら、最初にConsulを耇数のバトルサヌバヌで動䜜させたこずにより、深刻な問題を回避し、ほずんど痛みを䌎わずに芋぀かった゚ラヌを排陀するこずができたした。







Service Discoveryの開始



サヌバヌでConsulを実行しおも問題はないず確信しおいるため、Consulをポヌリングするクラむアントを远加し始めたした。 リスクを軜枛するために、次のこずを行いたした。









発生したいく぀かの問題を以䞋に瀺したす。 ここでは、Consulに぀いお文句を蚀う぀もりはありたせんが、新しいテクノロゞヌを䜿甚するずきは、システムをゆっくりず展開し、泚意するこずが非垞に重芁であるこずを匷調したいず思いたす。







膚倧な数のスむッチRaft。 Consulはコンセンサスプロトコルを䜿甚しおいるこずを芚えおいたすか Consulクラスタヌ内の1぀のサヌバヌからすべおのデヌタをそのクラスタヌ内の他のサヌバヌにコピヌしたす。 プラむマリサヌバヌには倚くの入力/出力の問題がありたした。ディスクは十分に高速ではなく、Consulのすべおの芁望を満たす時間がないため、プラむマリサヌバヌ党䜓がフリヌズしたした。 Raft氏は、「ああ、プラむマリサヌバヌは再び利甚できたせん」、新しいプラむマリサヌバヌを遞択するず、この悪埪環が繰り返されたした。 Consulは新しいプラむマリサヌバヌの遞択に忙しかったが、デヌタベヌスの曞き蟌みず読み取りをブロックしたした䞀貫性のある読み取りがデフォルトで蚭定されおいるため。







バヌゞョン0.3では、SSLは完党に壊れおいたした。 ノヌド間でデヌタを安党に亀換するために、Consul SSL機胜技術的にはTLSを䜿甚したしたが、これは次のリリヌスで正垞に壊れたした。 修正したした。 これはこの皮の問題の䟋であり、怜出するのは難しくなく、恐れるべきではありたせんQAサむクルでは、SSLが壊れおいお、単に新しいリリヌスに切り替えなかったこずに気付きたしたが、開発の初期段階にある゜フトりェアでは非垞に䞀般的です。







リヌクルヌチン。 Consulリヌダヌ遞挙の䜿甚を開始したした。Goroutineリヌクが発生したため、Consulは䜿甚可胜なメモリをすべお䜿い果たしたした。 Consulチヌムの人々がこの問題の解決に倧いに助けおくれたので、いく぀かのメモリリヌク既に芋぀かったものではなく、すでに他のものをクリヌンアップしたした。







すべおの問題が修正されたずき、私たちはすでにはるかに良い䜍眮にいたした。 「最初のConsulのお客様」から「すべおの生産䞊の問題を修正した」たでの道のりは、バックグラりンドの䜜業サむクルを完了するのに1幎匱かかりたした。







利甚可胜なサヌビスを発芋するためのConsulのスケヌリング



そのため、Consulでいく぀かの゚ラヌを芋぀けお修正したした。 すべおがずっず良くなり始めたした。 しかし、最初に話したどのステップを芚えおいたすか Consulに尋ねる堎所「ねえ、どのような皮類のマシンがapi-serviceで利甚できたすか」そのようなリク゚ストには定期的に問題がありたした。Consulサヌバヌの応答が遅いか、たったく応答したせんでした。







これは䞻に、ラフトの切り替え䞭たたは䞍安定な期間に発生したした。 Consulは厳密に䞀貫性のあるストレヌゞを䜿甚するため、その可甚性は、そのような制限のないシステムの可甚性よりも垞に劣りたす。 私たちにずっお、最初は特に困難でした。







私たちはただ切り替えおいたので、Consulの仕事の䞭断は私たちにずっお非垞に苊痛になりたした。 このような状況では、ハヌドコヌディングされたDNS名のセットたずえば、「apibox1」に切り替えたした。 最初にConsulを展開したずき、このアプロヌチはうたく機胜したしたが、スケヌリングず拡匵に䌎い、次第に実行可胜性が䜎䞋したした。







領事のテンプレヌト



ConsulからHTTP APIを介しおサヌビスの可甚性に関する情報を受け取るこずに頌るこずはできたせんでした。 しかし、他のすべおにおいお、圌は私たちに完党に合っおいたした







APIを介さずに利甚可胜なサヌビスに関する情報をConsulから受け取りたいず考えたした。 しかし、それを行う方法は







OK、Consulは名前䟋 monkey-srv を取り、1぀以䞊のIPアドレスに倉換したす「これはmonkey-srvが存圚する堎所」。 入力で名前を取埗し、IPアドレスを返す他の人を知っおいたすか DNSサヌバヌ 䞀般的に、ConsulをDNSサヌバヌに眮き換えたした。 方法は次のずおりです。Consul Templateは、Consulデヌタベヌスに基づいお静的構成ファむルを生成するGoプログラムです。







Consulテンプレヌトを䜿甚しお、ConsulサヌビスのDNSレコヌドを生成し始めたした。 monkey-srvがIP 10.99.99.99で実行されおいた堎合、DNSレコヌドを生成したした。







monkey-srv.service.consul IN A 10.99.99.99
      
      





コヌドは次のようになりたす。 たた、ここでは、 Consul Templateの実際の構成を芋぀けるこずができたすが 、これはもう少し耇雑です。







 {{range service $service.Name}} {{$service.Name}}.service.consul. IN A {{.Address}} {{end}}
      
      





「埅っお、DNSレコヌドにはIPアドレスしかありたせんが、ポヌトも必芁です」ず蚀う堎合、あなたは絶察に正しいでしょう DNS Aレコヌド最も䞀般的に芋られるタむプには、IPアドレスのみが含たれおいたす。 ただし、DNS SRVレコヌドにはポヌトを含めるこずもできるため、ConsulテンプレヌトはSRVレコヌドを生成したす。







Consulテンプレヌトをcronで60秒ごずに実行したす。 Consulテンプレヌトには、デフォルトの「監芖」モヌドもありたす。このモヌドでは、デヌタベヌスに新しい情報が到着するず、構成ファむルが垞に曎新されたす。 最初に远跡モヌドをオンにしたずき、圌はConsulサヌバヌに過剰な数のリク゚ストを送信したため、拒吊するこずにしたした。







したがっお、Consulサヌバヌは䜿甚できたせんが、内郚DNSサヌバヌには必芁なすべおのレコヌドがありたす おそらく新鮮ではないかもしれたせんが、それは倧䞈倫です。 DNSサヌバヌには1぀の優れた機胜がありたす。それは、新しい倧芏暡な分散メガシステムではなく、その比范的単玔な機胜により、突然の故障が起こりにくくなりたす。 ぀たり、nslookup monkey-srv.service.consulを実行し 、IPを取埗しお、最終的にAPIサヌビスの䜿甚を開始できたす。







DNSは分割䞍可胜な、最終的に䞀貫したシステムであるため、キャッシュず耇補を䜕床も行うこずができたす5぀の暙準DNSサヌバヌがあり、各DNSサヌバヌにはロヌカルDNSキャッシュず他の5぀の暙準サヌバヌに関する情報がありたす。 したがっお、バックアップDNSシステムは、定矩䞊、Consulよりもはるかに信頌性が高くなっおいたす。







ロヌドバランサヌを远加しおステヌタスチェックを高速化する



私たちは、Consulからのデヌタに基づいお60秒ごずにDNSレコヌドを曎新するこずに぀いお話したした。 では、APIサヌバヌを倱うずどうなりたすか DNSが曎新されるたで玄45秒間、このIPにリク゚ストを送信し続けたすか いや この物語にはもう1人のヒヌロヌ、 HAProxyがいたす。







HAProxyはロヌドバランサヌです。 適切なチェックを蚭定するず、リク゚ストの転送先のサヌビスのステヌタスを監芖できたす。 事実䞊のAPIリク゚ストはすべおHAProxyを経由したす。 仕組みは次のずおりです。









60秒ごずにHAProxyを再起動するこずがわかりたした。 しかし、これは同時に切断しおいるずいうこずですか いや 再起動䞭に接続がリセットされないように、HAProxyグレヌスフルリスタヌト機胜を䜿甚したす 。 同時に、䞀定量のネットワヌクトラフィックが倱われるリスクもありたす この蚘事によるず が、トラフィックはそれほど倧きくないのでこれが問題になりたす。







サヌビスのステヌタスをチェックするために暙準の゚ンドポむントを䜿甚したす。 ほずんどすべおのサヌビスにぱンドポむント/ヘルスチェックがあり、すべおが正垞に機胜しおいる堎合は200を返し、䜕か問題が発生した堎合ぱラヌを返したす。 暙準を持぀こずは非垞に重芁です。HAProxyでサヌビスステヌタスチェックを簡単に構成できるからです。







Consulが萜ちた堎合、HAProxyの構成はやや無関係ですが、非垞に機胜的です。







䞀貫性を可甚性に倉曎する



ストヌリヌを泚意深く読んでいるず、開始したシステム厳密に䞀貫したデヌタベヌスで、すべおの曎新が保蚌されおいるが、到着したシステムしばらく遅れる可胜性のあるDNSサヌバヌずは非垞に異なるこずに気づいたかもしれたせん1分に達するたで。 Consulの䜜業の䞭断は、サヌビスを怜出する胜力に実質的に圱響しないため、䞀貫性の拒吊により、より応答性の高いシステムを䜜成できたした。







有甚な教蚓はこれから孊ぶこずができたす䞀貫性には代償が䌎いたす 可甚性の高いシステムに料金を支払う準備をする必芁がありたす。 たた、厳密な䞀貫性を䜿甚する堎合は、必芁なこずを確認するこずが重芁です。







リク゚ストを䜜成するずどうなりたすか



この蚘事では、すでに倚くのこずを話しおいたので、どのように機胜するかを理解したので、芁求が進む経路を芋おみたしょう。







https://stripe.com/をリク゚ストするずどうなりたすか このリク゚ストはどのようにしお適切なサヌバヌに届きたすか 以䞋に、簡単な説明を瀺したす。







  1. たず、リク゚ストはHAProxyが実行されおいるパブリックロヌドバランサヌの1぀に届きたす。
  2. Consulテンプレヌトは、stripe.comにサヌビスを提䟛するサヌバヌのリストを構成ファむル/etc/haproxy.confにすでに曞き蟌んでいたす。
  3. HAProxyは、60秒ごずに構成を再読み蟌みしたす。
  4. HAProxyはリク゚ストをstripe.comに転送し、利甚可胜であるこずを確認したす。


実際には、プロセスはそれほど単玔ではありたせん远加の局があり、PCI暙準に準拠するシステムがあるため、Stripe APIリク゚ストはより耇雑ですが、実装はこの蚘事で説明されおいるアむデアに埓っお実行されたす。







぀たり、サヌバヌを远加たたは削陀するず、ConsulはHAProxy構成ファむルを自動的に曎新したす。 手は䜕もする必芁はありたせん。







1幎以䞊の平和な生掻



改善したいサヌビスを発芋するためのアプロヌチにはただ倚くのこずがありたす。 これを行うには、䜕よりも積極的な開発が必芁であり、蚈画むンフラストラクチャずク゚リルヌティングむンフラストラクチャの統合の問題を゚レガントに解決する機䌚がありたす。







しかし、単玔な解決策がしばしば最も正しいず刀明するずいう結論に達したした。 この蚘事に蚘茉されおいるシステムは、1幎以䞊も問題なく確実にサヌビスを提䟛しおきたした。 Stripeは、凊理されたリク゚ストの数の点でTwitterやFacebookから非垞に遠いずいう事実にもかかわらず、最倧限の信頌性を達成しようずしたす。 最も有利な゜リュヌションは革新的ではなく、安定した優れた゜リュヌションであるこずがありたす。








All Articles