ある程度のアクセスが見込めるWEBサイトを構築する場合、おのずとWEBサーバーを複数台用意して負荷分散することになります。
お勤め先(BiG-NET)でも、最初は共用サーバーから初めて、事業が順調に拡大してスケールアウトを検討してほしいなーと思うお客様もいますが、そんな時にどうしても腰が重たくなるのは
「費用が…」
ということになります。
事業規模が拡大したら事務所を広いところに引っ越すように、WEBシステムもより大人数が対応できるような仕組みに引っ越すのがいいと思うんですけど、なかなかそうもいかないみたいですね。
今までに数回のやり取りで専用サーバーや仮想環境の構築などにさっくりとスケールアウトしたお客様は全くいないです。WEBサーバーにアクセスできなくなっても、売り上げが頭打ちになってもいいのかなーと思うのに「なんでだろう?」と不思議です。
かなり機会損失していると思うんですが…
なんだか愚痴のようになってきたけど、本当にもったいないと思うんです。
大手SIerが提案するようなすんごいシステムを構築しなくても、要所要所を押さえておけば、MyDNS.JPを使うことで、コストをあまりかけずにWEBシステムをより顧客が満足できるものに移行できます。
一台当たりのWEBサーバー(WEBxxx)で処理できる人数は限られていますので、あらかじめ想定される顧客の接続数からWEBサーバーの台数がおのずと決定されるかと思います。そうすると、そのWEBサーバーの数に応じてたいていはロードバランサ(LBxxx)やデータベースサーバー(DBxxx)、ログサーバー(LOGxxx)などを必要台数用意することになります。
Internet --------------------- WEB001 ------- DB001
↓
Internet ---+--- LB001 ---+--- WEB001 ---+--- DB001
| | |
+--- LB002 ---+--- WEB002 ---+--- DB002
| : |
+--- : ---+
| : |
+--- WEBxxx ---+--- LOG001
いままで1台とか2台でよかったのに、いきなりサーバーが倍以上に増えるわけですから、さすがに経営層からすると「コストが…」となるかと思います。
そんな時にはMyDNS.JPを使って、もう少し増やす台数を抑えてみるのはいかがでしょう?
Internet --------------------- WEB001 ------- DB001
↓
Internet -----------------+--- WEB001 ---+--- DB001
| |
+--- WEB002 ---+
| |
+--- WEB003 ---+
| |
+--- CHK001 ---+
※WEB001のIPアドレス : x.x.x.1
WEB002のIPアドレス : x.x.x.2
WEB003のIPアドレス : x.x.x.3
この構成にはロードバランサ(LBxxx)がありませんが、このロードバランサの役割をMyDNS.JPにさせるのです。
「なーんだ、それじゃただのDNSによるラウンドロビンじゃないか」と思うかもしれません。
確かにDNSによるラウンドロビンなのですが、利用するDNSサービスにフェイルオーバーのような仕組みがないと、WEBサーバーのうち一台に障害が発生したときに切り離しができません。
MyDNS.JPでしたら「DIRECT IP」(直接IP通知)機能を使うことで、この障害発生時の切り離しや自動復旧が可能になります。
まずはMyDNS.JPでID(=親ID:mydns000000)を一つ取得して、ドメイン情報を設定します。(例えば「test.mydns.jp」)
そして、この親IDで、別途子IDを必要分だけ取得します。
mydns111111 WEB001用とする
mydns222222 WEB002用とする
mydns333333 WEB003用とする
そして、「親ID」のドメイン情報のホストとして、以下のように設定します。
www A 子ID(mydns111111)
www A 子ID(mydns222222)
www A 子ID(mydns333333)
※子IDに委譲(DELEGATE)しないでAレコードとして、IPアドレスの関連付けで子IDを選択するのがポイント)
そうしたら、WEBサーバーから、もしくは監視サーバー(CHKxxx)から「DIRECT IP」で各WEBサーバーのIPアドレスを通知します。
wget -O - 'http://www.mydns.jp/directip.html?MID=mydns111111&PWD=password111&IPV4ADDR=x.x.x.1'
wget -O - 'http://www.mydns.jp/directip.html?MID=mydns222222&PWD=password222&IPV4ADDR=x.x.x.2'
wget -O - 'http://www.mydns.jp/directip.html?MID=mydns333333&PWD=password333&IPV4ADDR=x.x.x.3'
※ここでは、wgetを使って通知をしている。
こうすることで、「www.test.mydns.jp」のIPアドレスを問い合わせると
dig www.test.mydns.jp A
:
www.lvs.pgw.jp. 300 IN A x.x.x.2
www.lvs.pgw.jp. 300 IN A x.x.x.1
www.lvs.pgw.jp. 300 IN A x.x.x.3
:
dig www.test.mydns.jp A
:
www.lvs.pgw.jp. 300 IN A x.x.x.3
www.lvs.pgw.jp. 300 IN A x.x.x.2
www.lvs.pgw.jp. 300 IN A x.x.x.1
:
のように複数が返ります。(そしてほとんどのクライアントは最初のIPアドレスにアクセスします)
ここまでだと普通のDNSラウンドロビンですが、監視サーバーから各WEBサーバーの死活監視をします。
例えばpingでもいいですし、80番ポートの反応を見てもいいですし、SNMPでもいいと思います。
もしWEBサーバーに何らかの障害が発生して反応がなかったり、著しく高負荷だった場合には、「www.test.mydns.jp」から切り離す事になります。
この切り離し方法として、対象となるWEBサーバーのIPアドレスに「0.0.0.0」を設定すると、MyDNS.JPはそのIPアドレスを含まない情報を返すようになります。
wget -O - 'http://www.mydns.jp/directip.html?MID=mydns222222&PWD=password222&IPV4ADDR=0.0.0.0
※WEB002を切り離す場合。
こうすることで、「www.test.mydns.jp」のIPアドレスを問い合わせると、DNS情報のキャッシュの残り時間にもよりますが、
dig www.test.mydns.jp A
:
www.lvs.pgw.jp. 300 IN A x.x.x.3
www.lvs.pgw.jp. 300 IN A x.x.x.1
:
のようにして、「www.test.mydns.jp」からWEB002(x.x.x.2)の切り離しをすることができます。
WEBサーバーが復活したら、またそのWEBサーバーのIPアドレスを通知すればDNS情報に含まれますので、ラウンドロビンの仲間入りとなります。
…いかがでしょうか?
まぁ今回は分散の概要だけでしたが、では監視は実際にどうするんだ?というのは、スクリプトを書いたりプログラムができる人なら簡単かと思います。他にも、WEBサーバーを複数にするのでコンテンツの共有はどうするんだ?とか(NFSですかね)、既存のWEBシステムのセッション管理は大丈夫か?とか、ECサイトの場合には、決済システムがアクセス増加に耐えられるかどうか?というようなことも肝にはなってきますけど…
でも、もったいないよりはいいと思うんですけど?
高いロードバランサを使わなくても、これならVPSを必要台数借りるだけでも実現できるので、コストも抑えられるし簡単だと思いますがいかがでしょうか?
よくわからないけど、うちのWEBサーバーも分散したいからやって!!という方は、ぜひともお勤め先(BiG-NET)にご連絡ください。お安くやれるかもしれません。 🙂