前のトピック: HALB - HA プロキシに基づいたセッション認識 HTTP ロード バランサ

次のトピック: PS8 - 拡張性のあるポート スイッチ

L3LB - TCP/UDP ロード バランサ

最新バージョン: 2.0.2-1

L3LB - TCP/UDP ロード バランサ

早見表

カタログ

システム

カテゴリ

スイッチ

ユーザ ボリューム

なし

最小 メモリ

96M

OS

Linux

制約

なし

機能の概要

L3LB は、同一または異なるタイプのサーバに受信 TCP/UDP セッションを配信するためのスイッチです。 TCP 負荷分散機能は HAProxy TCP/HTTP 負荷分散ソフトウェア パッケージに基づきます。UDP 負荷分散は Netfilter に基づきます。

L3LB は、数種類のアルゴリズムを使用して、受信トラフィックを負荷分散します。 TCP トラフィックについては、L3LB は簡易ラウンド ロビン負荷分散を実行し、バックエンド サーバへの負荷を均等にします。 また TCP については、L3LB は永続的なセッションをサポートしており、リクエスト ソース IP アドレスをキーとして使用することにより、クライアントを特定のバックエンド サーバにバインドします。 UDP トラフィックの場合、L3LB はラウンド ロビン アルゴリズム(UDP トラフィックに使用できる唯一のアルゴリズム)を使用します。

L3LB は、すべてのバックエンド サーバの健全性状態を継続的にモニタします。 TCP モードのとき、L3LB が行う健全性状態チェックは簡易 TCP 接続チェックで構成されます。 パラメータ化されたヘルス チェック メソッドを使用して L3LB がサーバ障害を検出した場合、L3LB はトラフィックを代替サーバに切り替えます。 故障したサーバが結果的に回復した場合、L3LB は再度切り替えを行って回復したサーバにトラフィックを戻すことができます。 UDP モードの場合は、ICMP PING を使用して、バックエンド サーバの可用性が確認されます。

L3LB は、ctl 端子上で Web サービス インターフェースを公開します。 このインターフェースでは、ユーザが出力端子 out1~out8 の有効/無効を実際に切り替えたり、すべての端子の状態を取得することが可能です。 これは、何らかのバックエンド障害(すなわち、データベースまたはストレージ アプライアンス内などで)が発生していて、アプリケーション自身が特定のサーバ セットに対してトラフィックを自動的に無効にできる場合に役立ちます。 この場合、L3LB 自体はこのタイプの障害を検出できません。したがって、障害を検出し、対応するバックエンド サーバのセットを無効にするのはアプリケーションしだいです。

L3LB は使用するリソースが非常に少ないため、きわめて高速な設計になっています。 標準条件下では、L3LB は 1 セッション当たり約 25KB のメモリを消費します。これは 40000 の同時セッションで 1GB に相当し、最大で毎秒 6000 件のリクエストを処理します。

境界

リソース

リソース

最小

最大

デフォルト

CPU

0.1

16

0.4

メモリ

96 MB

32 GB

96 MB

帯域幅

1 Mbps

2 Gbps

250 Mbps

L3LB に与えられるメモリ量によって、スループットや応答時間が増加することはありません。 L3LB は、CPU/帯域幅にバインドされたアプライアンスです。

端子

名前

方向

プロトコル

説明

in

in

任意

共通入力。 受信した TCP リクエストは、ラウンド ロビンの選択内容またはソースベースのセッション情報のいずれかを使用して、出力の 1 つへ転送されます。

ctl

in

HTTP

出力を有効/無効にし、出力端子の状態を取得するために使用する制御端子。

out1~out8

out

任意

分散出力。 これらの出力の一部やすべてを接続しないでおくことができます。トラフィックは、接続済みの有効な出力のみに配信されます。 デフォルトでは、端子はすべて有効です。

mon

out

CCE

パフォーマンスとリソースの使用状況統計を送信するために使用されます。

プロパティ

一般プロパティ

名前

タイプ

説明

mode

文字列

動作モードを指定します。 有効な値は以下のとおりです。
tcp_roundrobin - 受信 TCP セッションは、すべての接続された有効なバックエンド サーバ全体にラウンド ロビン方式で配信されます。
tcp_source - TCP リクエストのソース IP アドレスは、セッションを特定のバックエンド サーバにバインドするために使用されます。
udp_roundrobin - L3LB は UDP 負荷分散モードで動作します。
デフォルト: tcp_roundrobin

ports

文字列

L3LB がバックエンド サーバへ転送するポートおよびポート範囲の、スペースまたはカンマで区切られたリスト。 ポート範囲は、区切り記号としてダッシュ(-)またはコロン(:)を使い、lower_port:higher_port として指定します。 例: 80,81,90-99 110:120 140 141。 未指定のポートで受信したトラフィックはドロップされます。
デフォルト: 80

max_connections

整数

L3LB が処理できる、同時にアクティブな接続の最大数。 この数に達しても新しい接続は受け付けられます。ただし、別の接続が閉じられるまで、それらの処理は遅れます。 アプライアンスの起動時、L3LB は使用可能メモリ量に基づいて最大接続数を自動的に算定し、それをこのプロパティの値と比較して最も小さい値を使用します。 このプロパティが 0 のときは、計算値が使用されます。 使用可能なメモリ量とこのプロパティの明示的な設定のいずれも、バランサのスループットまたはその最大リクエスト レートに直接影響を与えるわけではありません。小さい数を設定する(すなわちメモリがほとんどない)と、バックエンド サーバが各リクエスト(たとえばデータベース検索)の長い操作を実行している場合、多くのリクエストが同時に開いたままとなります。 このプロパティは、tcp_roundrobin と tcp_source の動作モードでのみ有効です。
デフォルト: 0

backup_outputs

文字列

バックアップ サーバとみなされる、スペースまたはカンマで区切られた出力リスト(out1~out8)。 出力範囲(out1~out3)はサポートされていません。 バックエンド サーバがすべて使用不能な場合のみ、トラフィックはバックアップ サーバに転送されます。 これらのバックアップ サーバの目的は、何らかの異常が発生した場合に、使用不能なバックエンド サーバからエラーを投げたり、タイム アウトするのではなく、クライアントに通知するか、それらをリダイレクトすることです。 例: out1、out2、out3。 空の場合、バックアップ サーバは使用されません。
デフォルト: "" (バックアップ サーバは使用されません)

ヘルス チェック プロパティ

ポート プロパティで指定される最初のポートへの簡易 TCP 接続は、tcp_roundrobin と tcp_source の動作モードで使用されます。 udp_roundrobin 動作モードでは、常に ICMP ping が使用されます。

名前

タイプ

説明

healthcheck_interval

整数

ヘルス チェックの間隔(秒で指定)。 このプロパティが 0 の場合、ヘルス チェックは実行されません。
デフォルト: 20

タイムアウト プロパティ

これらのプロパティは、tcp_roundrobin と tcp_source の動作モードでのみ有効です。

名前

タイプ

説明

client_timeout

整数

接続確立後にクライアントからのリクエストを待機するタイムアウト秒数。
デフォルト: 150

server_timeout

整数

接続確立後にバックエンド サーバからの応答を待機するタイムアウト秒数。
デフォルト: 150

conn_timeout

整数

端子(これにはヘルス チェックも含まれます)のうちの 1 つを介して L3LB の内部から任意の TCP 接続を確立するためのタイムアウト秒数。 L3LB に重いネットワーク負荷がかかっている場合、ヘルス チェックを非常に低い値に設定していると、間違ってタイムアウトすることがあります(そのような場合、L3LB は出力を無効にし始め、予期しないアプリケーション動作が起こる場合があります)。 このプロパティを 20 秒未満の値に設定することはお勧めしません。
デフォルト: 20

Web サービス インターフェース プロパティ

名前

タイプ

説明

ctl_port

整数

ctl 端子を介して Web サービス コントロール インターフェースにアクセスするために使用するポート。
デフォルト: 80

カスタム カウンタ

L3LB アプライアンスは、mon 端子を介して以下のカスタム カウンタをレポートします。

以下のカウンタは L3LB カウンタ グループに属します。 X は 1 から 8 の値を持つことができます。

カウンタ名

説明

outX_status

出力端子 outX の状態: 0 - 有効かつ動作中、1 - 有効かつ停止中、100 - 切断。

outX_queue

端子 outX のキューのリクエスト数。 このカウンタは、udp_roundrobin モードのときはレポートされません。

outX_queue_max

端子 outX の同時キュー リクエストの過去の最大数。 このカウンタは、udp_roundrobin モードのときはレポートされません。

outX_sessions

端子 outX のアクティブ セッション数。

outX_sessions_max

端子 outX の同時アクティブ セッションの最大数。

outX_sessions_total

端子 outX の完了セッション数。 このカウンタは、udp_roundrobin モードのときはレポートされません。

outX_errors

端子 outX の失敗したヘルス チェック数。

queue

現在のキューの長さ(out1~out8 で累積)。 このカウンタは、udp_roundrobin モードのときはレポートされません。

queue_max

同時キュー リクエストの過去の最大数(out1~out8 で累積)。 このカウンタは、udp_roundrobin モードのときはレポートされません。

sessions_active

アクティブ セッション数(out1~out8 で累積)。

sessions_max

アクティブ セッションの過去の最大数(out1~out8 で累積)。

sessions_total

完了セッション数(out1~out8 で累積)。 このカウンタは、udp_roundrobin モードのときはレポートされません。

errors

ヘルス チェック失敗の合計数(out1~out8 で累積)。

パフォーマンス

リクエスト レート

ドキュメント サイズや利用可能なネットワーク帯域幅にもよりますが、L3LB は毎秒 6000 以上のトランザクション(リクエスト/応答ペア)をルーティングします。

データ スループット

L3LB は 15MB/秒以上でルーティングします。

同時接続

L3LB は 2000 以上の同時保留リクエストをサポートします (クライアントからのオープン TCP 接続である保留リクエストで、1 つ以上の未完了 TCP セッションが進行中です)。 同時接続の数は、使用可能な空きメモリに依存しますが、最大で 40000 です。 テストでは、L3LB は 15000 を超えるアクティブな同時転送をサポートしました。

エラー メッセージ

アプライアンスの起動に失敗した場合、以下の内容のエラーがシステム ログにログ記録される場合があります。

エラー メッセージ

説明

エラー: アプライアンス メモリ設定を決定できませんでした。CA Technologies のサポートにお問い合わせください。

L3LB は使用可能なメモリ量の検出に失敗しました。CA のサポートにお問い合わせください。

エラー: HAProxy 環境設定ファイルを作成できませんでした。CA Technologies のサポートにお問い合わせください。

L3LB が HAProxy 環境設定ファイルの作成に失敗しました。CA のサポートにお問い合わせください(おそらくはディスク容量不足によるものです)。

エラー: 使用可能な CPU の数を特定できませんでした。CA Technologies のサポートにお問い合わせください。

L3LB は使用可能な CPU 量の検出に失敗しました。CA のサポートにお問い合わせください。

エラー: 無効な動作モードが指定されています

無効なモードが指定されています。これは tcp_roundrobin、tcp_source、udp_roundrobin のうちの 1 つにする必要があります。

エラー: ctl_port 値は 1 ~ 65535 の値を指定する必要があります

ctl_port 値は、1 より大きく 65535 より小さい必要があります。

エラー: L3LB を起動できませんでした。詳細は「/var/log/appliance/log」ログ ファイルを参照してください。

L3LB の起動中にシステム エラーが発生しました。CA のサポートにお問い合わせください。

エラー: コントロール Web サービス インターフェースを初期化できませんでした。CA Technologies のサポートにお問い合わせください。

ctl 端子上で公開されているコントロール Web サービス インターフェースの初期化中にシステム エラーが発生しました。CA のサポートにお問い合わせください。

エラー: 統計レポートを初期化できませんでした。CA Technologies のサポートにお問い合わせください。

統計レポートの初期化中にシステム エラーが発生しました。CA のサポートにお問い合わせください。

エラー: ユーザ インターフェース端子を初期化できませんでした。CA Technologies のサポートにお問い合わせください。

ui 端子上で公開されているグラフィカル ユーザ インターフェースの初期化中にシステム エラーが発生しました。CA のサポートにお問い合わせください。

出力端子のプログラムによる制御

概要

コントロール Web サービス インターフェースは、出力端子(out1 ~ out8)を有効または無効にしたり、現在の端子状態を取得することを考慮に入れ、ctl 端子(設定済みポート上)上で公開されます。

プロトコル

このプロトコルは、読み取り機能のみを提供するので、GET HTTP メソッドのみが使用されます。 したがって、サポートされているすべてのタイプのプロトコルで、リクエストはその URI および出力構造によって定義できます。 文字は URI では「特殊」と認識されるため、標準的な % エンコーディングを介してエスケープする必要があります。

サポートされているすべての URI の説明を以下に示します。

コントロール コール

出力端子の無効化

出力端子がどのように識別されるかに基づき、disable コントロール コールには次の 2 つの形式があります。

リクエスト: /api/disable?channel=out3 (出力端子 out3 を無効にします)

リクエスト: /api/disable?10.11.12.13 (IP アドレス 10.11.12.13 で Web サーバに接続される出力端子を無効にします)

応答:

L3LB は、ステータス コードおよびオプションのステータス メッセージを持つ以下の構造を返します。

{
   "status" :
   {
   "code": code_value,
   "message": "status_message"
   }
}

可能なステータス コード値のリストを以下に示します。

コード値

説明

0

操作が成功し、端子は無効になりました。

10

操作が成功せず、L3LB の設定は変更されませんでした。 最も考えられる原因は、端子がすでに無効になっていたか、指定された IP アドレスが無効であるということです。

100

リクエストの処理中にエラーが発生しました。詳細はステータス メッセージを参照してください。

出力端子の有効化

出力端子がどのように識別されるかに基づき、enable コントロール コールには次の 2 つの形式があります。

リクエスト: /api/enable?channel=out3 (出力端子 out3 を有効にします)

リクエスト: /api/enable?10.11.12.13 (IP アドレス 10.11.12.13 で Web サーバに接続される出力端子を有効にします)

応答:

L3LB は、ステータス コードおよびオプションのステータス メッセージを持つ以下の構造を返します。

{
   "status" :
   {
   "code": code_value,
   "message": "status_message"
   }
}

可能なステータス コード値のリストを以下に示します。

コード値

説明

0

操作が成功し、端子は有効になりました。

10

操作が成功せず、L3LB の設定は変更されませんでした。 最も考えられる原因は、端子がすでに有効になっていたか、指定された IP アドレスが無効であるということです。

100

リクエストの処理中にエラーが発生しました。詳細はステータス メッセージを参照してください。

出力端子状態の取得

リクエスト: /api/status (すべての出力端子の状態を返します)

応答:

L3LB は、ステータス コードおよびオプションのステータス メッセージを持つ以下の構造を返します。

{
   "status" :
   {
   "code": code_value,
   "message": "status_message",
   "terminal_id": "terminal_state",
   "terminal_id": "terminal_state",
   ...
   }
}

状態は、すべての接続済み端子の場合にのみ返されます。無効な端子や切断された端子の状態はレポートされません。

可能なステータス コード値のリストを以下に示します。

コード値

説明

0

操作は成功しました。

100

リクエストの処理中にエラーが発生しました。詳細はステータス メッセージを参照してください。

可能な端子の値は out1~out8 です。

可能な状態値は以下のとおりです。

状態値

説明

up

端子は接続されアクティブです。

down

端子は非アクティブです。 この端子に接続される Web サーバは、down か L3LB ヘルス チェックに失敗しています。

状態出力の例

{
   "status" :
   {
   "code": 0,
   "message": "",
   "out1": "up",
   "out2": "up",
   "out3": "down",
   "out4": "up"   

}

典型的な使用状況

負荷分散 Webmail クラスタ

近年、電子メールはビジネスの遂行で大切な要素になっています。そのため、Webmail クラスタには、1 日 24 時間年中無休でアクセス可能である必要があります。 以下の例では、Webmail サーバと smtp サーバを負荷分散し、その可用性を高めるために、HALB と L3LB をどのように使用するかを示します。 失敗した場合は、サーバが ctl インターフェースを介して HALB または L3LB の出力を無効にできます。 このケースでは、L3LB tcp_roundrobin モードが使用されています。

HALB と L3LB をどのように併用して負荷を分散し、Web メールおよび SMTP サーバの可用性を向上させられるか

負荷分散アプリケーション サーバ

最近の Web サイトが静的コンテンツのみを提供することはほとんどありません。 通常、多くのサーバ側処理がサーバ側で発生します。 この例の図は、Web サーバのクラスタから多数のアプリケーション サーバへの中断なしのアクセスを負荷分散する方法を示しています。このケースでは Apache Tomcat です。 tcp_source 動作モードは、適切な Web サーバからアプリケーション サーバ セッションのサポートを保証するのに役立ちます。

負荷分散アプリケーション サーバ

負荷分散 Voice-over-IP サービス

一般的な Voice Over IP プロトコルは、メイン プロトコルとして UDP を使用します。このようなトラフィックの負荷分散は、VoIP クラスタの容易なスケーリングのために重要なタスクです。 この例では、udp_roundrobin 動作モードが使用されます。

負荷分散ボイスオーバー IP サービス

アプライアンス内で使用されるオープン ソース/サードパーティ ソフトウェア

L3LB では、そのベース クラス LUX5 によって使用されるサードパーティのオープン ソース パッケージに加えて、以下のサードパーティ オープン ソース パッケージを使用します。

ソフトウェア

バージョン

変更

ライセンス

haproxy

1.2.18

なし

GPLv2

ホームページ

libxml2

2.6.26

なし

MIT

該当なし

php-thttpd

2.25b

なし

BSD

該当なし

libipt_statistic

1.3.5-1.2.1

なし

GPLv2

ホームページ

iptables

1.3.5-1.2.1

なし

GPLv2

ホームページ

実装デザイン

ベース クラス

LUX5 アプライアンス イメージは L3LB アプライアンス用のベース クラスとして使用されます。

クラス ボリューム

ディスク サイズの変更は必要ありません。L3LB は、ベース クラス LUX5 用に定義されたデフォルトを使用しています。

L3LB ディレクトリの内容

L3LB ソフトウェアは、/appliance サブツリー下にインストールされます。

udp_healthchecker.pl は、udp 動作モード用のヘルス チェック スクリプトです。

パッケージ

以下の標準パッケージ(公式のミラーから)がインストールされています。

さらに、以下のカスタム パッケージがインストールされています(ソースを含む)。

リリース ディレクトリの内容

エクスポートされるアプライアンス イメージ

ソース

テスト(テスト計画 CatSwitchesL3LBTp およびリリース ノート CatSwitchesL3LBRelNotes を参照)

l3lb-24-test.1.0.0.tar.bz2 - CA 3Tera AppLogic 2.4 用テスト スクリプト

動作理論

L3LB は、HAProxy TCP/HTTP ロード バランサという単一のバックグラウンド サービスを活用します (http://haproxy.1wt.eu)。 tcp 負荷分散のため、TCP 動作モードのみが有効になっています。

多数のリスナおよびバックエンドが haproxy.cfg 環境設定ファイル内に定義されています。これは設定済みのプロパティ値を使用して、アプライアンス起動時に appliance.sh スクリプトによって作成されます。 1 つのリスナが入力端子用に作成され、負荷分散する必要があるすべての受信ネットワーク トラフィックに使用されます。 別のリスナが、統計 GUI をユーザにエクスポートする目的で、ui インターフェース上に作成されます。 さらにもう 1 つのリスナが、ランタイム統計を抽出し、mon 端子を介してそれらをレポートする目的で、内部ループバック インターフェース lo0 上に作成されます。 接続されたすべての outX 端子はバックエンドとして定義され、そこで受信トラフィックが転送されます。

入力端子上のリスナは HTTP リクエストを受信し、動作モードに応じて、Cookie をパッシブ、挿入、同期モードに変更します。 その後、リクエストはバックエンド サーバの 1 つへ転送されます。 このリクエストに既存のセッションがある場合は、前のすべてのリクエスト用と同じバックエンド サーバへ転送されます。 このリクエストに既存のセッションがない場合、バックエンド サーバはラウンド ロビンによって選択されます。 サーバからの応答は、おそらくは再度変更されてクライアントへ戻されます。

設定

HAProxy 用の設定ファイルは、appliance.sh init スクリプトによって起動時に生成されます。 /etc/applogic.sh 内に定義されたプロパティを使用して、/appliance/haproxy.cfg 環境設定ファイルを作成します。 開始時に計算される多くの追加プロパティは、環境設定ファイル(ulimit-n、nbproc、バインド アドレス)に書き込まれます。

ログ ファイル

リクエスト ログ記録は L3LB 内では無効になっていますが、重大なエラーのみシステム ログへレポートされます(それ以外のログ記録はありません)。

アプライアンス内で使用されるオープン ソース/サードパーティ ソフトウェア

L3LB は、ベース クラス LUX5 によって使用されるサードパーティのオープン ソース パッケージに加えて、以下のサードパーティのオープン ソース パッケージを使用します。

ソフトウェア

バージョン

変更

ライセンス

haproxy

1.4.9

なし

GPLv2

ホームページ

php-thttpd

2.25b

なし

BSD

該当なし

libipt_statistic

1.3.5-1.2.1

なし

GPLv2

ホームページ

iptables

1.3.5-5.3.el5_4

なし

GPLv2

ホームページ