LVS での永続処理

このページは やっかいな接続アプリケーション(http cookie, https, ftp など)のLVS での永続処理について説明します。

はじめに

他のドキュメントで議論してきた LVS クラスターで、互いのコネクションが過去、現在、未来の分担を独立してサーバーに分担させるために、私たちは互いのネットワークコネクションが他のすべてのコネクションと独立であると仮定してきた。しかしながら、同じクライアントからの2つのコネクションは機能的かパフォーマンスを理由に同じサーバーに接続されなければならない時もある。

FTPは接続の機能的な条件の代表的な例だ。クライアントは2つのコネクションを確立させる。1つはコマンドインフォメーションを交換するコントロールコネクション(ポート21番)、もう1つはバルクデータを転送するデータコネクション(ポート番号20)だ。アクティブなFTPでは、クライアントがサーバーに listen しているポートやデータコネクションがサーバーのポート番号20番とクライアントのポートから始められたことを通知する。ロードバランサーはクライアントが listen しているポート番号のクライアントからくるパケットを調べ、データコネクションのハッシュテーブルのエントリに追加する。しかし、パッシブなFTPの場合、サーバーはクライアントに listen しているポート番号を伝え、クライアントはデータコネクション接続をそのポートで始める。LVS トンネリング、ダイレクトルーティングの場合、ロードバランサーはクライアントからサーバーへの半分のコネクションだけなのでロードバランサーはクライアントに直接いくパケットからのポートを得ることができない。

SSLは与えられたクライアントと特定のサーバー間のコネクションをもつプロトコルの例だ。SSL コネクションが作られると安全な WEB サーバーの443番ポートと安全なメールサーバーの465番ポートと接続キーが選択され交換されなければならない。同じクライアントからの前のコネクションは SSL キーの寿命の間サーバーによって与えられる。

永続的なポート解決法

私たちの現在のコネクションの解決法は LVS に永続的なポート機能を追加することだ。永続的なポートではクライアントが最初にサービスにアクセスすると、ロードバランサーは与えられたクライアントと選ばれたサーバーの間でコネクションのテンプレートを作ることができ、ハッシュテーブルにコネクションのエントリーを作ることができる。 テンプレートが設定した時間で終了し、テンプレートはすべてのコネクションが終了するまで終了しない。クライアントからのポートコネクションはテンプレートが終了する前にサーバーに送られる。永続的なテンプレートのタイムアウトはユーザーによって設定できデフォルトで300秒に設定されている。

これには永続的なポート機能の実装について書かれています。永続的な FTP サービスのテンプレートのフォームは <cip, 0, vip, 0, rip, 0> のようになっており、cip はクライアントのIPアドレス、vip はバーチャルIPアドレス、rip はリアルサーバーのIPアドレスです。そして適当なポートで FTP データコネクションが捕らえられる。他の永続的なサービスではテンプレートのフォームは <cip, 0, vip, vport, rip, rport> のようになっていて、それは同じ永続的なサービスのクライアントからのコネクションは同じサーバーに送られるだろうが異なる永続的なサービスは異なるところに送られるようになっている。

永続的なポートはサーバー間でわずかなロードインバランスを招くかもしれないが、コネクションアフィニティに関して良い解決法といえる。

永続的なグラニュラリティ

デフォルトでの永続的なポート機能はクライアントごとの永続的なグラニュラリティを仮定してきた。しかしながら、これはクライアントごとよりも大きい永続的なグラニュラリティを必要とするアプリケーションだ。例えば、LVS クラスター上で永続的なサービスを構築したいとする。しかしいくつかの ISP は永続的でないプロキシサーバーを使っていたとする。これは同じクライアントからのコネクションは異なるプロキシサーバーに送られることを意味している。デフォルトではロードバランサーは異なるクライアントから処理し、異なるサーバーに送り、永続的でないプロキシサーバーを通ったクライアントは永続的なサービスにアクセスできない。

これはこの問題を解くためにいくつかの推測をした。私たちは永続的でないプロキシサーバーはしばしば同じネットワークにあることを仮定した。例えば、ネットワークのネットマスクは 255.255.255.0 のように。私たちは永続的なネットマスクは永続的なサービスに追加する。クライアントの発信元アドレスはテンプレートを作ったりアクセスしたりする目的でこのネットワークを使って隠される。そして永続的なネットマスクにあるすべてのクライアントは同じサーバーにアクセスする。デフォルトの永続的なマスクは 255.255.255.255 で、これはクライアントごとの永続的なグラニュラリティということを意味している。

次のものは永続性に関係ある設定例です。

1. NAT を経由した LVS の面倒な http 設定例

ipvsadm -A -t virtualdomain:www -p
ipvsadm -a -t virtualdomain:www -R 192.168.1.2 -m
ipvsadm -a -t virtualdomain:www -R 192.168.1.3 -m
ipvsadm -a -t virtualdomain:www -R 192.168.1.4 -m

2. NAT を経由した LVS の FTP の設定例

ipvsadm -A -t virtualdomain:ftp -p 540
ipvsadm -a -t virtualdomain:ftp -R 192.168.1.2 -m
ipvsadm -a -t virtualdomain:ftp -R 192.168.1.3 -m
ipvsadm -a -t virtualdomain:ftp -R 192.168.1.4 -m

3. トンネリングを経由した LVS の面倒な http の設定例

ipvsadm -A -t virtualdomain:www -p
ipvsadm -a -t virtualdomain:www -R 192.168.1.2 -i
ipvsadm -a -t virtualdomain:www -R 192.168.1.3 -i
ipvsadm -a -t virtualdomain:www -R 192.168.1.4 -i

4. ダイレクトルーティングを経由した LVS の FTP の設定例

ipvsadm -A -t virtualdomain:ftp -p 540
ipvsadm -a -t virtualdomain:ftp -R 192.168.1.2 -g
ipvsadm -a -t virtualdomain:ftp -R 192.168.1.3 -g
ipvsadm -a -t virtualdomain:ftp -R 192.168.1.4 -g

5. ダイレクトルーティングを経由した LVS の Catch-all 永続化の設定例

いくつかのアプリケーションでは、すべてのサーバーは同じ2つ以上のサービスを動作させ、いったんあるクライアントがあるサーバーにアクセスすると、同じクライアントからの他のサービスの全てのコネクションは特定時間内は同じサーバーに送られなければならないといことが必要だ。私たちはここで全ての永続的サービスを捕らえるために 0 ポートを使う。設定コマンドは次のようになる。

ipvsadm -A -t virtualdomain:0 -p
ipvsadm -a -t virtualdomain:0 -R 192.168.1.2 -g
ipvsadm -a -t virtualdomain:0 -R 192.168.1.3 -g
ipvsadm -a -t virtualdomain:0 -R 192.168.1.4 -g

6. 永続的グラニュラリティの設定例

ipvsadm -A -t virtualdomain:www -p -M 255.255.255.0
ipvsadm -a -t virtualdomain:www -R 192.168.1.2
ipvsadm -a -t virtualdomain:www -R 192.168.1.3
ipvsadm -a -t virtualdomain:www -R 192.168.1.4


$Id: persistence.html,v 1.3 2000/04/12 00:20:33 wensong Exp $
Created on: 1999/12/26