ソリューション

マクニカネットワークスが取り扱う製品で、皆様の課題を解決します

Web2.0アプリケーションの負荷軽減機能、その実力を検証!Citrix NetScaler 新機能「Web2.0Push」

マクニカラボ便り

「マクニカラボ便り」は、ちょっとやってみたい検証や、このテクノロジー、こう使ってみたらどうなる?など、マクニカネットワークスのエンジニアが気になった製品や技術について、ディープな検証や評価を行い、面白かったら皆さんにも公開しようという、ちょっと気まぐれなコーナーです。

第二回のチャレンジとして取り上げるのは、Webサーバの負荷軽減や可用性、セキュリティの向上を実現するWebアプリケーションスイッチCitrix NetScaler。新たに追加されたサーバの負荷軽減機能「Web2.0 Push」がどのように動作するのか、設定手順を追いながら実際に動かしてみたいと思います。

By 中本 光一
Macnica Networks Corp.

【今回のチャレンジ】

Web2.0アプリの負荷軽減に挑戦。「Web 2.0Push」機能を検証!

日々進化を続けるWebアプリケーション。Web2.0アプリケーションと呼ばれる、Ajaxなどの技術を使ったアプリケーションでは、クライアント側からだけでなくサーバ側からもデータを送信することがあります。この技術を使用したアプリケーションではクライアント側の操作に依存することなく、サーバ側から非同期に更新情報が送信されます。しかしその反面、クライアント側とサーバ側はコネクションを張りっぱなしにしておく必要があり、アプリケーションによってはこの時間が長時間になることも。結果として、大量のサーバリソースが消費されてしまいます。

Citrix NetScalerの負荷軽減機能「Web 2.0Push」は、このようなサーバリソースを大量に消費するWeb2.0アプリケーションを実装したサーバの負荷軽減を実現しました。Citrix NetScalerにしかできないというこの新機能、実力のほどはどうなのか?従来のロードバランサーでは実現できなかった新たな負荷軽減機能を検証します!

「Web2.0Push」機能が有効な環境とは?

非同期でコンテンツを更新するWeb2.0アプリケーションには大きく2種類の更新方法があります。一つはClient Pull型と呼ばれるものです。例えば、チャットなどのアプリケーションの場合、複数のクライアントがアプリケーションに更新をかけますので、定期的にサーバにアクセスを行い最新のチャット情報を取得する必要があります。このようなクライアントからの定期的なアクセスによって情報を更新するアプリケーションがClient Pull型です。

Client Pull型とは逆に、Webアプリケーションが主導的に情報を送り込む動作がServer Push型です。Server Push型では最新の情報をえるために、クライアント側からの定期的なアクセスは行いません。クライアント側はサーバ側にリクエストを発行しますが、そのリクエストを受け取ったサーバはすぐにレスポンを返さず、サーバ側でチャットの書き込みなどの更新イベントが発生したタイミングでクライアント側からのリクエストに対するレスポンスを返します。サーバ側でのイベントをきっかけに更新情報を送信できるため、よりリアルタイムに情報を送信することができますが、サーバが多くのTCPコネクションを長時間に渡ってクライアントと維持しなければならず、サーバのリソースが大量に割かれることもあります。

「Web2.0Push」機能は、このようなServer Push型のアプリケーション通信が行われている環境に対して有効です。クライアントとNetScaler間のTCPコネクションは通常通り開きっぱなしにし、NetScalerとサーバ間のコネクションをこまめに切断してあげることで、サーバで管理するTCPコネクションの数を大幅に削減し、サーバの負荷を軽減します。

具体的には、チャットや株式情報などをリアルタイムに表示するServer Push型のアプリケーションなどに「Web2.0 Push」機能を使用することで、高いリアルタイム性とサーバ負荷の軽減を両立することができます。

用意するもの

実験に必要な環境

  • NetScaler Ver9.0 Build67.7以降のファーム(Enterprise Edition またはPlatinum Edition)、仮想環境で動作するNetScaler VPXでも可
  • チャットアプリケーションを実装したサーバ

※「Web2.0 Push」機能対応のため、アプリケーション側でセッション管理のためのラベル割り当てや、サーバ側での情報の更新をPostで送信する仕組みを実装する必要があります。今回は自作しました。

「Web2.0Push」機能による負荷軽減を試してみよう!

ステップ1. NetScalerの機能有効化

NetScalerの「Load Baranshing」機能と「Web2.0 Push」機能を有効にします。
管理用WebUIよりNetScalerにログインし、画面左より「System」⇒「Settings」を選択し、画面中央の「Change basic feature」をクリックし、「Load Baranshing」にチェックを入れて「Load Baranshing」機能を有効にします。

次に画面左より「System」⇒「Settings」を選択し、画面中央の「Change advanced feature」をクリックし、「Netscaler Push」にチェックを入れて「Web2.0 Push」機能を有効にします。

ステップ2. ServerとServiceの追加

「Web2.0 Push」機能により、負荷の軽減を行うサーバとサービスを設定します。
まず、サーバを設定するため管理用WebUIの画面左より「Load Balancing」⇒「Servers」を選択し、画面下部の「Add」ボタンをクリックして、名前、IPアドレスを入力してサーバを設定します。

サービスが設定されると以下の様に表示されます。

次に登録したサーバ上で実装されているサービスを設定します。
管理用WebUIの画面左より「Load Balancing」⇒「Services」を選択し、画面下部の「Add」ボタンをクリックします。該当のサーバに先程登録したサーバを選択し、名前、ポート番号、プロトコル(ここではHTTPを選択)を入力し、サービスを設定します。

サービスが設定されると以下の様に表示されます。

ステップ3. Push vserverの設定

ステップ2までは通常のロードバランシングの設定でも同様となりますが、ここからが「Web2.0Push」機能設定のポイントとなります。サーバの負荷を低減するための仕組みであるPush vserverを設定します。
管理用WebUIの画面左より「Load Balancing」⇒「VirtualServers」を選択し、画面下の「Add」ボタンをクリックします。名前、IPアドレス、ポート番号を入力し、プロトコルにPUSH またはSSL_PUSHを選択(ここではPUSHを選択)してPush vserverを設定します。

Push vserverが設定されると以下の様に表示されます。


ステップ4. Vserverの設定とPush vserverとの連携

クライアントのアクセス先となる、NetScalerのバーチャルサーバを設定します。
管理用WebUIの画面左より「Load Balancing」⇒「VirtualServers」を選択し、画面下のAddボタンをクリックします。サービスにステップ2で設定したサービスを選択し、名前、IPアドレス、ポート番号やプロトコルを入力します。

次にAdvancedタブを選択し、Push機能の有効化とセッションの管理を行うラベルを設定します。まずPushにチェックを入れPush機能を有効にし、Push vserverにステップ3で設定したサーバを選択します。そして、ラベルを設定するため、「configure」をクリックします。

今回は“NSSERVERLABEL”という名前のラベルを以下の様に設定しました。このラベル情報に基づいて、更新イベントなどが発生したサーバからpushされた情報を正しくクライアントに届けることができるようになります。

ラベルを設定すると以下の様に表示されます。

これで「Web2.0Push」機能の設定は終了です。

ステップ5. パケットフローにて実際の挙動を確認

NetScalerは通信の確認や障害時の対応が行いやすいように、筐体にてパケットキャプチャを実施することが可能です。NetScalerで負荷軽減を実施した場合には実際にどのようにトラフックが流れ、負荷の低減が行われているのか確認してみましょう。

まず、管理用WebUIよりNetScalerにログインし、画面左より「System」⇒「Diagnostics」を選択し、画面中央の「Start new trace」をクリックし、パラメータを入力して、パケットキャプチャを開始します。

キャプチャ中にクライアントからNetScalerを介してチャットのアプリケーションにアクセスを行います。その後、管理用WebUIよりNetScalerにログインし、画面左より「System」⇒「Diagnostics」を選択し、画面中央の「Download trace files」をクリックし、キャプチャデータを取得します。

では、キャプチャしたデータを通信の流れに沿って見ていきます。まず、クライアントからNetScalerのVserverへリクエストがあった場合、NetScalerはSNIP(サーバへのアクセス基IPとなるNetScalerの仮想IP)より、サーバにアクセスします。この際に、非同期にサーバから返される通信はPush vserverに返すよう通知します。その返答として、サーバからはPush vserverに情報を送る際に使用されるラベルの情報が送信され、NetScalerはVserverよりそのラベルの情報をクライアントに通知します。
クライアントには通信は以下の様に見えています。

     172.16.96.21:クライアント
172.16.96.100:Vserver

NetScalerのVserverとクライアントはコネクションを維持したままですが、ここでNetScalerのSNIPとサーバはコネクションを切断します。

その後、サーバはイベント(ここではチャットの書き込み)を検知した際に、NetScalerのPush vserverとコネクションを新規に張り、Postを送信します。

172.16.96.71:チャットサーバ

172.16.96.90:push vserver

サーバからのPostを受けっとったNetScalerはVserverよりその情報をクライアントに通知し、Push vserverよりサーバへ通信の成功の有無などの情報を返します。

通信終了後、Push vserverとサーバのコネクションを切断することで、サーバ負荷を軽減します。

Push vserverとサーバのコネクションの維持時間は以下の手順で調整することが可能です。管理用WebUIの画面左より「Load Balancing」⇒「VirtualServers」を選択し、設定済みのPush vserverを選択して、画面下のOpenボタンをクリックします。

表示画面で、Client Time-outに変更したいセッションの維持時間を入力します。最後にOKボタンをクリックすればセッション維持時間の変更は完了です。

WebアプリケーションスイッチCitrix NetScalerの「Web2.0Push」機能を検証してみましたがいかがでしたでしょうか。現在Server Push型のWeb2.0アプリケーションに対応した負荷軽減機能はCitrix NetScalerのみで実装されており、他のどのWebアプリケーションスイッチも持っていない機能です。
日々進化を続けるWebアプリケーションに適応して、NetScalerも日々進化を続けています。今後もNetScalerの進化にご期待ください。


中本 光一

マクニカネットワークス ソリューション技術統括部 Citrix NetScaler担当エンジニア。Webアプリケーションセキュリティに対する造詣があり、NetScalerの技術サポートを中心に提案構築なども行っている。

いつか見た景色 from Staff's Albums