Kohei TANUMA
tanum****@nttco*****
2010年 4月 22日 (木) 20:05:19 JST
坂井田 様 田沼です。 長文で失礼します。 この条件であれば可能だと考えます。 以下に設定と動作例を記述しますので、 要件と合いそうでしたら実際に確認してみてください。 ■ l7directord.cf (1) virtual = 192.168.0.100:80 real = 192.168.0.101:80 module = url --uri-pattern-match '\?.*WEB1' virtual = 192.168.0.100:80 real = 192.168.0.102:80 module = url --uri-pattern-match '\?.*WEB2' virtual = 192.168.0.100:80 real = 192.168.0.103:80 module = url --uri-pattern-match '\?.*WEB3' virtual = 192.168.0.100:80 real = 192.168.0.101:80 real = 192.168.0.102:80 real = 192.168.0.103:80 module = sessionless ※補足 192.168.0.100 は振り分けを行う IP アドレス virtual = 0.0.0.0:80 とするとサーバが持つ全 IP アドレスで待つこともできます。 192.168.0.101 : WEB1 に対応するサーバの IP アドレス 192.168.0.102 : WEB2 に対応するサーバの IP アドレス 192.168.0.103 : WEB3 に対応するサーバの IP アドレス ■ 動作確認 (1) 1. セッション ID(WEBx) を含まない場合 ラウンドロビンで割り振られます % links -dump http://192.168.0.100/ WEB1 % links -dump http://192.168.0.100/ WEB2 % links -dump http://192.168.0.100/ WEB3 % links -dump http://192.168.0.100/ WEB1 2. セッション ID(WEBx) を含む場合 事前に設定したサーバに振られます % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB1' WEB1 % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB1' WEB1 % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB2' WEB2 % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB2' WEB2 % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB3' WEB3 % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB3' WEB3 ■ l7directord.cf (2) quiescing 設定に該当する機能を設定します。 4 番目の virtual 内の real の最後に 0 をつけます。 設定変更後 service l7directord reload で反映します。 virtual = 192.168.0.100:80 real = 192.168.0.101:80 module = url --uri-pattern-match '\?.*WEB1' virtual = 192.168.0.100:80 real = 192.168.0.102:80 module = url --uri-pattern-match '\?.*WEB2' virtual = 192.168.0.100:80 real = 192.168.0.103:80 module = url --uri-pattern-match '\?.*WEB3' virtual = 192.168.0.100:80 real = 192.168.0.101:80 0 real = 192.168.0.102:80 0 real = 192.168.0.103:80 0 module = sessionless ■ 動作確認 (2) 1. セッション ID(WEBx) を含まない場合 新規セッションのため切断されます % links -dump http://192.168.0.100/ Error reading from socket % links -dump 'http://192.168.0.100/?jsessionid=abcd1234' Error reading from socket 2. セッション ID(WEBx) を含む場合 今までどおり事前に設定したサーバに振られます % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB1' WEB1 % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB1' WEB1 % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB2' WEB2 % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB2' WEB2 % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB3' WEB3 % links -dump 'http://192.168.0.100/?jsessionid=abcd1234.WEB3' WEB3 ■ 動作概要 l7vsadm -K -n コマンドで設定した振り分けルールが表示されます。 % l7vsadm -K -n (略) TCP 192.168.0.100:80 url rr 0 --uri-pattern-match \?.*WEB1 -> 192.168.0.101:80 Masq 1 0 0 TCP 192.168.0.100:80 url rr 0 --uri-pattern-match \?.*WEB2 -> 192.168.0.102:80 Masq 1 0 0 TCP 192.168.0.100:80 url rr 0 --uri-pattern-match \?.*WEB3 -> 192.168.0.103:80 Masq 1 0 0 TCP 192.168.0.100:80 sessionless rr 1 -> 192.168.0.101:80 Masq 1 0 0 -> 192.168.0.102:80 Masq 1 0 0 -> 192.168.0.103:80 Masq 1 0 0 クライアントからの接続があると上記のルールが上から順に評価されます。 なんとなくわかるかもしれませんが、上から 3 個のルールが URL による振り分けで URI に対して正規表現によるパターンマッチを 行って、正常にマッチした場合は対応するサーバに振ります。 どれにもマッチしなかった場合は 4 個目のルールで 3 台のどれかに 振られます。 ※ 正規表現をもう少し厳密にした方がよいかもしれません ただし、l7directord による正規表現の () などの使用には バグがあるようで、うまく設定できません l7directord.cf の real 行の最後に 0 をつけて反映させると 上記振り分けルールの weight 列が 0 に変わり、その RealServer に 対する新規接続が拒否されます。 4 個目のルールにのみ 0 をつけているので、 WEBx のセッション ID を持つクライアントは振り分けが 行われて、WEBx のセッション ID を持たないクライアントだけが どこにも接続できずに切断されます。 % l7vsadm -K -n (略) TCP 192.168.0.100:80 url rr 0 --uri-pattern-match \?.*WEB1 -> 192.168.0.101:80 Masq 1 0 0 TCP 192.168.0.100:80 url rr 0 --uri-pattern-match \?.*WEB2 -> 192.168.0.102:80 Masq 1 0 0 TCP 192.168.0.100:80 url rr 0 --uri-pattern-match \?.*WEB3 -> 192.168.0.103:80 Masq 1 0 0 TCP 192.168.0.100:80 sessionless rr 1 -> 192.168.0.101:80 Masq 0 0 0 -> 192.168.0.102:80 Masq 0 0 0 -> 192.168.0.103:80 Masq 0 0 0 この設定の仕方(同一の IP:PORT を複数の virtual に設定する)は 多少特殊でドキュメント等にも記載されていないかもしれません。 不明な点がありましたらご連絡ください。 以上です。 2010/04/22 17:32, 坂井田保彦 wrote: > 田沼様 > > 教えていただいてありがとうございます。 > > 私がUltramonkey-L7のURLパーシステンスで評価したいセッションIDは > 例2のような固定文字列のセッションIDになります。 > > ただ。。。厳密に言うとランダムな文字列と固定文字列(例1と例2の複合形)で構成されるセッションIDの中から > 固定部分文字列を探しだし、どのRealServerに振り分けるかを評価したいです。 > つまり以下のような形になります。 > > (例1と例2の複合形: index.jsp?jsessionid=138a3bd28357fc7aa9e8.WEB1 > > ただし、ランダムな文字列には固定文字列として与えられる値と等しい文字列は生成されない前提です。 > 以下だとWEB1に振り分けるのか、WEB2に振り分けるのか。。。 > > (これは無い: index.jsp?jsessionid=138a3bd2WEB2fc7aa9e8.WEB1 > > ※固定文字列にはWEB1、WEB2、WEB3のいずれかが入ります。 > このときランダム文字列部分も固定文字列になりえる値、すなわち > WEB1、WEB2、WEB3は生成されることはない、ということです。 > > -- > 坂井田保彦 > > 2010年4月22日16:34 Kohei TANUMA <tanum****@nttco*****>: >> 酒井田 様 >> >> 田沼と申します。 >> >>> Ultramonkey-L7には、Coyote Equalizerのquiescing設定に該当する機能はありますか? >>> これは、quiescing設定がONになった以降、設定対象のRealServerには新規コネクションを確立しない機能です。 >>> ただし、設定ONになる以前のコネクションについてはそのまま保持されます。 >> UltraMonkey-L7 にも上記と同等の機能が存在します。 >> >>> また、URLパーシステンス機能の優先度はquiescing設定よりも高いと評価されます。 >>> そのため、設定ONになる直前にURLパーシステンスが必要なHTTPリクエストがあった場合は >>> トランザクション完了までは例外として、設定ONにされたRealServerに対しても新規コネクションを確立することができます。 >> UltraMonkey-L7 では quiescing 設定と同等の機能を ON にした >> RealServer には確立済みのコネクション以外は接続できなくなります。 >> そのため、上記のように優先的に接続するのは難しいと考えます。 >> >> ただ、条件によっては可能かもしれませんので、 >> ここでおっしゃっている URL パーシステンス機能がどのようなものを >> 指すのか確認させていただけますでしょうか。 >> >> トランザクション完了までは新規コネクションも許可するということは >> URL にセッション ID が埋め込まれたアクセスは許可するということ >> でしょうか。 >> もしそうだとした場合、セッション ID はどのようなフォーマットに >> なりますでしょうか。 >> (例1: index.jsp?jsessionid=138a3bd28357fc7aa9e8... >> のようなランダムな文字列のセッション ID) >> (例2: index.jsp?SID=WEB1 >> のような固定文字列のセッション ID) >> >> 以上、ご確認ください。