先日の続きになるが、PHPで書いたスクリプトで、クライアントの要求ごとにコネクションを生成するやつ。
次の日の朝、データベースのバックアップが走らなかった。
理由は。
そのPHPスクリプトがコネクションを食いつぶしていた。
コネクションを食いつぶすと、コネクションを獲得するまで待ち状態に入るため、Apacheのプロセスも激増。
そんなスクリプトなので当然タイムアウト処理も入っていないし、そもそも、悪意の持った人がそのスクリプトを100個同時に開いたりすれば一瞬で終わる。
ので、封鎖。
そして問題の速度制限。
これを回避する方法。
1. プロバをかえる
2. マルチセッションを張ってプロバイダを使い分けて、トラフィックを分散させる
1の方は、固定IPを変えなければならないのが面倒。
そこで、2を選択。
2を実現するには。
調べまくった結果、今のルータではできないことが判明。
つーか、その辺のルータ、マルチセッション対応とかいって全然対応してない。
PPPoE二つ同時にはじけるだけで、ルーティングが全然できない。
宛先のIPアドレスだけをみたルーティングしかできないマルチセッションなんてフレッツスクエア以外に何の使い道がある。
まともにマルチセッションを謳ってもいいルータは、廉価なものでは、BA8000Pro、BRL-04FMXくらいなわけだが、こいつらはNAPTセッション数の増大に弱く、結局うちのサーバじゃ使えない。
イロイロと紆余曲折はあったものの、最終的な選択は、ルータ二台でマルチセッション。
サーバをルータ化させることも考えたが、LAN内部からのパケットも全部吸い込むため、LAN内部からでかいファイルを高速で落とそうものなら、如実に影響が出そうなのでやめ。
結局、最終的なレイアウトは以下の通り。
光終端装置-HUB-+-ルータA-+
| |
+-ルータB-+-各マシンへ
ルータAのWAN側アドレスはPPPoE1、LAN側アドレスは192.168.0.1。
ルータBのWAN側アドレスはPPPoE2、LAN側アドレスは192.168.0.2。
これで各マシンはゲートウェイをどっちのルータにするかで、利用するPPPoEセッションを選択できる。
で、サーバ側はIPエイリアスを使って、内部IPを二つ持たせる。
サーバ1: 192.168.0.10
サーバ2: 192.168.0.11(エイリアス)
/etc/network/interfacesの内容
auto eth0
iface eth0 inet static
address 192.168.0.10
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
# Secondary IP Address
auto eth0:0
iface eth0:0 inet static
address 192.168.0.11
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
ルータ1はサーバへのマスカレードは192.168.0.10へ、ルータ2は192.168.0.11へおこなうようにする。
サーバ側では、192.168.0.10からのパケットは192.168.0.1をゲートウェイとし、192.168.0.11からのパケットは192.168.0.2をゲートウェイとすることにする。
この設定はiproute2でおこなう。
192.168.0.1は、インターフェイスの設定で、デフォルトゲートウェイとして自動で設定されるのでさわらない。
192.168.0.11に関する設定だけおこなう。
/etc/iproute/rt_tableに使うテーブル名をつっこんでおく。
1 router2
とでも。
ip rule add from 192.168.0.11 table router2 prio 10000
ip route add default via 192.168.0.2 table router2
これでいけた。
ルーティングを送信元ポートまでみておこなえれば、IPエイリアスやNIC二枚差しなんてしなくてもいけるんだけども、結局やり方がわからなかった。
誰かやり方知ってる人いませんか?
投稿者 邑波。 : 2006年06月13日 20:43