A10 Thunder のセッション維持(パーシステンス)を設定し、動作を確認します。よく使われる「送信元 IP アドレスパーシステンス」と「Cookie パーシステンス」の2つを、vThunder(ACOS 5.2.0)で試します。
前回は、初回アクセスの振り分け先を決める負荷分散方式を扱いました。パーシステンスは、その後に続く同じクライアントからのアクセスを、どのサーバに送るかを決める機能です。
- 負荷分散方式とパーシステンスの役割の違い
- 送信元 IP アドレスパーシステンスの設定と確認(GUI/CLI)
- Cookie パーシステンスの設定と確認(GUI/CLI)
- 2つの方式の使い分けと注意点
パーシステンスとは
負荷分散方式(ラウンドロビンなど)は、クライアントの初回アクセスをどのサーバに転送するかを決めます。ラウンドロビンで初回アクセスを Web-01 に転送した場合、次に来た新しいアクセスは Web-02 に転送しようとします。
パーシステンスは、同じクライアントからの2回目以降のアクセスを、初回アクセスで決まったサーバに転送し続ける機能です。Thunder は「どのクライアントを、どのサーバに送ったか」を覚えておき、そのクライアントから次のアクセスが来ると、負荷分散方式ではなくこの記録をもとに転送先を決めます。
サーバの処理負荷を分けるだけで、サーバ側でセッションを意識しなくてよいサービスであれば、パーシステンスは要りません。一方、EC サイトのカートやログイン状態のように、一連の処理を同じサーバで続ける必要があるアプリケーションでは、パーシステンスが必要になります。
「同じクライアント」を見分ける方法として、送信元 IP アドレスと Cookie がよく使われます。
| 方式 | 同じクライアントの見分け方 | 使える仮想ポート |
|---|---|---|
| 送信元 IP アドレス | 送信元 IP アドレスが同じなら同じクライアントとみなし、Thunder が送信元 IP と転送先サーバの組を記録します。 | TCP/UDP などの L4 でも使えます。今回は TCP 80 で確認します。 |
| Cookie | Thunder が初回の応答に Cookie を挿入し、クライアントが2回目以降に送ってくる Cookie で転送先を決めます。 | HTTP の中身を扱う必要があるため、HTTP/HTTPS の仮想ポートで使います。 |
送信元 IP アドレスパーシステンス
構成は 【A10 Thunder】サーバ負荷分散(L4)の基本設定と動作確認 5.2.0 のものを使います。Virtual Server vip-web(10.0.10.200)の仮想ポート TCP 80 に、サービスグループ sg-web(ラウンドロビン)を紐付けた状態から始めます。
送信元 IP アドレスが同じアクセスを同じクライアントとみなし、転送先のサーバを固定します。設定は、パーシステンスのテンプレートを作り、仮想ポートに適用する流れです。
この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
テンプレートを作る
ADC ›› Templates を開き、Persistence タブの Create ›› Persist Source IP を選びます。
| 1Name | src-persist |
| Dont Honor Conn Rules | ☐ |
| Enforce Higher Priority | ☐ |
| Hash Persist | ☐ |
| Include Destination IP | ☐ |
| Include Source Port | ☐ |
| 2Match Type | |
| 3Timeout(minutes) | 5 |
| 4Netmask | 255.255.255.255 |
| IPv6 Netmask | 128 |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | Name | テンプレートの名前。src-persist とします。 |
| 2 | Match Type | パーシステンスを効かせる単位。空欄のまま(既定)はポート単位で、同じサーバの同じポートに固定します。サーバ単位にすると、同じサーバであれば別のポートへの通信も同じサーバに送ります。 |
| 3 | Timeout(minutes) | パーシステンスを覚えておく時間(分)。既定は 5 分で、その間アクセスがなければ記録が消えます。 |
| 4 | Netmask | 同じクライアントとみなす送信元アドレスの範囲。既定の 255.255.255.255 はホスト単位です。255.255.255.0 にすると、同じ /24 のクライアントをまとめて同じサーバに送ります。 |
| 5 | OK | 今回は Name だけを入力し、ほかは既定値のまま作成します。 |
作成すると、Persistence の一覧に src-persist(Type:Persist Source IP)が表示されます。
仮想ポートに適用する
ADC ›› SLB ›› Virtual Servers で vip-web を開き、Virtual Port の一覧から 80(tcp)の Edit をクリックします。Persist Type で Source IP を選び、Template Persist Source IP で、作成した src-persist を選んで Update をクリックします。
| Port / Port Range | Protocol | Actions |
|---|---|---|
| 80 | tcp | 1Edit |
| Protocol | tcp |
| Port or Port Range | 80 |
| ⋮ (中略) | |
| Service Group | sg-web |
| Template TCP | |
| 2Persist Type | ○ Destination IP○ SSL SID◉ Source IP |
| Template Persist Source IP | src-persist |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | Edit | vip-web の仮想ポート 80(tcp)の編集画面を開きます。 |
| 2 | Persist Type/Template Persist Source IP | Source IP を選ぶと Template Persist Source IP の欄が出るので、src-persist を選びます。 |
| 3 | Update | 仮想ポートの設定を保存します。 |
CLI で設定する場合
slb template persist source-ip でテンプレートを作り、仮想ポートのモードで template persist source-ip を指定します。
vThunder
vThunder(config)# slb template persist source-ip src-persist vThunder(config-source ip persist)#exit vThunder(config)#slb virtual-server vip-web 10.0.10.200 vThunder(config-slb vserver)#port 80 tcp vThunder(config-slb vserver-vport)#template persist source-ip src-persist
動作を確認する
ブラウザで VIP(10.0.10.200)に続けて何回アクセスしても、Web-01 からだけ応答が返ります。パーシステンスがなければラウンドロビンで Web-01 と Web-02 が交互に応答しますが、初回に決まった Web-01 に固定されています。
show session persist:パーシステンスの記録
Thunder が覚えているパーシステンスの記録は show session persist で確認できます。
vThunder
vThunder# show session persist Prot Forward Source Forward Dest Reverse Source Age Proto -------------------------------------------------------------------------------------- src (伏せています) 10.0.10.200:80 10.0.200.100:80 300 TCP Total Sessions:
| 表示 | 意味 |
|---|---|
| Prot src | 送信元 IP アドレスパーシステンスの記録です。 |
| Forward Source | クライアントの送信元 IP アドレス。このアドレスが「同じクライアント」の目印になります。 |
| Forward Dest | アクセス先の VIP とポート(10.0.10.200:80)。 |
| Reverse Source | このクライアントの転送先として固定されたサーバ(Web-01 の 10.0.200.100:80)。 |
| Age 300 | テンプレートの Timeout 5 分(300 秒)と同じ値です。 |
Cookie パーシステンス
構成は 【A10 Thunder】サーバ負荷分散(L7:HTTP )の基本設定と動作確認 5.2.0 のものを使います。vip-web(10.0.10.200)の仮想ポートを HTTP 80 にした構成です。
Cookie を使って同じクライアントを見分けます。クライアントの初回アクセスに対する応答に Thunder が Cookie を挿入し、クライアントは2回目以降のリクエストでその Cookie を送ってきます。Thunder は Cookie の中身から転送先のサーバを決めます。
Cookie を挿入するには HTTP のヘッダを書き換える必要があるため、Cookie パーシステンスは Web の通信(HTTP/HTTPS)でしか使えません。仮想ポートも TCP ではなく、HTTP か HTTPS にします。設定の流れは送信元 IP と同じで、テンプレートを作って仮想ポートに適用します。
テンプレートを作る
ADC ›› Templates を開き、Persistence タブの Create ›› Persist Cookie を選びます。
| 1Name | cookie-persist |
| 2Expiration (seconds) | |
| 3Cookie Name | sto-id |
| Domain | |
| Path | / |
| Pass-thru mode | ☐ |
| 4Match Type | |
| Insert Always | ☐ |
| Dont Honor Conn Rules | ☐ |
| Enable HttpOnly attribute | ☐ |
| Enable secure attribute | ☐ |
| 5Encrypt Level | 1 |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | Name | テンプレートの名前。cookie-persist とします。 |
| 2 | Expiration (seconds) | 挿入する Cookie の有効期限(秒)。今回は空欄のままにしました。 |
| 3 | Cookie Name | 挿入する Cookie の名前。既定は sto-id です。 |
| 4 | Match Type | 送信元 IP と同じく、空欄(既定)はポート単位です。 |
| 5 | Encrypt Level | Cookie の名前と値を暗号化するかどうか。既定の 1 では暗号化されます。 |
| 6 | OK | 今回は Name だけを入力し、ほかは既定値のまま作成します。 |
作成すると、Persistence の一覧に cookie-persist(Type:Persist Cookie)が表示されます。
仮想ポートに適用する
ADC ›› SLB ›› Virtual Servers で vip-web を開き、Virtual Port の一覧から 80(http)の Edit をクリックします。Persist Type で Cookie を選び、Template Persist Cookie で、作成した cookie-persist を選んで Update をクリックします。
| Port / Port Range | Protocol | Actions |
|---|---|---|
| 80 | http | 1Edit |
| Protocol | http |
| Port or Port Range | 80 |
| ⋮ (中略) | |
| Service Group | sg-web |
| Template Cache | |
| Template HTTP | |
| 2Persist Type | ○ Destination IP○ Source IP◉ Cookie |
| Template Persist Cookie | cookie-persist |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | Edit | vip-web の仮想ポート 80(http)の編集画面を開きます。 |
| 2 | Persist Type/Template Persist Cookie | Cookie を選ぶと Template Persist Cookie の欄が出るので、cookie-persist を選びます。仮想ポートが http なので、TCP のときにはなかった Cookie が選択肢にあります。 |
| 3 | Update | 仮想ポートの設定を保存します。 |
CLI で設定する場合
slb template persist cookie でテンプレートを作り、HTTP の仮想ポートのモードで template persist cookie を指定します。
vThunder
vThunder(config)#slb template persist cookie cookie-persist vThunder(config-cookie persist)#exit vThunder(config)#slb virtual-server vip-web 10.0.10.200 vThunder(config-slb vserver)#port 80 http vThunder(config-slb vserver-vport)#template persist cookie cookie-persist
動作を確認する
ブラウザで VIP(10.0.10.200)に続けて何回アクセスしても、Web-02 からだけ応答が返ります。今回は初回アクセスが Web-02 に振り分けられ、その後は Cookie によって Web-02 に固定されています。
curl -I:挿入された Cookie
curl -I で応答ヘッダを見ると、Thunder が挿入した Set-Cookie ヘッダが付いています。
クライアント
$ curl -I 10.0.10.200 HTTP/1.1 200 OK Content-Length: 97 Content-Type: text/html Last-Modified: Sun, 17 Oct 2021 05:50:38 GMT Accept-Ranges: bytes ETag: "3ec6b7e91ac3d71:0" Server: Microsoft-IIS/10.0 Date: Mon, 03 Jan 2022 13:19:14 GMT Set-Cookie: UqZBpD3n3iXPAw1X=v1jBougwSDAdl; Expires=Thu, 01-Jan-2032 13:19:14 GMT; Path=/
| 表示 | 意味 |
|---|---|
| UqZBpD3n3iXPAw1X=… | Thunder が挿入した Cookie。Encrypt Level が既定の 1 なので、名前(既定は sto-id)も値も暗号化された文字列になっています。値から転送先のサーバを判別します。 |
| Expires | Cookie の有効期限。Expiration を空欄にした今回の検証では、2022年1月3日のアクセスに対して 2032年1月1日、約10年後の期限が付きました。 |
| Path=/ | テンプレートの Path(既定 /)。サイト全体へのリクエストでこの Cookie が送られます。 |
| Server | 応答したのは Web サーバ(IIS)です。Set-Cookie はサーバではなく Thunder が応答に足しています。 |
curl は、何も指定しなければ受け取った Cookie を次のリクエストで送りません。そのため curl を繰り返し実行すると、毎回 Cookie なしの初回アクセスとして扱われ、ラウンドロビンで振り分けられます。curl でパーシステンスを確かめるときは、-c で Cookie を保存し、-b で送るようにします。
show slb persist:パーシステンスのカウンタ
show slb persist では、方式ごとにパーシステンスで転送できた回数(ok)と、できなかった回数(fail)を確認できます。
vThunder
vThunder# show slb persist
Total
-----------------------------------------------
URL hash persist (pri) 0
URL hash persist (sec) 0
URL hash persist fail 0
SRC IP persist ok 4
SRC IP persist fail 0
SRC IP hash persist(pri) 0
SRC IP hash persist(sec) 0
SRC IP hash persist fail 0
DST IP persist ok 0
DST IP persist fail 0
DST IP hash persist(pri) 0
DST IP hash persist(sec) 0
DST IP hash persist fail 0
SSL SID persist ok 0
SSL SID persist fail 0
Cookie persist ok 7
Cookie persist fail 0
Persist cookie not found 0
Persist cookie Pass-thru 0
Enforce higher priority 0
| 表示 | 意味 |
|---|---|
| Cookie persist ok 7 | Cookie をもとに転送先を決めた回数。Cookie パーシステンスの確認で増えています。 |
| SRC IP persist ok 4 | 送信元 IP アドレスをもとに転送先を決めた回数。先に行った送信元 IP パーシステンスの確認のときのカウントです。 |
| … fail | パーシステンスによる転送がうまくいかなかった回数。今回はどれも 0 です。 |
方式を選ぶときの注意
| 方式 | 注意すること |
|---|---|
| 送信元 IP アドレス | 多くのクライアントが NAT やプロキシの後ろにいると、同じ送信元 IP アドレスに見えるため、特定のサーバにアクセスが偏ります。逆に、モバイル回線などで途中で送信元 IP アドレスが変わると、別のクライアントとして扱われます。 |
| Cookie | HTTP/HTTPS の仮想ポートが必要です。HTTPS で使う場合は、Thunder で SSL を終端しないと HTTP ヘッダに Cookie を挿入できません。また、Cookie を保存しないクライアントでは毎回初回アクセスとして扱われます。 |
まとめ
パーシステンスは、初回アクセスで負荷分散方式が決めたサーバに、同じクライアントからの2回目以降のアクセスを固定する機能です。どちらの方式も、テンプレートを作って仮想ポートに適用します。
| 項目 | 送信元 IP アドレス | Cookie |
|---|---|---|
| 同じクライアントの見分け方 | 送信元 IP アドレス | Thunder が挿入した Cookie |
| 仮想ポート | TCP(L4)でも使える | HTTP/HTTPS |
| テンプレートの作成 | slb template persist source-ip | slb template persist cookie |
| 仮想ポートへの適用 | template persist source-ip | template persist cookie |
| 主な既定値 | Timeout 5 分、Netmask 255.255.255.255 | Cookie Name sto-id、Path /、Encrypt Level 1 |
| 確認コマンド | show session persistshow slb persist | curl -I(Set-Cookie)show slb persist |
コメント