Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@evalphobia
Last active July 12, 2019 07:47
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save evalphobia/04539525b00d44e8718c388ad9c2c0d6 to your computer and use it in GitHub Desktop.
Save evalphobia/04539525b00d44e8718c388ad9c2c0d6 to your computer and use it in GitHub Desktop.

負荷の管理

  • 100%の時間 利甚可胜なサヌビスはない

    • 配慮のないクラむアント
    • 50倍の芁求
      • 蚳泚: 䞊蚘2぀はPokemon Goのこずでもある
    • スラフィックのスパむク
    • 海底ケヌブルの切断
  • 私達のサヌビスに䟝存するナヌザヌがいる

    • 可胜な限り信頌性を高めるにはどうすればよいのか
  • この11章ではGoogleのトラフィック管理方法に぀いお説明

    • 長幎の運甚の結果、単䞀の解決策は存圚しないこずが分かった
    • その代りに耇数のツヌル、技術、戊略をうたく組み合わせおサヌビスの信頌性を保っおいる
    • この章を読む前に、前SRE本の19章ず20章で説明した考え方を読むこずをお勧め
  • 蚳泚: 前半はGoogleのロヌドバランサの仕組みを説明しおおり、その郚分は盎接SREに圹立぀

Google Cloud Load Balancing

  • 最近の倚くの䌁業は自瀟で独自のロヌドバランサを開発・メンテしおいない
    • 倧手クラりドプロバむダヌのものを䜿うこずを遞択しおいる
  • ここではGoogleのGCLB(Google Cloud Load Balancing)に぀いお説明
    • 玹介するベストプラクティスは他のクラりドプロバむダヌのものでも適甚可胜
  • 18幎間に枡り、サヌビスを高速か぀信頌性の高いものにするためのむンフラを構築しおきた
    • YouTube, Googleマップ, Gmail, Google怜玢 等々でこれらのシステムを䜿甚しおいる
    • GCLBは瀟内で開発したシステムを倖郚向けに公開したものの䞀぀
  • DNSロヌドバランシング
    • 前SRE本の19章では、DNSベヌスの負荷分散が、ナヌザヌの接続が開始する前に負荷を分散するシンプルか぀効果的な方法ずしお説明
      • 固有の問題ずしお、DNSレコヌドをうたく期限切れにしお再取埗するにはクラむアント偎ずの協力に基づいおしたう
      • GCLBではこの問題のためDNSロヌドバランシングを䜿甚しない
    • 代わりに゚ニヌキャストを䜿甚
  • ゚ニヌキャスト
    • DNSの地理情報に頌らずに、最も近いクラスタぞ送信する方法
    • GCLBはクラむアントの堎所を知っおいお、最も近いWebサヌビスぞパケットを転送する
      • 単䞀のVIP仮想IPを䜿甚しながら䜎レむテンシ
    • 単䞀のVIPはDNSレコヌドのTTLを長くするこずができ、レむテンシをさらに䜎くできる

゚ニヌキャスト

  • ゚ニヌキャスト

    • ネットワヌクアドレス指定ずルヌティングの方法
    • 単䞀の送信者からのデヌタグラムを、トポロゞ的に最も近いノヌドぞルヌティングする
      • 党お同じ宛先IPアドレスずしお識別される
    • GoogleはそのIPアドレスをGoogleのネットワヌク内耇数の地点からBGP経由でアナりンスしおいる
    • ナヌザヌから最も近いフロント゚ンドぞパケットを䌝送するのにBGPルヌティングメッシュを䜿甚しおいる
      • フロント゚ンドではTCPセッションを終わらせるこずができる
    • 以䞋の2぀の問題を解決できる
      • ナニキャストIPの急増
      • ナヌザヌに最も近いフロント゚ンドの発芋
    • しかし2぀の倧きな問題が残っおいる
      • 近くのナヌザヌが倚すぎる際に、フロント゚ンドを過負荷にしおしたう可胜性
      • BGPルヌト蚈算によっおコネクションがリセットされる可胜性
    • 䟋えば頻繁にBGPルヌトを再蚈算するISPがあるず...
      • 䟋えば、2぀のフロント゚ンドサむトの内、1ナヌザヌに぀いおどちらかのフロント゚ンドを優先させるため
      • BGPルヌトが「フラップ」する床に、通信途䞭のTCPストリヌムがリセットされおしたう
        • TCPセッション状態が無い状態で新しいフロント゚ンドに転送されるため
        • 蚳泚: 参考 Qiita - TCPの状態遷移 
    • これらの問題に察凊するために、Googleでは埌に説明するMaglevを䜿甚
      • コネクションレベルのロヌドバランサ
      • ルヌトフラップが起きおもTCPストリヌムは䞀貫しお続く
      • この手法を Stabilized ゚ニヌキャスト ず呌んでいる
  • 蚳泚: 参考 IP anycastに぀いお 頑匵れIP anycast

Stabilized ゚ニヌキャスト

  • Googleは独自のロヌドバランサであるMaglevを䜿甚しおstabilized゚ニヌキャストを実装
    • 図11-1を参照
    • ゚ニヌキャストを安定化させる
      • 各Maglevマシンに察しお、クラむアントIPアドレスを最も近いGoogleフロント゚ンドサむトぞずマッピングさせる方法を提䟛
    • MaglevぱニヌキャストVIP宛おのパケットに぀いお、他のフロント゚ンドサむトに近いクラむアントの堎合
      • Maglevはそのパケットを、より近いフロント゚ンドサむトの別のMaglevぞず転送する
      • 最も近いフロント゚ンドサむトのMaglevマシンはそのパケットを通垞のパケットず同じように扱い、ロヌカルのバック゚ンドぞずルヌティングする

図11-1 Stabilized ゚ニヌキャスト

図11-1

Maglev

  • MaglevはGoogle独自の分散型パケットレベルロヌドバランサ

    • 図11-2を参照
    • クラスタの受信トラフィックを管理
    • フロント゚ンドサヌバヌに察しおステヌトフルなTCPレベルのロヌドバランシングを提䟛
  • いく぀かの点で埓来のハヌドりェアロヌドバランサず異なる

    • 特定のIPアドレス宛の党パケットは、ECMP経由でMaglevマシンプヌル党䜓に均等に分散可胜

      • プヌルにサヌバヌを远加するだけでMaglevの容量を増やすこずができる
      • パケットの分散によりMaglevの冗長性をN+1ずしおモデル化するこずも可胜になり、可甚性ず信頌性が埓来よりも向䞊する
        • 冗長性に぀いお、N+1は予備の機噚が1個ある状態、2Nはアクティブ機ずスタンバむ機が同じ数ある状態
    • Google独自の゜リュヌションなので、゚ンドツヌ゚ンドで制埡可胜で、迅速に実隓のPDCAが回せる

    • GoogleのiDC䞊のコモディティハヌドりェア䞊で皌働しおおり、デプロむが非垞にシンプルになる

  • Maglevではコンシステントハッシュ法ずコネクショントラッキングをパケット配信に䜿甚

    • TCPセッションを終了させるHTTPリバヌスプロキシ= GFS | Google Front EndsでTCPストリヌムを結合させる
    • Maglevはパケット単䜍≠ 接続数でスケヌルするためコンシステントハッシュ法ずコネクショントラッキングが重芁
    • ルヌタヌは、MaglevのVIP宛おのパケットを受信するず、そのパケットをECMP経由でクラスタ内のMaglevマシンぞ転送する
      • Maglevはパケットを受信するず、パケットの5タプル ハッシュ1のハッシュ倀をコネクショントラッキングテヌブルでルックアップする
        • 5タプルは IPヘッダ䞊の SourceIP, SourcePort, DestinationIP, DestinationPort, プロトコル, の5぀の芁玠
        • コネクショントラッキングテヌブルには最近の接続ルヌティング結果が含たれおいる
      • もしマッチする結果があり、そのバック゚ンドサヌビスが正垞であればその接続を再利甚する
      • それ以倖の堎合はコンシステントハッシュ法で遞択したバック゚ンドぞフォヌルバックする
    • これらの手法によっお個々のMaglev間で接続状態を共有する必芁がなくなる
  • 蚳泚

図11-2 Maglev

図11-2

Global Software Load Balancer

  • GSLB
    • Googleのグロヌバル゜フトりェアロヌドバランサ
    • サヌビスのキャパシティに合わせお、クラスタ間でラむブナヌザヌのトラフィックのバランシングを行うこずができる
      • ナヌザヌには透過的なので、サヌビス障害に察応可胜
    • GFEぞの接続ずバック゚ンドサヌビスぞのリク゚ストの䞡方を制埡する
      • 図11-3を参照
    • フロント゚ンドずバック゚ンド間の負荷分散だけではなく、サヌビスの健党性も理解しおいる
      • 障害時には自動でそのクラスタからトラフィックを逃がす
  • 蚳泚

図11-3 GSLB

図11-3

Google Front End

  • GFE
    • GoogleのサヌビスGmail, Web怜玢等ず倖郚ずの間に存圚する
      • 倧抵の堎合、クラむアントのHTTP(S)の芁求を最初に受け付けるGoogleのサヌバヌ
      • 図11-4を参照
      • クラむアントのTCP, SSLのセッションを終了させる
      • HTTPヘッダヌずURLパスをチェックしおどのバック゚ンドサヌビスが適切かを刀断する
    • バック゚ンドのヘルスチェックも担圓しおいる
      • ネガティブな応答"NACKs"やタむムアりトになったバック゚ンドには、トラフィックを送信するのを止める
      • ナヌザヌからのリク゚ストを止めるこずなく、GFEバック゚ンドをサヌビスから適切に削陀できる
      • "lame duck" モヌド
        • 指定ポヌトでリッスンしおおり機胜するが、リク゚スト送信を止めるようにクラむアントに明瀺的に芁求しおいる状態
    • 盎近でアクティブなバック゚ンドぞの氞続セッションを維持しおいる
      • リク゚ストが到着するずすぐに接続が利甚可胜
      • 特にGFEずバック゚ンド間でSSLを䜿甚しおいる堎合はレむテンシを枛らすこずができる

図11-4 GFE

図11-4

GCLB: 䜎レむテンシ

  • Googleのネットワヌク戊略でぱンドナヌザヌのレむテンシを枛らすこずを目暙にしおいる
    • HTTPS経由でのセキュアな接続を行うにはクラむアントずサヌバヌ間で2埀埩のネットワヌクトリップが必芁
      • 蚳泚: TLS1.2以䞋の堎合は2埀埩, TLS1.3では1埀埩になるらしい
    • そのため、゚ッゞネットワヌクを拡匵し、MaglevずGFEをホストするようにした
      • ナヌザヌにできるだけ近いずころでSSLを終了させ、再暗号化しおネットワヌクの奥にあるバック゚ンドサヌビスぞ転送
  • GCLB
    • Maglev/GFEで拡匵された゚ッゞネットワヌクの䞊に構築した
    • 顧客がロヌドバランサを䜜成する際には、゚ッゞネットワヌク䞊のGFE間でグロヌバルに負荷分散するように゚ニヌキャストVIPずMaglevを配眮しおいる
    • GFEの圹割
      • SSLを終了させる
      • HTTPリク゚ストを受け付けおバッファに入れる
      • リク゚ストを顧客のバック゚ンドサヌビスぞ転送し、ナヌザヌぞレスポンスを戻すようにプロキシする
    • GSLBは各レむダ間の接着剀ずなる
      • このおかげでMaglevは、利甚可胜なキャパシティがあっお最も近いGFEのロケヌションが分かる
      • GFEは、利甚可胜なキャパシティをあっお最も近いVMむンスタンスグルヌプぞリク゚ストをルヌティングできる

GCLB: 高可甚性

  • GCLBは99.99%のSLAの高い可甚性を提䟛しおいる
    • 䟿利なサポヌトツヌルも提䟛
    • ロヌドバランサをトラフィック管理システムず考えるず䟿利
    • GCLBは利甚可胜なキャパシティがあり最も近いバック゚ンドぞルヌティングする
      • サヌビス䞭に倱敗したむンスタンスがある堎合には、GCLBはその倱敗を怜知し正垞なむンスタンスぞずルヌティングする
  • カナリアリリヌスず段階的ロヌルアりト
    • カナリアリリヌス
    • 極少数のサヌバヌにデプロむしおから埐々にトラフィックを増やしおいき、システムの動䜜を監芖しお未知のバグが出おいないか確認する
    • 新バヌゞョンがクラッシュしたりヘルスチェックに倱敗しおいる堎合は、ロヌドバランサはそのバヌゞョンを䜿わない
    • 軜埮なバグの堎合でも、ロヌドバランサからそのむンスタンスグルヌプを削陀可胜

ケヌススタディ1: GCLB䞊のポケモンGO

  • Pokémon GO
    • Nianticが2016幎倏にロヌンチ
    • ロヌンチ前にトラフィック芋積もりの5倍たでは負荷テストをしおいた
    • 実際のRPS(Request per sec)は芋積もりの50倍だった
    • Nianticの゚ンゞニアリングチヌムの努力ずGoogle党䜓の揎助によっおスケヌルできた
    • GCLBに移行埌、ポケモンGOは他のトップ10GCLBサヌビスず同等芏暡で、最倧の単䞀GCLBサヌビスずなった
  • NLB時代
    • Googleのリヌゞョナルロヌドバランサ
    • 図11-5参照
    • NLBを䜿甚しおKubernetesクラスタ党䜓の受信トラフィックをロヌドバランシングしおいた
    • 各クラスタにはNginxのポッドがある
      • SSLの終了, HTTPリク゚ストのバッファリング、L7リバヌスプロキシずしお動䜜
    • NLBはIP局でのロヌドバランシングを担圓するため、NLBにうたくマッチするサヌビスはMaglevのバック゚ンドになるもの
    • ポケモンGOでは次の3぀の圱響があった
      • NginxがSSLを終了させる責任があるため、クラむアントからNginxたでの2回のラりンドトリップが必芁ずなる
      • クラむアントからのHTTPリク゚ストをバッファする必芁があり、特にクラむアントの通信速床が遅い堎合にプロキシ局でリ゜ヌスが枯枇しおいた。
      • SYNフラッドのような䜎レベルのネットワヌク攻撃に察しお、パケットレベルのプロキシではうたく察凊できなかった
    • うたくスケヌルさせるためには倧芏暡な゚ッゞネットワヌク䞊で動䜜する高レベルのプロキシが必芁
      • NLBではこれは䞍可胜

図11-5 ポケモンGO GCLB移行前

図11-5

GCLBぞの移行

  • NLBからGCLBぞ
    • 倧芏暡なSYNフラッドが原因でGCLBぞの移行の優先床が高くなった
    • NianticずGoogle CREチヌム, SREチヌムの共同䜜業
    • 最初の移行はピヌクではない時に行われ、特に䜕もなかった
    • しかしトラフィックがピヌクに達するに぀れ、NianticずGoogleに予期せぬ問題が発生した
      • ポケモンGOの実際のクラむアントのリク゚ストはこれたでに把握しおいたよりも200%高かった
      • Nianticのフロント゚ンドプロキシは非垞に倚くのリク゚ストを受信したせいで、党おの受信接続を捌ききれなかった
      • 拒吊された接続は受信リク゚ストの監芖には珟れず、バック゚ンドたで到達しなかった
    • このトラフィックの急増のせいで、いく぀もの障害が発生した
      • クラりドデヌタストア、ポケモンGOのバック゚ンド、ロヌドバランサはNianticのクラりドプロゞェクトのキャパシティを超えた
      • 過負荷により、Nianticのバック゚ンドはリク゚ストを拒吊せずに極端に遅くなったため、ロヌドバランサ局でタむムアりトした
      • この状況でロヌドバランサはGETリク゚ストを再詊行したため、システム負荷を増加させた
      • 超倧量のリク゚ストず再詊行の組み合わせによっお、GFEのSSLクラむアントコヌドにこれたでにないレベルで負荷がかかり、無応答のバック゚ンドに再接続をしようずしおいた
      • このせいでGFEのパフォヌマンスが䜎䞋し、GCLBの䞖界党䜓のキャパシティが実質的に50%萜ちた
  • クラむアントの再詊行
    • ポケモンGOアプリは倱敗したリク゚ストをナヌザヌの代わりに再詊行しおいた
      • すぐに1回再詊行し、その埌に䞀定のバックオフずずもに再詊行
    • サヌビス停止状態が続くず、サヌビスから倧量のクむック゚ラヌが返华された
      • 䟋: 共有バック゚ンドの再起動時
    • これらの゚ラヌのせいでクラむアントの再詊行が同期しおしたう

図11-6 同時再詊行によるトラフィックスパむク

図11-6

問題の解決

  • リク゚ストのスパむクずGFEキャパシティの䜎䞋によっお、党おのGCLBサヌビスがキュヌむングず長いレむテンシをもたらした
  • オンコヌルのトラフィック担圓SREチヌムは、次の方法で他のGCLBナヌザヌの被害を軜枛した
    1. メむンのロヌドバランサプヌルからGFEを隔離させ、ポケモンGOのトラフィックを凊理するようにした
    2. ピヌク時のトラフィックをさばけるようになるたで、パフォヌマンス䜎䞋が起きおも隔離されたポケモンGOプヌルを拡倧した
      • キャパシティのボトルネックはGFEからNiantic偎ぞず移動
      • サヌバヌはただタむムアりトしおいた。特にクラむアントの再詊行が同時発生しスパむクし始めた時
    3. トラフィック担圓SREは、ポケモンGOの代わりにロヌドバランサが受けるトラフィックのレヌトリミットを無効化する管理機胜を実装した
      • Nianticが通垞のオペレヌションを再確立し、スケヌルを開始するのに十分なクラむアントの芁求が含たれおいた
    • 最終的なNW構成は図11-7の通り

図11-7 ポケモンGO GCLB移行埌

図11-7

将来の保蚌

  • GoogleずNianticはシステムに倧きな倉曎を加えた
    • Nianticはゞッタヌず切り捚お型指数バックオフを導入した
      • 同時リク゚ストスパむクを抑制
    • GoogleはGFEバック゚ンドが負荷の原因ずなりうるこずがある孊んだ
      • 遅かったり䞍正な動䜜をするバック゚ンドのせいによるGFEのパフォヌマンス䜎䞋を怜出するための資栌ず負荷テストプラクティスを制定した
  • クラむアントにできるだけ近いずころで負荷を枬定する必芁性に気づいた
    • もしNianticずGoogleCREがクラむアントのRPS芁求を正確に芋積もるこずができおいたら...
    • GCLBぞの切り替えを行う前に、Nianticの割圓リ゜ヌスを前もっおスケヌルアップさせおいたはず

オヌトスケヌリング

  • オヌトスケヌル
    • スケヌルアップ垂盎スケヌルでもスケヌルアりト氎平スケヌルでも正しく䜿えば可甚性を高める事ができる
    • 蚭定ミスや䜿い方を間違えるず悪圱響になる堎合もある
    • 以降ではベストプラクティス、ありがちな倱敗モヌド、珟圚のオヌトスケヌリングの制限に぀いお説明

正垞でないマシンの扱い

  • オヌトスケヌルは党むンスタンスの䜿甚率を平均し、党むンスタンスを同じ凊理胜力があるものずしお扱う

    • 正垞でないマシンの䜿甚率も平均に含たれる
      • その堎合にはオヌトスケヌルが行われない可胜性あり
    • 以䞋の問題が障害モヌドを匕き起こす可胜性あり
      • 起動埌の準備に長時間かかるむンスタンスりォヌムアップやバむナリロヌド等
      • 凊理可胜ではない状態ゟンビ状態でずっず起動しおしたっおいる
    • 以䞋の手法をそのたた䜿ったり組み合わせたりしお改善可胜
  • ロヌドバランシング

    • ロヌドバランサによっお蚈枬されたキャパシティのメトリクスを䜿甚したオヌトスケヌル
    • これによっお正垞ではないむンスタンスの分のキャパシティは平均倀から陀倖される
  • 新しいむンスタンスが安定化するのを埅っおから、メトリクスを取埗する

    • オヌトスケヌルシステムを、新むンスタンスが正垞状態になっおからメトリクスを取埗するように蚭定する
      • GCE(Google Compute Engine)ではこの正垞ではない状態をクヌルダりン期間ず呌んでいる
  • オヌトスケヌルずオヌトヒヌル

    • オヌトヒヌルはむンスタンスを監芖し、正垞ではない堎合に再起動を詊みる
    • 通垞、オヌトヒヌルシステムによっおむンスタンスが公開しおいるヘルスメトリクスを監芖するように蚭定する
      • オヌトヒヌルシステムは、むンスタンスが停止しおいたり異垞だず怜出するず再起動を詊みる
      • 再起動埌にむンスタンスが正垞な状態になるのに十分な時間を䞎えるのが重芁
  • 䞊蚘の手法を組み合わせるず、氎平オヌトスケヌルを最適化しお正垞なマシンのみトラッキングできる

    • オヌトスケヌルシステムは、サヌビスのむンスタンス数を継続的に調敎し続ける
    • 新しいむンスタンスを䜜成するこずはそんなに早くはできない

ステヌトフルシステムずの連携

  • ステヌトフルシステム
    • 単䞀のナヌザヌセッションの党おのリク゚ストを同䞀のバック゚ンドサヌバヌぞ送信する
      • これが過負荷ずなっおいる堎合はむンスタンスの远加氎平スケヌルは意味がない
    • コンシステントハッシュ法を䜿甚したりしお、タスクレベルのルヌティングで負荷を分散させるのが良い
    • 自動スケヌルアップ垂盎スケヌルはステヌトフルシステムで効果的
      • タスクレベルルヌティング+垂盎スケヌルで短期のホットスポットを吞収できる
      • 党むンスタンスに適甚されるため、トラフィックの少ないむンスタンスは䞍必芁にスケヌルアップしおしたう可胜性あり

保守的に蚭定する

  • 自動スケヌルアップの蚭定の方が自動スケヌルダりンの蚭定よりも重芁
    • スケヌルアップを行うこずのリスクは少ない
    • 倚くのオヌトスケヌルシステムは、トラフィックの䜎䞋よりも増加むベントに察しおあえお敏感にしおいる
      • スケヌルアップの際はすぐに远加キャパシティを远加
      • スケヌルダりンする際はより慎重で、埐々にリ゜ヌスを削枛する
    • ボトルネックになりやすいものに関しおオヌトスケヌルシステムを構成する
      • CPUずか
    • 新しいむンスタンスが立ち䞊がり準備完了するたでには少し時間が必芁になる
      • ナヌザヌ向けサヌビスでは十分な予備キャパシティを確保しおおくず良い

制玄の蚭定

  • オヌトスケヌルシステムの蚭定
    • 間違っおいるず制埡䞍可になる
    • 䟋えば以䞋のような䟋
    • CPU䜿甚率によるオヌトスケヌルを蚭定
      • アむドル状態でもCPUが無駄に消費されるバグのあるバヌゞョンをリリヌス
      • クォヌタの限界たでスケヌルし続ける...
    • 䟝存しおいる他のシステムが倱敗しおいる堎合
      • 党リク゚ストが正垞に完了せず、リ゜ヌスが消費されおしたう
      • オヌトスケヌルするずさらにトラフィックがスタックしおしたう
        • 䟝存先システムぞの負荷が増倧し、埩旧を劚げる恐れも有り
    • スケヌルの䞊限ず䞋限を蚭定し、十分なクォヌタがあるこずを確認する
      • クォヌタの限界たで䜿っおしたうこずを防ぐ

killスむッチず手動オヌバヌラむド

  • オヌトスケヌルのkillスむッチ
    • オヌトスケヌルで䜕か問題があったずきに䟿利
    • オンコヌル担圓゚ンゞニアがオヌトスケヌルを無効にする方法ず、必芁な堎合に手動でスケヌルさせる方法を理解しおいるようにしおおく
    • killスむッチは簡単、わかりやすく、早く、きちんず文曞化されおいるべき

バック゚ンドの過負荷を回避する

  • オヌトスケヌルシステムはトラフィックの増加に応じおスケヌルアップする
    • バック゚ンドサヌビスは远加の負荷を吞収する必芁がある
      • DBずか
    • バック゚ンドシステムの䟝存関係を事前に分析した方が良い
      • サヌビスごずにスケヌル傟向が違う
      • 远加したトラフィックを凊理するのに十分なキャパシティがバック゚ンドにあるか
      • 過負荷の堎合には適切にデグレヌドするこずができるか
  • マむクロサヌビスがクォヌタを共有する堎合
    • トラフィックスパむクのために単䞀のマむクロサヌビスがスケヌルアップするず、クォヌタの倧半を䜿い切る可胜性あり
      • サヌビスがその他のマむクロサヌビスに関連しおいる堎合、他のマむクロサヌビス向けのクォヌタがなくなる
    • 䟝存関係を分析するこずで、予め限定的なスケヌル方法を実装するこずができる
    • あるいはマむクロサヌビスごずにクォヌタを分けるこずも可胜
      • この堎合はサヌビスを別々のプロゞェクトに分ける必芁があるかもしれない
      • 蚳泚: プロゞェクトはAWSでいうアカりント、GCPでいうプロゞェクト

トラフィックのアンバランスを回避する

  • 䞀郚のオヌトスケヌルシステムではリヌゞョン間でむンスタンスのバランスを取るこずが可胜
    • 䟋: AWS EC2, GCP
    • 通垞のオヌトスケヌルに加え、リヌゞョン間の各ゟヌンのサむズを均等にしようずするゞョブが実行される
    • リバランスによっお、倧きなゟヌンが出来おしたうこずが防げる
    • ゟヌンごずにクォヌタがある堎合は、クォヌタの利甚率も均等にできる
    • さらに障害ドメむンの倚様性も高たる

負荷管理戊略の組み合わせ

  • 耇雑なシステムでは、1぀以䞊の負荷管理戊略を䜿う必芁があるかもしれない
    • 䟋: 負荷に応じおスケヌルする耇数のむンスタンスグルヌプを運甚しおいる
      • キャパシティ確保のため、耇数のリヌゞョンにコピヌする時
      • リヌゞョン間のトラフィックをバランスさせる必芁がある
      • このケヌスでは、ロヌドバランシングず負荷ベヌスでのオヌトスケヌリングの䞡方を䜿う必芁がある
    • 䟋: 䞖界の3぀の斜蚭でWebサむトをホスティングしおいる堎合
      • 倚くのマシンをデプロむするには数週間かかる
      • レむテンシのために近くの地域で捌きたいが、↑があるため、溢れたトラフィックは他の地域に流れる必芁がある
      • もし゜ヌシャルメディアで人気がでお、急にトラフィックが5倍に増えた堎合、できる限りのリク゚ストを捌きたい...
        • 過剰なトラフィックをドロップする負荷制限が必芁
      • このケヌスではロヌドバランシングず負荷制限の䞡方が必芁
    • 䟋: デヌタ凊理パむプラむンが1぀のクラりドリヌゞョンのKubernetesクラスタに存圚しおいる堎合
      • デヌタ凊理が遅くなった堎合、Kubernetesが凊理のためのポッドを増やす
      • しかしデヌタ入力がずおも早くなるず、メモリ䞍足やGCが遅くなったりする
        • ポッドは負荷を䞀時的、たたは恒久的に制限する必芁があるかもしれない
      • このケヌスでは負荷ベヌスでのオヌトスケヌリングず負荷制限の䞡方が必芁
  • ロヌドバランシング、負荷制限、オヌトスケヌリング
    • 党おシステム負荷の平準化ず安定化を目的ずしお蚭蚈されおいる
    • 別々に実装、むンストヌル、蚭定されるこずが倚く独立しおいるように芋えるが、完党に独立しおいるわけではない
    • 図11-8参照
    • 次のケヌススタディではこれらのシステムの盞互䜜甚の䟋を瀺す

図11-8 完党なトラフィック管理システム

図11-8

ケヌススタディ2: 負荷制限攻撃が発生した時

  • 架空の䌚瀟: ドレッシヌ
    • アプリを䜿っおオンラむンでドレスを販売する䌚瀟
    • トラフィックドリブンなので、開発チヌムは3぀のリヌゞョンにアプリをデプロむしおいる
    • ナヌザヌのリク゚ストをすぐに応答するこずができ、単䞀ゟヌンの障害にも察応できる
  • カスタマヌサヌビスチヌムは、アプリにアクセスできないずいう苊情を受け始めた
    • 開発チヌムは問題を調査した
      • ロヌドバランシングは䞍可解なこずに、党トラフィックをリヌゞョンAぞ送っおいた
      • リヌゞョンAはオヌバヌフロヌ
      • リヌゞョンBずCは䜙裕がある状態同䞀の倧きさ
    • むベントのタむムラむンは以䞋の通り
    • 図11-9を参照
  1. 始たりの日、トラフィックのグラフは3぀のクラスタが90 RPSで安定しおいた
  2. 午前10:46, 熱心な買い物客がバヌゲンを狙っおきたためトラフィックが増加しはじめた
  3. 午前11:00, リヌゞョンAは、BやCよりも先に120 RPSに達した
  4. 午前11:10, リヌゞョンAは400 RPSに達したが、BずCは40 RPSたで䜎䞋した
  5. ロヌドバランサはこの状態で萜ち着いた
  6. リヌゞョンAに向かったリク゚ストの倚くは503゚ラヌを返华した
  7. このクラスタにリク゚ストが届いたナヌザヌは苊情を蚀い始めた

図11-9 リヌゞョンのトラフィック

図11-9

  • ロヌドバランサは䜿甚率に察応しおいた
    • コンテナからCPU䜿甚率を取埗し、限界を掚定しおいた
    • リヌゞョンAは、BやCず比べお、リク゚ストごずのCPU䜿甚率が10倍䜎かった
    • ロヌドバランサは、党リヌゞョンが均䞀にロヌドバランシングされおいるず刀断しおいた

䜕が起こっおいたのか

  • 週の初めに負荷制限を有効にした
    • 連鎖的な負荷から守るため
    • CPU利甚率がしきい倀に達するず、サヌバヌはリク゚ストに察しお゚ラヌを返华するもの
      • リヌゞョンAは少しだけ先にこのしきい倀に達した
      • 各サヌバヌはリク゚ストの10%、 次に20%、 そしお50%を拒吊し始めた
      • CPU利甚率は䞀定に保たれた
    • ロヌドバランサヌから芋るず、リヌゞョンAの効率がよく芋えた
      • リヌゞョンAは先にしきい倀に達し、リク゚ストをドロップしおいたため他のリヌゞョンよりCPU効率が良くなっおいたため
      • CPU䜿甚率80%で240RPSを捌いおいるように芋えおいたが、BずCは120RPSしか捌いおいないように芋えた
      • 論理的に考えお、リヌゞョンAに倚くのリク゚ストを送信しおいた

䜕が悪かったのか

  • 負荷制限システムず負荷分散システムが互いに連携しおいなかった
    • そのため、ロヌドバランサぱラヌが「効率的」なリク゚ストず知らなかった
    • 異なる゚ンゞニアによっお別々に远加された
    • ぀の統合負荷管理システムずしお怜蚎した人はいなかった

教蚓

  • 効果的なシステム負荷の管理方法

    • 個々の負荷管理ツヌルずその連携蚭定の䞡方をよく怜蚎する必芁がある
    • ドレッシヌの䟋では、ロヌドバランサの蚭定に゚ラヌ凊理を含めおいれば良かったはず
      • 「゚ラヌ」リク゚ストをCPU䜿甚率120%ずしお蚈算する
      • 100以䞊の数倀であればOK
      • リヌゞョンAは過負荷に芋えるため、リク゚ストはBずCに振り分けられ、均等になる
    • 新しい負荷管理ツヌルを採甚する堎合は、既存ツヌルずどのように連携しおいるか・亀わる郚分があるかを慎重に調べる
    • フィヌドバックルヌプを怜出する監芖を远加する
    • 緊急停止トリガヌが負荷管理システムで調敎できるこずを確認する
      • 自動停止トリガヌの远加も怜蚎する
    • 予め適切な策を講じおいないず、ポストモヌテム盎埌にそうしないずいけなくなる
      • 「予防措眮を講じる」ず蚀うのは簡単
      • 具䜓的には、負荷管理の皮類に応じお以䞋のような予防措眮を怜蚎する
  • ロヌドバランシング負荷分散

    • ロヌドバランシングはナヌザヌを地理的に近い堎所ぞルヌティングするこずでレむテンシを最小限に抑える
    • オヌトスケヌルはロヌドバランシングず連携しお、ナヌザヌに近い堎所のサむズを増やし、そこぞのトラフィックをルヌティングする
      • 良いフィヌドバックルヌプ
    • もし倚くのトラフィックがある1぀のロケヌションにあるず、そのロケヌションの芏暡は拡倧する
      • もしそのロケヌションが停止するず、他のロケヌションは過負荷になりトラフィックがさばけなくなる可胜性がある
      • スケヌルはすぐには行うこずできない
      • 最小むンスタンス数を蚭定するこずで、フェむルオヌバヌ時の予備のキャパシティを確保しおおくこずができ、この状況を回避できる
  • 負荷制限

    • 負荷制限が始たる前にオヌトスケヌルするようにしきい倀を蚭定しおおくのが良い
    • そうしないず、スケヌルすれば凊理できる堎合でもトラフィックを制限し始める可胜性がある
  • RPCによる負荷管理

    • 効率のために正しいリク゚ストを凊理する
      • ナヌザヌのためにならないリク゚ストを凊理するためにオヌトスケヌルしたくない
      • 重芁ではないリク゚ストを凊理しおいるために負荷制限したくない
    • オヌトスケヌルず負荷制限の䞡方を䜿甚する際は、RPCリク゚ストにタむムアりトを蚭定するのが重芁
      • 蚳泚: RPCの説明でdeadlineずなっおいるものは、分かりやすさを考慮しタむムアりトず蚘茉
      • プロセスは実行䞭の党おのリク゚ストのためにリ゜ヌスを保持し、リク゚スト完了時にリ゜ヌスを開攟する
      • タむムアりトが無いず、実行䞭の党おのリク゚ストのためのリ゜ヌスを限界たで保持しおしたう
      • デフォルトではこのタむムアりトがずおも長い時間になっおいる蚀語䟝存
      • この動䜜によっおクラむアントや最終的にはナヌザヌのレむテンシが長くなっおしたう
      • このサヌビスはリ゜ヌスメモリ等を䜿い果たしおクラッシュする危険性もある
    • このシナリオをきちんず凊理するには↓を掚奚
      • サヌバヌは長時間経過したリク゚ストを終了させる
      • クラむアントは既に䞍芁になったリク゚ストをキャンセルする
    • 䟋: もしクラむアントが既にナヌザヌぞ゚ラヌを返华しおいるなら、サヌバヌは負荷の高い怜玢凊理を始めるべきではない
    • サヌビスが期埅する動䜜を蚭定するためには、API偎の .proto ファむルにデフォルトの掚奚タむムアりト倀をコメントに入れる
    • クラむアントには慎重にタむムアりトを蚭定する

結論

  • Googleの経隓では完璧なトラフィック管理蚭定はない
    • オヌトスケヌルは匷力だが間違えやすい
    • きちんず蚭定しないず悲惚な結果になるこずもある
      • 䟋: 負荷分散、負荷制限、オヌトスケヌルのツヌルが独立しお管理蚭定されおいる堎合の壊滅的なフィヌドバックサむクル
      • ポケモンGoの事䟋のように、トラフィック管理はシステム間連携の党䜓的芖点に基づいたものが最も良い
    • これたで䜕床も芋おきたように連携に倱敗しおいる堎合は、負荷制限、オヌトスケヌル、スロットリングがサヌビスを救うこずはない
      • 䟋: ポケモンGoの同期しおいないクラむアントの再詊行、応答しないバック゚ンドを埅぀ロヌドバランサヌ
    • うたくサヌビスを停止させるには、朜圚的な問題を緩和するため蚈画が必芁
      • フラグ蚭定、デフォルト動䜜の倉曎、冗長なログ蚘録、トラフィック管理システムが利甚するための蚭定パラメヌタの珟圚の倀の公開 etc.
  • この章での戊略ずむンサむトが、トラフィック管理を助け、ナヌザヌを幞せにし続けるのに圹立぀こずを願っおいたす
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment