OpenResty Edge は、stream レイヤーの TCP サービスのロードバランシングを、すべて Admin コンソール上で行います——stream{} ブロックも、upstreamproxy_pass ディレクティブも、nginx 設定の編集やリロードも不要です。TCP(stream)アプリケーションを作成し、それをバックエンドサーバーのアップストリームに向けるだけで、OpenResty Edge がゲートウェイネットワーク全体でその接続をプロキシします。本チュートリアルでは、ポート 3307 の MySQL サーバーをプロキシし、Edge ノード経由で接続して動作を確認します。詳しい完全な手順については、YouTube の動画チュートリアルをご覧ください。

これは SNI Proxy アプリケーションタイプで使われているものと同じ stream レイヤーのプロキシ機構です。

OpenResty Edge が TCP 接続をバックエンドサーバーへリバースプロキシする構成図

OpenResty Edge で TCP(Stream)アプリケーションを作成する

OpenResty Edge の Admin Web コンソールに移動しましょう。これは私たちのコンソールのサンプルデプロイメントです。各ユーザーには独自のローカルデプロイメントがあります。

OpenResty Edge Admin Web コンソールのホームページ

今回は Stream タイプのアプリケーションを作成します。Stream アプリケーションリストページに移動し、新しいアプリケーションを作成します。

OpenResty Edge Admin コンソールの Stream アプリケーションリストページ

Stream アプリケーションには 2 種類あることがわかります:SNI Proxy アプリケーションと TCP アプリケーションです。

OpenResty Edge が提供する 2 種類の Stream アプリケーション:SNI Proxy と TCP

今日のテーマは TCP アプリケーションです。

OpenResty Edge でハイライトされた TCP Stream アプリケーションタイプ

SNI Proxy アプリケーションは別のチュートリアルで取り上げます。

OpenResty Edge の SNI Proxy Stream アプリケーションタイプ

TCP タイプを選択します。

新しい Stream アプリケーションに TCP タイプを選択する

このアプリケーション用のポートを指定する必要があります。

OpenResty Edge で新しい TCP アプリケーションのポートフィールド

まず、このポートを default パーティションに追加する必要があります。

TCP アプリケーションのポートを追加する必要があるパーティションリスト

default パーティションの編集をクリックし、新しいポートを追加して、ポート番号として 3307 を入力します。

TCP アプリケーションにポート番号 3307 を入力する

ポートタイプを TCP に設定します。

パーティションエディターでポートタイプを TCP に設定する

保存すると、新しいポートが default パーティションに追加され、その変更はゲートウェイネットワーク全体に自動的に公開されます。

TCP ポート 3307 が OpenResty Edge の default パーティションに追加された

新しいアプリケーションのダイアログに戻り、先ほど追加したポートを入力して、このアプリケーションを作成します。

パーティションに追加した後、TCP アプリケーションにポート 3307 を入力する

TCP ロードバランシングのためのアップストリームとページルールを追加する

Upstreams ページに移動します。

OpenResty Edge の TCP アプリケーションの Upstream ページ

バックエンドサーバー用の新しいアップストリームを作成し、名前を付けます。例えば、tcp_backend とします。

OpenResty Edge で TCP アップストリームに tcp_backend と名前を付ける

ここにバックエンドサーバーの IP アドレスを入力する必要があります。

アップストリームエディターのバックエンドサーバーの IP アドレスフィールド

この IP アドレスに MySQL サーバーを準備しています。直接接続すると、アクセス可能であることが確認できます。

バックエンドの MySQL サーバーが select 1 の結果を返し、直接アクセス可能であることを確認

これでバックエンドサーバーのホストフィールドを入力できます。

TCP アップストリームにバックエンドの MySQL サーバーのホストを入力する

ポート番号 3307 を入力します。

tcp_backend アップストリームにバックエンドポート 3307 を入力する

将来的には、このアップストリームにさらに多くのサーバーを追加する可能性があります。

ロードバランシングのために TCP アップストリームにさらにバックエンドサーバーを追加できる

このアップストリームを保存します。tcp_backend アップストリームがリストに表示されました。

OpenResty Edge にリストされた tcp_backend アップストリーム

次に、このアップストリームを使用する新しいページルールを作成します。

TCP アプリケーションの新しいページルール作成ボタン

プロキシターゲットを追加します。

TCP ページルールにプロキシターゲットを追加する

先ほど作成したアップストリームを選択します。

tcp_backend アップストリームをプロキシターゲットとして選択する

tcp_backend アップストリームがページルールのプロキシターゲットに設定された

複数のバランシング戦略から選択できます。アップストリームにサーバーが 1 つしかないため、バランシング戦略はそれほど重要ではありません——デフォルトの round-robin 戦略のままで構いません。

OpenResty Edge のページルールにおける TCP ロードバランシング戦略の選択肢、round-robin のまま

このページルールを作成します。

TCP プロキシページルールの作成ボタン

ページルールリストに新しく作成されたプロキシページルールが表示されます。

ページルールリストに新しく作成された TCP プロキシページルール

最後のステップは、新しい設定の公開です。先ほどの変更をすべてのゲートウェイサーバーにプッシュします。

OpenResty Edge Admin コンソールの新しいリリースボタン

リリースします!

TCP 設定のプッシュを確認するリリースボタン

変更がすべてのゲートウェイサーバーに同期されました。このサンプルデプロイメントでは、ゲートウェイネットワークに 14 台のサーバーがあることがわかります。

TCP 設定が 14 台のゲートウェイサーバーに同期された

ネットワーク全体で増分の設定同期を行い、リクエストの粒度でリアルタイムに設定を更新しています。アプリケーションレベルの設定変更はすべて、サーバーのリロード、再起動、またはバイナリアップグレードを必要としません。そのため、多くの異なるユーザーが頻繁に公開を行っても、非常にスケーラブルです。

サーバーのリロードや再起動なしのリクエスト粒度のリアルタイム設定更新

TCP プロキシのテスト:Edge ノード経由で MySQL に接続する

クラスターごとにグループ化されたすべてのゲートウェイサーバーを見てみると、アメリカにあるノードがあり、その IP アドレスは 226 で終わっています。このノードを使用して、先ほど追加したプロキシをテストします。

IP アドレスが 226 で終わるアメリカの Edge ノード

では、MySQL クライアントをその Edge ノードのポート 3307 に——ノードの IP をホストとして使って——接続し、select クエリを実行します。

OpenResty Edge の TCP プロキシ経由でポート 3307 の MySQL に対して SELECT クエリを実行する

予想通り、プロキシは正常に機能しています!select クエリが Edge ノード経由で結果を返しており、バックエンドに直接アクセスしているかのように MySQL バックエンドにアクセスできます。

select 1 の結果が OpenResty Edge の TCP プロキシ経由で返り、MySQL バックエンドに到達可能であることを確認

よくある質問

nginx 設定を編集せずに TCP をロードバランシングするには?

OpenResty Edge では、Admin コンソールで TCP(stream)アプリケーションを作成し、バックエンドサーバーのアップストリームを追加し、それにプロキシするページルールを紐付けます——stream{} ブロック、upstream 定義、proxy_pass ディレクティブを手で書くことはありません。変更をリリースすると、リロード・再起動・バイナリアップグレードなしで、すべてのゲートウェイサーバーにプッシュされます。

OpenResty Edge を通して MySQL データベースをプロキシできますか?

はい。本チュートリアルではバックエンドはポート 3307 で待ち受ける MySQL サーバーで、OpenResty Edge がそこへ TCP 接続をプロキシします。リリース後、MySQL クライアントを Edge ノードのポート 3307 に接続すると、バックエンドに直接接続したのとまったく同じようにデータベースに到達できます。

TCP アプリケーションと SNI Proxy アプリケーションの違いは何ですか?

どちらも OpenResty Edge の stream アプリケーションです。TCP アプリケーションは、本文で示したように、指定したポートで生の TCP 接続をプロキシします。SNI Proxy アプリケーションは、ハンドシェイク内の SNI ホスト名によって TLS トラフィックをルーティングします。これは SNI Proxy アプリケーションのチュートリアルで取り上げています。

TCP アップストリームは複数のバックエンドサーバーを持てますか?

はい。本チュートリアルのアップストリームはサーバーが 1 つなのでバランシング戦略は問題になりませんが、さらにサーバーを追加し、round-robin などのバランシング戦略を選択できます。

OpenResty Edge について

OpenResty Edge は、マイクロサービスと分散トラフィックアーキテクチャ向けに設計された多機能ゲートウェイソフトウェアで、当社が独自に開発しました。トラフィック管理、プライベート CDN 構築、API ゲートウェイ、セキュリティ保護などの機能を統合し、現代のアプリケーションの構築、管理、保護を容易にします。OpenResty Edge は業界をリードする性能と拡張性を持ち、高同時接続・高負荷シナリオの厳しい要求を満たすことができます。K8s などのコンテナアプリケーショントラフィックのスケジューリングをサポートし、大量のドメイン名を管理できるため、大規模ウェブサイトや複雑なアプリケーションのニーズを容易に満たすことができます。

著者について

章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。

章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty Edge(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

英文版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!