【A10 Thunder】セッション維持(パーシステンス)と動作確認 5.2.0

A10 Thunder のセッション維持(パーシステンス)を設定し、動作を確認します。よく使われる「送信元 IP アドレスパーシステンス」と「Cookie パーシステンス」の2つを、vThunder(ACOS 5.2.0)で試します。

前回は、初回アクセスの振り分け先を決める負荷分散方式を扱いました。パーシステンスは、その後に続く同じクライアントからのアクセスを、どのサーバに送るかを決める機能です。

この記事でわかること
  1. 負荷分散方式とパーシステンスの役割の違い
  2. 送信元 IP アドレスパーシステンスの設定と確認(GUI/CLI)
  3. Cookie パーシステンスの設定と確認(GUI/CLI)
  4. 2つの方式の使い分けと注意点

パーシステンスとは

負荷分散方式(ラウンドロビンなど)は、クライアントの初回アクセスをどのサーバに転送するかを決めます。ラウンドロビンで初回アクセスを Web-01 に転送した場合、次に来た新しいアクセスは Web-02 に転送しようとします。

パーシステンスは、同じクライアントからの2回目以降のアクセスを、初回アクセスで決まったサーバに転送し続ける機能です。Thunder は「どのクライアントを、どのサーバに送ったか」を覚えておき、そのクライアントから次のアクセスが来ると、負荷分散方式ではなくこの記録をもとに転送先を決めます。

初回アクセス 負荷分散方式(ラウンドロビン)で転送先を決める → Web-01 Web-01 Web-02 vThunder クライアント 初回アクセス 2回目以降のアクセス パーシステンスで初回と同じサーバに固定する → Web-01 Web-01 Web-02 vThunder クライアント 2回目以降
図1 負荷分散方式とパーシステンスの役割(初回は負荷分散方式、2回目以降はパーシステンスで同じサーバへ)

サーバの処理負荷を分けるだけで、サーバ側でセッションを意識しなくてよいサービスであれば、パーシステンスは要りません。一方、EC サイトのカートやログイン状態のように、一連の処理を同じサーバで続ける必要があるアプリケーションでは、パーシステンスが必要になります。

「同じクライアント」を見分ける方法として、送信元 IP アドレスと Cookie がよく使われます。

方式同じクライアントの見分け方使える仮想ポート
送信元 IP アドレス送信元 IP アドレスが同じなら同じクライアントとみなし、Thunder が送信元 IP と転送先サーバの組を記録します。TCP/UDP などの L4 でも使えます。今回は TCP 80 で確認します。
CookieThunder が初回の応答に 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(ラウンドロビン)を紐付けた状態から始めます。

sg-web Web-01 10.0.200.100(TCP 80) Web-02 10.0.200.173(TCP 80) vThunder VIP 10.0.10.200 TCP 80 Internet Client HTTP(TCP 80)
図2 送信元 IP アドレスパーシステンスの検証構成(L4、TCP 80)

送信元 IP アドレスが同じアクセスを同じクライアントとみなし、転送先のサーバを固定します。設定は、パーシステンスのテンプレートを作り、仮想ポートに適用する流れです。

画面イメージについて

この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

テンプレートを作る

ADC ›› Templates を開き、Persistence タブの Create ›› Persist Source IP を選びます。

vThunder 設定画面(GUI)画面イメージ
ADC ›› Templates ›› Persistence ›› Create Persist Source IP Template
1Namesrc-persist
Dont Honor Conn Rules☐
Enforce Higher Priority☐
Hash Persist☐
Include Destination IP☐
Include Source Port☐
2Match Type 
3Timeout(minutes)5
4Netmask255.255.255.255
IPv6 Netmask128
Cancel5OK
図3 送信元 IP パーシステンスのテンプレート作成画面(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1Nameテンプレートの名前。src-persist とします。
2Match Typeパーシステンスを効かせる単位。空欄のまま(既定)はポート単位で、同じサーバの同じポートに固定します。サーバ単位にすると、同じサーバであれば別のポートへの通信も同じサーバに送ります。
3Timeout(minutes)パーシステンスを覚えておく時間(分)。既定は 5 分で、その間アクセスがなければ記録が消えます。
4Netmask同じクライアントとみなす送信元アドレスの範囲。既定の 255.255.255.255 はホスト単位です。255.255.255.0 にすると、同じ /24 のクライアントをまとめて同じサーバに送ります。
5OK今回は 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 をクリックします。

vThunder 設定画面(GUI)画面イメージ
ADC ›› SLB ›› Virtual Servers ›› vip-web ›› Virtual Port
Port / Port RangeProtocolActions
80tcp1Edit
Virtual Port の編集
Protocoltcp
Port or Port Range80
⋮ (中略)
Service Groupsg-web
Template TCP 
2Persist Type○ Destination IP○ SSL SID◉ Source IP
Template Persist Source IPsrc-persist
Cancel3Update
図4 仮想ポート(TCP 80)への適用(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1Editvip-web の仮想ポート 80(tcp)の編集画面を開きます。
2Persist Type/Template Persist Source IPSource IP を選ぶと Template Persist Source IP の欄が出るので、src-persist を選びます。
3Update仮想ポートの設定を保存します。

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 に固定されています。

クライアントのブラウザ画面イメージ
http://10.0.10.200/
Web-01何度アクセスしても Web-01
図5 送信元 IP パーシステンスで 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 にした構成です。

sg-web Web-01 10.0.200.100(TCP 80) Web-02 10.0.200.173(TCP 80) vThunder VIP 10.0.10.200 HTTP 80 サーバ側 10.0.200.149 Internet Client HTTP(TCP 80)
図6 Cookie パーシステンスの検証構成(L7、HTTP 80)

Cookie を使って同じクライアントを見分けます。クライアントの初回アクセスに対する応答に Thunder が Cookie を挿入し、クライアントは2回目以降のリクエストでその Cookie を送ってきます。Thunder は Cookie の中身から転送先のサーバを決めます。

クライアントvThunderWeb-02 ① 初回リクエスト(Cookie なし) 負荷分散方式で Web-02 を選ぶ 応答 ② 応答に Set-Cookie を挿入 ③ 2回目以降(Cookie あり) Cookie を見て同じ Web-02 へ
図7 Cookie パーシステンスの流れ

Cookie を挿入するには HTTP のヘッダを書き換える必要があるため、Cookie パーシステンスは Web の通信(HTTP/HTTPS)でしか使えません。仮想ポートも TCP ではなく、HTTP か HTTPS にします。設定の流れは送信元 IP と同じで、テンプレートを作って仮想ポートに適用します。

テンプレートを作る

ADC ›› Templates を開き、Persistence タブの Create ›› Persist Cookie を選びます。

vThunder 設定画面(GUI)画面イメージ
ADC ›› Templates ›› Persistence ›› Create Persist Cookie Template
1Namecookie-persist
2Expiration (seconds) 
3Cookie Namesto-id
Domain 
Path/
Pass-thru mode☐
4Match Type 
Insert Always☐
Dont Honor Conn Rules☐
Enable HttpOnly attribute☐
Enable secure attribute☐
5Encrypt Level1
Cancel6OK
図8 Cookie パーシステンスのテンプレート作成画面(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1Nameテンプレートの名前。cookie-persist とします。
2Expiration (seconds)挿入する Cookie の有効期限(秒)。今回は空欄のままにしました。
3Cookie Name挿入する Cookie の名前。既定は sto-id です。
4Match Type送信元 IP と同じく、空欄(既定)はポート単位です。
5Encrypt LevelCookie の名前と値を暗号化するかどうか。既定の 1 では暗号化されます。
6OK今回は 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 をクリックします。

vThunder 設定画面(GUI)画面イメージ
ADC ›› SLB ›› Virtual Servers ›› vip-web ›› Virtual Port
Port / Port RangeProtocolActions
80http1Edit
Virtual Port の編集
Protocolhttp
Port or Port Range80
⋮ (中略)
Service Groupsg-web
Template Cache 
Template HTTP 
2Persist Type○ Destination IP○ Source IP◉ Cookie
Template Persist Cookiecookie-persist
Cancel3Update
図9 仮想ポート(HTTP 80)への適用(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1Editvip-web の仮想ポート 80(http)の編集画面を開きます。
2Persist Type/Template Persist CookieCookie を選ぶと Template Persist Cookie の欄が出るので、cookie-persist を選びます。仮想ポートが http なので、TCP のときにはなかった Cookie が選択肢にあります。
3Update仮想ポートの設定を保存します。

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 に固定されています。

クライアントのブラウザ画面イメージ
http://10.0.10.200/
Web-02何度アクセスしても Web-02
図10 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)も値も暗号化された文字列になっています。値から転送先のサーバを判別します。
ExpiresCookie の有効期限。Expiration を空欄にした今回の検証では、2022年1月3日のアクセスに対して 2032年1月1日、約10年後の期限が付きました。
Path=/テンプレートの Path(既定 /)。サイト全体へのリクエストでこの Cookie が送られます。
Server応答したのは Web サーバ(IIS)です。Set-Cookie はサーバではなく Thunder が応答に足しています。
curl で試すときの注意

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 7Cookie をもとに転送先を決めた回数。Cookie パーシステンスの確認で増えています。
SRC IP persist ok 4送信元 IP アドレスをもとに転送先を決めた回数。先に行った送信元 IP パーシステンスの確認のときのカウントです。
… failパーシステンスによる転送がうまくいかなかった回数。今回はどれも 0 です。

方式を選ぶときの注意

方式注意すること
送信元 IP アドレス多くのクライアントが NAT やプロキシの後ろにいると、同じ送信元 IP アドレスに見えるため、特定のサーバにアクセスが偏ります。逆に、モバイル回線などで途中で送信元 IP アドレスが変わると、別のクライアントとして扱われます。
CookieHTTP/HTTPS の仮想ポートが必要です。HTTPS で使う場合は、Thunder で SSL を終端しないと HTTP ヘッダに Cookie を挿入できません。また、Cookie を保存しないクライアントでは毎回初回アクセスとして扱われます。

まとめ

パーシステンスは、初回アクセスで負荷分散方式が決めたサーバに、同じクライアントからの2回目以降のアクセスを固定する機能です。どちらの方式も、テンプレートを作って仮想ポートに適用します。

項目送信元 IP アドレスCookie
同じクライアントの見分け方送信元 IP アドレスThunder が挿入した Cookie
仮想ポートTCP(L4)でも使えるHTTP/HTTPS
テンプレートの作成slb template persist source-ipslb template persist cookie
仮想ポートへの適用template persist source-iptemplate persist cookie
主な既定値Timeout 5 分、Netmask 255.255.255.255Cookie Name sto-id、Path /、Encrypt Level 1
確認コマンドshow session persist
show slb persist
curl -I(Set-Cookie)
show slb persist

コメント