サービスの動的なルーティング方式のOpenResty

11、2019、およびクラウド共同OpenRestyコミュニティを撃ったが、全国ツアーOpenResty×オープン話しサロン武漢駅を組織し、彼らが共有する「OpenRestyダイナミックサービスルーティングスキームに基づいて、」作られたイベントで、クラウドチーフ説教を撃つことがあります。

OpenRestyは、交流を強化し、技術専門家OpenRestyシェアOpenResty戦闘経験を経験しOpenRestyユーザーを学習、OpenRestyは、オープンソースプロジェクトの発展を促進するオープン話しサロン全国ツアーは、彼らは、業界を招いて、クラウドコミュニティを撃つOpenRestyが主催してxは。活動は深セン、北京であり、武漢は、フォローアップは、上海、広州、杭州、他の都市のツアーで開催され続けます開催しました。

少ヤン海は、多くの年のためのLinuxシステムや組み込みシステム、高性能アーキテクチャ設計、インターネットに精通し、業界CDNアーキテクチャ設計、運用、保守、開発、チーム管理の経験を、ユン、チーフ説教者、運用・保守のディレクター、システムの運用・保守のシニアアーキテクトを、撃ちます、CDN加速、仮想化およびKVM研究OpenStackのクラウドプラットフォームは、現在、彼らは雲を撮影し、実際にコンテナとプライベートクラウドの仮想化技術に焦点を当てました。

以下は、フルテキストのシェアであります:

今日とソリューションベースのngx_luaをルーティング動的なサービスをご紹介し、それは、サービスのルートにおける大きな課題のコンテナコンテナコンポーネントの全過程で、彼らは自分のプログラムを達成するために、クラウドを通じて撮影し、安定しました3年ほどランニング。現在、このプログラムは、私たちは同じ問題に遭遇している従うならば、あなたはこのプログラムを直接使用することができ、オープンソースとなっています。

ゼロダウンタイム更新サービス

とき更新サービスは、どのように我々は、サービスがそれを低下し続けてみましょうことができますか?それが失敗したが許可されていないときに我々は、要求の更新に失敗する場合は失敗したので、あなたは、要求が口の中の単語でも良い、非常に小さく、事故を起こした場合は、お金を失うことであったとしても、クラウドサービスの更新を撮影してください。また、これは、当社のダイナミックサービスルーティングのための重要な理由です。

サービスルーティングは、次のとおりです。

  • 登録サービスは、明示的に提供するサービスを述べたテーブルに登録されたサービスの発見までで、サービスプロバイダを意味し、ポートは、IPは、名前やその他のサービスが何であるか、どのくらいです。
  • サービス発見は、それらを配置され、記録されているどのようなサービスを、ローカルサービスの一元管理です。
  • 同じコンテナの多くは、同じサービスを提供するため、負荷分散は、これらのコンテナでの負荷分散を行う方法を検討する必要があります。

サービスは、多くのプログラムを見つけましたが、自分のアプリケーションシナリオと言語が同じではありません。飼育係は、比較的古いオープンソースプロジェクトである比較的成熟しているが、資源の需要は比較的高く、我々が最初に使用するプログラムで、私たちの現在のカフカを含む、メッセージキューが飼育係に依存しており、etcdと領事は新星で、K8Sです依存etcd、依存しているetcdコンテナの配置;彼らは、部分的には、クラウドサービスの登録と発見の領事で撮影、それはワンストップステーションの技術である、展開、視覚化、メンテナンスおよび他の態様は、より便利で、それはKVをサポートするだけでなくストレージ、およびネイティブサービス監視、複数のデータセンター、DNS機能。

パフォーマンスが良くない場合は、ロードバランシング、多くのソリューションがあり、LVSは、それがさらに4階なので、LVSを追加することができ、元のネットワーク構造が、その拡張子を破壊しないであろう、完成前2における優位性を持っています非常に難しいです。HA_PROXYとnginxのは、HTTPヘッダ解析HA_PROXYがHA_PROXYは、おそらく約10%のCPUを占め、WAF HA_PROXYとして使用することができる、純粋な転送を行った場合、より少ないCPUを消費し、そしてフォワード占め20%のCPUを、実質的に純粋なnginxのヘッドを行う異なります-25%、しかしnginxのは、よりスケーラブルで、nginxのは前方に行うとのバランスTCP、UDP、HTTP 3つのプロトコルをロードしますが、HA_PROXYのみTCP、HTTPをサポートすることができます。最大の変化は、彼らはまた、K8S生態系を採用、それは開発が密接に機能の追加に相当しLUA、と統合続く、LuaのHA_PROXY再構成を使用されているということです。それはHTTP、スケーラビリティ、およびTCPのためのサポートをしているに焦点を当てたので、私たちのソリューションは、nginxのを選択することです。

上記のように、我々nginxの一つの図で領事。サービスを強調するために、ここでいくつかの関連性が低いとサービスが省略されています。我々はMesos、ドッカー、マラソンは、サービス管理を行ったベース。特別なサービスレジがあり、それはドッカーのAPI、領事へのコンテナの状態を報告するタイミングによって、ドッカーのAPIにより、物理マシンあたりの容器を再生します。私たちのサービスは現在、容器内部に直接nginxのに基づいているため、nginxのは、上記の、負荷分散を行います。

どのように領事nginxのへのサービス更新中

コンテナへのイトゥリ、nginxの目の前には、コンフィギュレーション・ファイルに登録されているサービスは問題ありませんが、問題は、領事はすべての情報を持っているとして、領事からnginxのに発生しますが、nginxのにそれを通知する方法についてのだろうか?新サービス、またはサービスハングアップ、情報領事を作る方法をnginxのに削除された問題で、これらのサービスを知っているし、リストに追加され、いくつかの新しいサービスを作成し、これは私たちが問題を解決したいものです。

ここでの問題は、nginxのへのサービス更新でどのように領事で、問題を解決した場合は、nginxの+領事+レジモデルが完了します。現在、この問題を解決するために多くの可能なソリューションがあります。

1、オプション1:Consul_template

サービスが変更キーでコンサルリスニング、スクリプトの実行をトリガする、サービスのこの機能を使用し、これが実行される最終的なスクリプトであり、事前に構成されたテンプレートに応じて構成を再生成します。

画像

図は、例えばテンプレート生成upstream.confあるK / vが実際の設定ファイルのテンプレートを生成し、変更し、ローカルコマンド、nginxのを実行した場合、それは、将来的にレンダリングされる変数の数が一つであります-sを見てリロードし、設定ファイルを再構築し、リロード、この新しいサービスが有効になります。

リロードコースもいくつかの欠点があります。

  • 頻繁にリロードした場合まず、性能の損失があるでしょう。
  • ときリロードが本当に完全な第二に、古い状態をシャットダウンする過程で、長い時間、接続が長い接続であれば、古いプロセスは、常にプロセスの途中になり、この時間は不明である、あなたは最終的には知りません。
  • 第三に、インプロセスキャッシュ無効化、我々はデータベース、ローカルキャッシュのすべてにいくつかのコードなので、すべて無効にキャッシュする情報の一部。
  • 最も重要な点は、設計の本来の意図と矛盾している、それはもともと彼らは奇妙な多くが発生する可能性があり後にゆがんで行く、ゆがんで行くのと同じドッカーと仮想マシンと同等のものを取るために、現在の要求には影響しません操作やメンテナンスを容易にするように設計されましたピットは、当時のように、このプログラムを使用していませんでした。

2、スキームII:スキーム内部NDS

DNSソリューションは、今のドメイン名に置き換え以前にサーバのIPアドレスとして、比較的一般的である限り、それはこの音のようなIPの数を解決するよう、完璧だった、と領事自体がDNSをサポートしています我々はうまくドメインにこのID限り、追加のDNSを維持する必要はありません。

しかし、我々は、理由にもリロードを行う可能性がありますDNSプログラムの使用を感じます

  • まず、多層DNS解決時には、追加の処理時間を加算します。
  • すぐにあなたは、この問題を軽減する必要がある場合、キャッシュが短すぎる設定されていることが不可欠ですが、その数は解決だろう、問題のマシンを切断し、テーブルをキャッシュする方法がないため、主な理由です第二に、DNSキャッシュ、もっと。
  • 第三に、ポート番号は、あなたが同じことを行うことができますドッカーで、一般的に、同じポートを物理マシンの設定を変更しますが、ネットワークのいくつかは、このようないくつかの強力なCPUアプリケーションなどの非常に敏感なアプリケーションではないため、我々は、コンテナのネットワークを指示しますブリッジを介して接続され、この時間は、ポートがランダムに割り当てられ、異なるので、実行不可能である各コンテナに割り当てることができます。

私たちがしたいことは、動的にnginxの上流のサービスのリストを変更するためにHTTPインターフェースを介して行われ、我々はngx_http_dyups_moduleと呼ばれる既製のソリューションを、見つけました。

3.オプションIII:ngx_http_dyups_module

ngx_http_dyups_module現在GET情報の一部で照会するインタフェースすることができ、POSTは、上流に更新することができ、またを通じて上流削除します。

図は、3つの要求があることを例です。

  • リクエストを送信するために最初に、サービスポート8080の後、任意のバックは、上流のサービスを発見したので、それは502ではありません。
  • 第二に、2カールによってサービス要求アドレスがミックスに追加します。
  • すでに第2のサービスは、ミックスに追加するので、これは通常の出力であるため、第三に、再訪問は、第3の命令との最初の命令は、まったく同じです。

このプロセスでは、そこにはどんな操作リロードされていない、また設定を変更する、それが機能を完了しました。

このモジュールは非常によく書かれているが、我々はそれにいくつかの時間を過ごした後、それが悪いわけではない主な理由は、私たちは自分の状況のいくつかを組み合わせて、いくつかの問題が見つかりました:

  • まず、nginxの独自の負荷分散アルゴリズムに依存につながります。私たちの内部使用は多くを書くNgx_lua場合は、このモジュールを使用した後、それ自体、いくつかの負荷分散アルゴリズムである、Cモジ​​ュール上の私たちは非常に依存つながる、我々はそのように「ローカル優先」の優先アクセスとして私たち自身の独自のニーズを持っています機械サービスは、これは、これらのことを行うならば、我々はCのコードを変更します、むしろ奇妙な負荷分散を鳴らします。
  • 第二に、二次低開発効率、開発効率がLuaのCから離れています。
  • 第三に、純粋なLuaのプログラムを使用することはできません、我々はプロジェクトがラインで使用することができ、好ましくは、他のアイテムを使用することができ、そのようなプログラムを持っていません。

動的な負荷分散のプロパティSlardar

これらの理由から、私たちは自分の車を構築し始めました。

画像

このホイールは、次の4つの部分があります。

  • 最初の部分は、私たちがネイティブ命令の一部を使用して戦略を再試行することを願って、nginxのの最も基本的なものです。
  • 第二の部分は、Luaのモジュールです。
  • 第三部は、これは上流の動的な管理を実現するために、LUA管理モジュールの私たちのバージョンである、lua_resty_checkupsあり、このモジュールは機能の約30%を実装していますが、いくつかの積極的な健康診断があり、それはおそらく、コード1500の量であります行について、Cモジュールは、少なくとも10,000行があると推定場合。
  • 第四の部分は、nginxのに要求を処理する際に使用してはならない、LuaSocketあります。

1、LUA-resty-検診

このテンプレートlua_resty_checkups簡単な紹介は、それはいくつかの機能があります。

  • まず、共有メモリに基づく動的上流の管理は、作業者間の同期を達成します。
  • 第二に、受動的なヘルスチェックは、これはnginxの独自の特徴です。
  • 第三に、ヘルスチェックが有効になっている、このモジュールは、バックエンドサービスをチェックし、一回15秒の髪のためにタイムアウトすることができ、心拍バックエンドパッケージを送信するためのイニシアチブを取ることは生きていないです。我々はまた、このようなハートビートパケットサービスが生きている検出heratbeat上り送信のタイミングとして、いくつかの個人的な検査を持つことができます。
  • 第四に、ローカル優先ネットワークトラフィックを保存することができ、負荷分散アルゴリズムです。

2、サービスの差別化

画像

DiffServのホストでは:髪には2つのカールに同じアドレス上の図の例では、両者の間に同じではありません。

3、要求プロセス

三つの部分に分割することができる要求の下で簡単なプロセスは、トップコードは、対応するリスト、プロキシサーバに要求を見つけることによる作業者のホストを実行する、作業者がコードを読み込み、要求を受信して​​います。

4、動的上流更新

これは、HTTPインタフェースを介して、Cモジュールと上流のと同じように、動的に更新されたリストをdyups、プラスあなただけの管理ページでの2つのサービスの後にリストに追加さ見ることができ、ここでサーバアドレスがあるだろう、ヘルスチェックメッセージの一部、ステータス変更時間は、それが失敗した回数は、レコードの図は、積極的な健康チェックです。

画像

なぜ積極的な健康それを確認?私は通常使用してサービスを知ることができ、要求は問題ではありません前にいくつかの受動的なヘルスチェック要求は、送信された私たちは失敗を知っている前に、行くハートビートパケットをチェックするためのイニシアチブを取るために失敗した後に発行されていることです。

図5に示すように、動荷重LUA

ゲームは頻繁に使用されるとき、動的負荷LUAが行います。プログラムのバックエンドを行うには、いくつかのLuaのコードを実行したプログラムを起動して、このような小さな調整と互換性の変換パラメータを変更することを望んでいないんので、私は可能性があるため、彼らは、最初にすべてのあなたがリクエストを書き換えるために行うことができ、実行する前のルートを取りました要求全体を取得するには、リクエストボディは、それがどんなことを行うことができます。

また、我々はまた、チェックするためにいくつかの簡単なパラメータの操作を行い、いくつかの権限と組み合わせて制御することができます。私達の統計によると、我々は実行するために、これらの再三の要求が不要な消費がある場合、我々は戻って304になり、直接使用することができる前の、以前の結果と同じ結果を示し、少なくとも10%の再送要求を持っています。304を戻しながら、我々は、バックエンドのサービスを決定する必要がある場合は、全体の要求は、それがバックに作ることができない、これはすでに帯域幅を節約され、数を増やすために、ネットワークの等価帯域幅を閉鎖した後、髪を戻ります。

画像

削除操作は、それがどのような機能次に、このコードによって、この操作うち直ちに禁止することができ403、返された場合、コードSlardarは、それが実行する、内側に押されている場合、これは、ロードする動的負荷の一例ですそれは?あなたは機能を行うことができます想像することができ、このプロセスは、コードがロードされている場合、あなたはステータスページからその情報を見ることができ、動的です。

Slardarを達成するための動的負荷分散

Slardar特性が短い実装工程に続いて、以前に記載されており、三つの部分の全ダイナミックアップストリーム管理、ロードバランシング、および動的なコードローディングLUA。

1、動的上流管理

領事、サービスからluasocketすることにより、負荷スタートアップコンフィギュレーションファイルあなただけ、どのようにあなたがどれだけ出て知ったときにハングアップし、その後、ハングアップする理由はありませんか?ですから、これらの事を治すための方法を持っている必要があり、私たちは領事を選んだので、領事、上流の更新指示を受け、ポート管理をリッスンするように開始した後、だけでなく、タイマーを起動するときには、最初からタイマーをロードする必要があります行うには、作業者間の同期、更新されていない共有メモリのタイミングを見て、最新情報は内部の自分の作業員に同期させることができます。

これは、更新は、このに入ります一度ちょうどそれらの労働者の負荷を持って、タイマーの別の部分が、開始された初期化されているワーカープロセスにフォークを完了した後、領事をロードするために非常に最初から、簡単なフローチャートです。内部。

2、ロード・バランシング

負荷分散balance_by_lua_の私たちの主な用途は、ちょうど同様のを持って、コンフィギュレーション・ファイルのアドレスを書き込むことがここにあるように、要求は、ここに送信するリクエストの上流のCモジュールを介して来ました。balance_by_lua_のことで命令を、私たちは、あなたがこの文書のLUAのLUAを選択するために、コードを使用することができ、このファイルにそれをブロックします、これは自己検診の選択プロセスです。

この図は、私たちのモジュールをcheckups.select_peer、あなたは下の部分、時間の初めに見ることができ、大まかなプロセスであり、現在のピア・ホストに応じて、その後、LUA制御を実現した、行くことに飛び出しました。上部には、このフィードバックに述べるに失敗した場合、それが成功したか失敗であることを知っていることです。

3、動的負荷LUA

これは、主に3つの機能、すなわちロードファイル、loadStringはとsetfenv LUA使用されています。ロードファイルは、ローカルコードLUAロードされたHTTPリクエストボディ領事や負荷コードからloadStringは、これらの三つの機能が提供するsetfenvコード実行環境をロードすることができますされ、実際の具体的な詳細は、ここでは説明しません。

図4に示すように、動的負荷分散Slardar利点

私たちは、ホイールを作った理由は、主に使用LUA-resty-健診・モジュールとbalance_by_lua_の*ですが、それは次のような利点があります。

  • Luaは、純粋な達成のメンテナンス負担を軽減し、サードパーティ製のCモジュールなので、高効率の二次開発に依存しません。
  • あなたはnginxのネイティブPROXY_を使用することができ、我々は唯一のそれはnginxのネイティブPROXY_を使用できるようにピア選挙は、直接nginxの独自の指示を行ってデータの発展の段階を終えた後に行われた選挙ピア要求の段階にあるため、命令を。
  • それは純粋なLuaのプログラムとCプログラムを満たすことができるほぼすべてのngx_luaプロジェクトに適しています。

サービスでのマイクロアーキテクチャでは、何をすべきかSlardar

また、以前にマイクロサービスモードに変換するサービスの一部を入れています。どのくらいの拡張ニーズに応じて、マイクロサービスが実際に小さなサービスに分割し、より大きなサービスから誘導され、それは、移行と同じ展開ではありません、サービスのマイクロ拡張の拡張は、それの一部だけことができます。

我々は今、プログラムしようとしている、このプログラムは、我々が背景地図は、造園、サムネイル、透かしとして、この機能を描くの多くを行うために必要としなければならないということであるあなたがサービスを最適化する計画を作りたい場合は、非常に困難である、なぜならそれはあまりにも多くを備えて、我々はマイクロサービスにそれを破る場合は、上記の点線のように、同じではありません、これはここではマイクロゲートウェイサービスは、いくつかの小さなサービスですで、私たちの現在のサービスです。例えば、造園、その操作が複雑で、より多くのCPUの消費量、我々は間違いなく良いマシンにいくつかのCPUを選択します。GPUは、サムネイルをどうする、このパフォーマンスは数倍に増加することができ、最後に遵法を把握んが、それ十分ないくつかの一般的な。

そこのサービスがライン上で使用できることを確実にするために、できるだけ長く、いくつかのより多くの悪徳は、そのような勾配、マイクロを通じてルーティングサービスは前に、私たちはサービスの裏に応じて区別され、そのパラメータは、3つの小さなサービスに分割します、これは図の三つのステップで完全なサービスを作ることができます。

もちろん、私たちは実際にこのプログラムを試し、こうした絵の真ん中に、ネットワークの帯域幅は、増加することがバインドされている今、3になって、行うことができますプログラムを使用していたサービスなど、多くの問題が存在するがに向けるためのガイドになることです、これは、どのようにそれを行うには?我々は今、そのが行われ、方法はいくつかのローカル優先スケジューリングポリシーを行うことであると考え、地元の透かしの数がありますが、それは地元での優先順位です。

最後に、マスターの言葉を適用します。トークショーミーコードで、安いです現在、我々はSladarオープンソースプロジェクトがあり、プロジェクトのアドレスは以下の通りですgithub.com/upyun/slard ...  。

ビデオと音声PPT:

サービスの動的なルーティング方式のOpenResty

おすすめ

転載: juejin.im/post/5ceca6186fb9a07eeb13886b