From yasuhiko.sakaida @ gmail.com Tue Apr 27 14:01:16 2010 From: yasuhiko.sakaida @ gmail.com (=?ISO-2022-JP?B?GyRCOmQwZkVESl1JJxsoQg==?=) Date: Tue, 27 Apr 2010 14:01:16 +0900 Subject: [Ultramonkey-l7-users 359] Re: =?iso-2022-jp?b?Q295b3RlIEVxdWFsaXplchskQiROGyhCcXVpZXNjaW5n?= =?iso-2022-jp?b?GyRCQF9EaiRLMzpFdiQ5JGs1IUc9GyhC?= In-Reply-To: References: <4BCFFC0C.5050402@nttcom.co.jp> <4BD02D6F.1030309@nttcom.co.jp> Message-ID: 田沼様 ご返信ありがとうございます。 ご指摘いただいた通り、Apache2.0のKeepAliveTimeoutが15に設定されていました。 試しに30に変更したところ、今度は30秒後にFIN ACKがUltramonkey-L7から送信されていました。 RealServerのタイムアウトを調整して対応いたします。 -- 坂井田保彦 2010年4月26日1:11 Kohei TANUMA : > 坂井田 様 > > 田沼です。 > >> パケットをキャプチャして試してみたところコネクション確立してから15秒くらいで、Ultramonkey-L7側からFIN ACKが送信されてきています。 >> クライアントとVirtualServiceとのコネクションタイムアウトは任意の値に設定することができるのですか? > > 設定することはできません。 > 基本的に、UltraMonkeyからクライアントやRealServerとの接続を > 切断し始めることはないです。 > > ただし、 > クライアント --- UltraMonkey --- RealServer > と確立された状態から > クライアント --- UltraMonkey --x RealServer > のようにRealServerとの接続が切断されると、クライアント側を切断しにかかります。 > クライアント --x UltraMonkey --x RealServer > ※ x がある方から切断したと考えてください > > また、クライアントからコネクションを切断された場合も同様で > クライアント --- UltraMonkey --- RealServer > クライアント x-- UltraMonkey --- RealServer > クライアント x-- UltraMonkey x-- RealServer > このようにRealServerとの接続を切ります。 > > 以下は予想ですが、RealServerがApacheのデフォルト設定だとすると > KeepAliveTimeoutが15秒に設定されています。 > また、通常のブラウザは Connection: keep-alive でリクエスト送信します。 > Apacheはレスポンス送信後に即UltraMonkeyとのコネクションを切断せず > 15秒間次のリクエストを待ってから、UltraMonkeyとの接続を切断します。 > UltraMonkeyはRealServerとの接続が切断されたので、クライアント側も > 切断しようとして、ここでFIN,ACKが送信されたのだと考えられます。 > > クライアントとUltraMonkeyのコネクションが維持される時間は > UltraMonkeyとRealServerのコネクションが維持される時間と > 同じと考えていいと思いますので、もしこの時間を15秒より長くしたいとか > 短くしたいといった場合にはApacheの設定を変えればいいのではないかと > 思います。 > > > 2010年4月23日17:08 坂井田保彦 : >> 田沼様 >> >> 坂井田です。 >> 大変有益な情報ありがとうございます。教えていただいた内容で試してみました。 >> weightの値を0にすることで新規コネクションを張れなくなる。 >> ただし、--uri-pattern-matchとマッチするURLの場合は新規コネクションを張ることができる。 >> ということを確認しました。 >> >> これは私が求めていた機能です。ありがとうございました。 >> >> またちょっと別の質問なのですが、 >> パケットをキャプチャして試してみたところコネクション確立してから15秒くらいで、Ultramonkey-L7側からFIN ACKが送信されてきています。 >> クライアントとVirtualServiceとのコネクションタイムアウトは任意の値に設定することができるのですか? >> >> -- >> 坂井田保彦 >> >> >> 2010年4月22日20:05 Kohei TANUMA : >>> 坂井田 様 >>> >>> 田沼です。 >>> >>> 長文で失礼します。 >>> この条件であれば可能だと考えます。 >>> >>> 以下に設定と動作例を記述しますので、 >>> 要件と合いそうでしたら実際に確認してみてください。 >>> >>> >>> ■ 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 : >>>>> 酒井田 様 >>>>> >>>>> 田沼と申します。 >>>>> >>>>>> 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) >>>>> >>>>> 以上、ご確認ください。 >