MixerとSPOF神話
可用性の向上とレイテンシの削減。
Mixerがリクエストパス上にあるため、それがシステム全体の可用性とレイテンシにどのように影響するか疑問に思うのは当然です。Istioのアーキテクチャ図を初めて見た人がよく言うのは、「これは単一障害点(SPOF)を導入しているだけではないか?」ということです。
この記事では、Mixerを支える設計原則と、Mixerが実際にはメッシュ全体の可用性を向上させ、平均リクエストレイテンシを削減するという驚くべき事実について詳しく説明します。
IstioでのMixerの使用は、システム全体の可用性とレイテンシに関して2つの主な利点があります。
SLOの向上。Mixerは、プロキシとサービスをインフラストラクチャバックエンドの障害から隔離し、メッシュの有効な可用性を高めます。Mixerがない場合と比べて、インフラストラクチャバックエンドとのやり取りにおいて、メッシュ全体で障害発生率が低くなる傾向があります。
レイテンシの削減。共有マルチレベルキャッシュとシャーディングの積極的な使用により、Mixerはメッシュ全体の平均観測レイテンシを削減します。
以下で詳しく説明します。
これまでの経緯
長年にわたりGoogleでは、Googleが公開する多数のAPIを処理するために、内部APIおよびサービス管理システムを使用してきました。(Google Maps、YouTube、Gmailなど)世界最大のサービスを支え、ピーク時には数億QPSを維持しています。このシステムはGoogleにとって役立ってきましたが、Googleの急速な成長に追いつくことができず、運用コストの急増を抑えるために新しいアーキテクチャが必要であることが明らかになりました。
2014年、よりスケーラブルな代替アーキテクチャを作成するための取り組みを開始しました。その結果は非常に成功し、Google全体に徐々に展開され、その過程で月に数百万ドルの運用コストを削減しました。
旧システムは、すべての着信トラフィックが流れ込み、実際の作業が行われるサービスに転送される前に、かなり負荷の高い共有プロキシの集中型フリートを基盤として構築されていました。新しいアーキテクチャは共有プロキシ設計を廃止し、代わりにサービスインスタンスの横に配置された非常に軽量で効率的な分散サイドカープロキシと、シャーディングされた共有制御プレーン仲介者のフリートで構成されています。
見覚えがありますか?そうです、Istioと同じです!Istioは、この分散プロキシアーキテクチャの第2世代として考案されました。この内部システムから重要な教訓を学び、パートナーとの協力によって多くの概念を一般化し、Istioを作成しました。
アーキテクチャの概要
以下の図に示すように、Mixerはメッシュとそれをサポートするインフラストラクチャバックエンドの間に位置しています。
Envoyサイドカーは、事前条件チェックを実行するために各リクエストの前に論理的にMixerを呼び出し、テレメトリを報告するために各リクエストの後に呼び出します。サイドカーにはローカルキャッシングがあるため、比較的多くの事前条件チェックをキャッシュから実行できます。さらに、サイドカーは発信テレメトリをバッファリングするため、数千リクエストごとにMixerを実際に呼び出す必要があるだけです。事前条件チェックはリクエスト処理に対して同期処理ですが、テレメトリレポートはファイアアンドフォーゲットパターンで非同期処理されます。
高いレベルで、Mixerは以下を提供します。
バックエンドの抽象化。Mixerは、個々のインフラストラクチャバックエンドの実装の詳細から、メッシュ内のIstioコンポーネントとサービスを隔離します。
仲介。Mixerにより、オペレーターはメッシュとインフラストラクチャバックエンド間のすべての相互作用をきめ細かく制御できます。
しかし、これらの純粋に機能的な側面を超えて、Mixerにはシステムに追加の利点をもたらす他の特性もあります。
Mixer:SLOブースター
MixerはSPOFであり、メッシュの停止につながる可能性があると主張するのに反して、実際にはメッシュの有効な可用性を向上させると考えています。それはどのように可能なのでしょうか?3つの基本的な特性が作用しています。
ステートレス性。Mixerは、独自の永続的なストレージを管理しないため、ステートレスです。
強化。Mixer自体は、非常に信頼性の高いコンポーネントとして設計されています。設計の意図は、個々のMixerインスタンスについて99.999%を超えるアップタイムを実現することです。
キャッシングとバッファリング。Mixerは、大量の一時的な一時的な状態を蓄積するように設計されています。
メッシュ内の各サービスインスタンスの横に存在するサイドカープロキシは、メモリ消費量の点で必ず節約する必要があります。これは、ローカルキャッシングとバッファリングの可能性のある量を制限します。しかし、Mixerは独立して存在し、はるかに大きなキャッシュと出力バッファを使用できます。したがって、Mixerはサイドカーの高度にスケールされた、高可用性の第2レベルキャッシュとして機能します。
Mixerの予想される可用性は、ほとんどのインフラストラクチャバックエンド(多くの場合、可用性は99.9%程度です)よりもはるかに高くなります。そのローカルキャッシュとバッファは、バックエンドが応答しなくなった場合でも動作を継続できるため、インフラストラクチャバックエンドの障害を隠すのに役立ちます。
Mixer:レイテンシ削減
前述のように、Istioサイドカーは一般的にかなり効果的な第1レベルのキャッシングを持っています。それらは、キャッシュからトラフィックの大部分を処理できます。Mixerははるかに大きな共有第2レベルキャッシュを提供し、Mixerがリクエストあたりの平均レイテンシの低下に貢献するのに役立ちます。
レイテンシを削減している間、Mixerはメッシュがインフラストラクチャバックエンドへの呼び出し数を本質的に削減しています。これらのバックエンドの支払い方法によっては、バックエンドへの有効なQPSを削減することで、コスト削減につながる可能性があります。
今後の作業
システムをさまざまな方法で改善する機会があります。
構成カナリア
Mixerは高度にスケールされるため、個々のインスタンスの障害には一般的に耐性があります。しかし、Mixerは、すべてのMixerインスタンスがほぼ同時にクラッシュする有毒な構成が展開された場合(はい、それは最悪な日になります)、カスケード障害の影響を受けやすいままです。このような事態を防ぐために、構成の変更は少数のMixerインスタンスにカナリア展開してから、より広範囲に展開できます。
Mixerはまだ構成の変更をカナリア展開していませんが、Istioの信頼性の高い構成配布に関する継続的な作業の一部として、これがオンラインになることを期待しています。
キャッシュチューニング
サイドカーとMixerのキャッシュのサイズを微調整していません。この作業は、最小限のリソースを使用して可能な限り最高の性能を達成することに重点を置きます。
キャッシュ共有
現時点では、各Mixerインスタンスは他のすべてのインスタンスとは独立して動作します。1つのMixerインスタンスによって処理されたリクエストは、別のインスタンスにキャッシュされたデータを利用しません。最終的には、memcachedやRedisなどの分散キャッシュを試して、はるかに大きなメッシュ全体の共有キャッシュを提供し、インフラストラクチャバックエンドへの呼び出し数をさらに削減します。
シャーディング
非常に大きなメッシュでは、Mixerへの負荷が大きくなる可能性があります。多数のMixerインスタンスがあり、それぞれが着信トラフィックを満たすためにキャッシュを準備しようと苦労しています。最終的には、Mixerインスタンスが特定のデータストリームの処理に少し特化して、キャッシュヒットの可能性を高めるようなインテリジェントなシャーディングを導入する予定です。言い換えれば、シャーディングは、任意の利用可能なMixerインスタンスにランダムにディスパッチするのではなく、関連するトラフィックを時間とともに同じMixerインスタンスにルーティングすることで、キャッシュ効率を向上させるのに役立ちます。
結論
Googleでの実践的な経験から、スリムなサイドカープロキシと大規模な共有キャッシング制御プレーン仲介者のモデルは、優れた認識された可用性とレイテンシを提供する最適なポイントに達することがわかりました。そこで得られた教訓を活かし、Istioでより洗練された効果的なキャッシング、プリフェッチ、バッファリング戦略を適用しました。また、キャッシュミスが発生した場合のオーバーヘッドを削減するために、通信プロトコルを最適化しました。
Mixerはまだ若い技術です。Istio 0.3の時点では、Mixer自体では本格的なパフォーマンス作業を行っていません。つまり、リクエストがサイドカーキャッシュにヒットしなかった場合、リクエストに応答するためにMixerで想定以上に多くの時間を費やしています。今後数か月で、同期事前条件チェックの場合にMixerが与えるオーバーヘッドを削減するために、多くの作業を行っています。
この記事によって、MixerがIstioにもたらす固有のメリットを理解していただければ幸いです。istio-policies-and-telemetry@にコメントや質問を投稿することを遠慮なく行ってください。