今回紹介する事例は、server からの HTTP response 中に Set-cookie が挿入されているにもかかわらず、次の Cookie 付き GET request が別の server に転送されるというものです。
切り分け内容は下記になります。 ACE のどういった実装を見落としていて、どのような設定が必要か推測してください。
--- 切り分け内容 ---
- 7, 8 行目の HTTP request 中に cookie は set されておらず、client は 205 行目の Set-Cookie で cookie を学習している。
- 205 行目の HTTP response で Server から Set-Cookie=sv2 を受信
- 215 行目の HTTP request 中に Cookie: sv_cookie=sv2 を Set して送信。
- 218 行目の HTTP response は、cookie を set した sv2 ではなく、sv1 から返ってくる??? (215 行目で cookie を set しているので、sv2 から response が返ってくることを期待。)
- ACE の sticky table からも、試験前後で追加されている entry は sv2 であり、sv2 を使用して欲しい。
# 構成
# 7 行目 capture
# 8 行目 capture
# 205 行目 capture
# 215 行目 capture
# 218 行目 capture
# show sticky database
ACE20/Admin# sh sticky database !___ 試験前 ACE20/Admin# sh sticky database !___ 試験後 sticky group : cookie type : HTTP-COOKIE timeout : 1440 timeout-activeconns : FALSE sticky-entry rserver-instance time-to-expire flags ---------------------+--------------------------------+--------------+-------+ 16345823234109072576 sv2:0 86382 - ACE20/Admin# |
# show run
ACE20/Admin# sh run Generating configuration.... hostname ACE20 boot system image:c6ace-t1k9-mz.A2_3_1.bin resource-class sticky limit-resource all minimum 0.00 maximum unlimited limit-resource sticky minimum 1.00 maximum unlimited context Admin member sticky access-list all line 8 extended permit ip any any rserver host sv1 ip address 192.168.72.11 inservice rserver host sv2 ip address 192.168.72.12 inservice serverfarm host sf rserver sv1 inservice rserver sv2 inservice sticky http-cookie sv_cookie cookie serverfarm sf class-map match-all vip 2 match virtual-address 192.168.71.100 tcp eq www policy-map type loadbalance first-match lb class class-default sticky-serverfarm cookie policy-map multi-match client-vips class vip loadbalance vip inservice loadbalance policy lb loadbalance vip icmp-reply access-group input all interface vlan 771 ip address 192.168.71.250 255.255.255.0 service-policy input client-vips no shutdown interface vlan 772 ip address 192.168.72.250 255.255.255.0 no shutdown |
### 答え
8 行目と 215 行目の ip address, port# を確認すると、同一であることが確認できます。 また、syn packet は 1, 2 行目にしかないので、8, 215 行目の packet は同一 connection を使用した通信になります。(8行目が最初の GET request で、215行目が同一 connection を使用した 2 番目の GET request) ACE: Hardware architecture から見た L3/L4 と L7 の違い に書かれているように、2 番目以降の request は FastPath で折り返しますので、http header を確認せず既存 connection が使用され続けます。 そのため、cookie が set されていたとしても、ACE はその cookie を確認しないため、既存 connection を使用し、sv1 に転送されてしまいました。 2 番目以降の request でも http header を確認したい場合、persistence-rebalance の設定が必要になります。
persistence-rebalance の動作については、ACE: persistence-rebalance に記載されているので合わせてご参照ください。