冗長化(HA)への考察

作成日:2004年11月16日
最終更新日:2004年11月16日

Squid Homeへ】

プロキシを利用する場合、セキュリティ面から考慮するなら、、「透過Proxy」として設計するよりも、クライアントのブラウザや関連ソフトで、プロキシの利用を明示的に行う方法が良いと思います。(この理由に関しては機会があれば記述します)

プロキシの指定を明示的に行う場合、指定したプロキシが何らかの理由で停止した場合、インターネットへのアクセスがすべてのクライアントで出来なくなってしまう事になり、運用面から考えると何らかの代替えの方法を確立する必要がある事は明らかです。

■DNSによる冗長化に関して:

真っ先に思い浮かぶ冗長化の方法は、プロキシサーバを複数台用意しておき1台が停止しても他のプロキシで代替えする方法が思いつきます。
しかし、この方法で検討する必要があるのは、如何にして各ユーザのクライアント環境に影響を与える事無く代替えのプロキシを使わせるかでしょう。

単純なのは、DNSの指定によってプロキシを代替えのマシンのIPアドレスに切り替える方法でしょう。
しかし、この方法は多分うまく行きません。 一般的なクライアントではDNSのが一度行われると、その際に検索したアドレスを数十分、場合によっては数時間クライアントPC内に保持してしまいます。
このため、DNSでIPアドレスを切り替えても相変わらず昔のプロキシを探しにいってしまうことでしょう。

(古いプロキシを見に行ってしまう概念図)

勿論、各クライアントでDNSキャッシュをリフレッシュを手動で行うことで、正常なプロキシを見にいくようにさせる事は可能ですが現実的では無いと思われます。
なお、DNSラウンドロビンによって"proxy"という名前に複数のIPアドレスを定義したとしても、同じ理由によって問題が発生する事でしょう。

■クラスタサーバによる冗長化に関して:

予算が潤沢な企業であれば、複数のプロキシサーバをクラスタとして設計して、代替えのプロキシサーバをホットスタンドバイさせて、主系のサーバが停止した場合に、同じIPアドレスや環境で代替えのプロキシを自動的に切り替える方法もあります。 

(クラスタによる切り替え概念図)

ただし、クラスタは常にシステムが2倍以上のコスト高になる可能性があり、コスト面からは最適ではないかも知れません。

■スクリプトによる冗長化に関して:

IEやNetscapeには、プロキシの設定をスクリプト(Javascript)で定義する方法が用意されています。 この機能を使うことで、プロシキの設定を環境に合わせて柔軟に切り替える事が可能になります。 また、スクリプトを使った場合、常に使用するプロキシが使えない場合に、セカンダリのプロキシを複数指定できるので、これを使った経路の冗長化が可能になります。
スクリプトとして、以下のようなスクリプト(proxy.pac)を紹介します。

このスクリプトでは、例えば東京のセグメントにあるクライアントは、プロキシとして"proxy-tk"を通常は利用し、"proxy-tk"が反応しないときには自動的に"proxy-osaka"を使うようになっています。

// (proxy.pac)
// このJavascriptでは、
// 社内全体のネット : 172.16.0.0/12 (172.16.0.0 - 172.31.255.255)
// Tokyo-LAN(東京) : 172.16.0.0/16
// Osaka-LAN(大阪) : 172.17.0.0/16
// Fukuoka-LAN(福岡) : 172.18.0.0/16
// として、各拠点にプロキシを配置し、それぞれのセグメントに接続された時に最寄りのプロキシを
// 自動的に選択する処理を行う。 // もし、最寄りのプロキシが反応しない場合にはサブのプロキシを使うようにする。
// また、社内のWebサーバへのアクセスにはプロキシを経由しないようにする。
//
function FindProxyForURL(url, host) {
MyDomain = ".hogehoge.jp";
MyIP = myIpAddress();
NetworkID = 0 ; // Default = 0(Tokyo), 1(Osaka), 2(Fukuoka)
ProxyTokyo="PROXY proxy-tk.hogehoge.jp:8080; PROXY proxy-osaka.toshiba-tops.co.jp:8080" ;
ProxyOsaka="PROXY proxy-osaka.hogehoge.jp:8080; PROXY proxy-tk.toshiba-tops.co.jp:8080" ;
ProxyFukuoka="PROXY proxy-fukuoka.hogehoge.jp:8080; PROXY proxy-tk.toshiba-tops.co.jp:8080" ;

// まず、社内のWebサーバのアクセスかどうかを確認。
if ( isInNet(host, "172.16.0.0" , "255.240.0.0" ) || dnsDomainIs(host, MyDomain) || isPlainHostName(host) ) {
return "DIRECT" ;
}

if (isInNet(MyIP, "172.17.0.0", "255.255.0.0")) NetworkID = 1 ;
if (isInNet(MyIP, "172.18.0.0", "255.255.0.0")) NetworkID = 2 ;

switch ( NetworkID ) {
case 1: // 大阪LAN
return ProxyOsaka ;
break;
case 2: // 福岡LAN
return ProxyFukuoka ;
break;
default: // 東京LAN
return ProxyTokyo ;
break;
}
}


このスクリプトを作成したなら、これを有効にするには2つの方法が考えられます。 

1つは、このスクリプトをイントラのWebサーバに登録しておき、そのWebサーバをブラウザで指定する方法です。

しかし、この場合には万一イントラのWebサーバが障害を起こした場合には、結局のところプロキシを利用できなくなってしまうので、根本的な問題の解にはなりません。

もう1つは、このスクリプトを自分のPCに保存しておき、呼び出す方法です。
以下の例では、C:\My Document\proxy.pacを呼び出しています。

※ NetscapeやMozillaなどでは、ファイルの指定の際のドライブの指定は"c:"ではなく"c|"とする。(例:file://c|/My Document/proxy.pac)

この方法であれば、設定は各クライアントに必要となるが、確実に経路を冗長化させることができます。


Squid Homeへ】

Copyright© 1998-2003 ROBATA.ORG