DNSラウンドロビンで負荷分散

複数のサーバーに同じコンテンツを置いて、DNSラウンドロビンで負荷分散する方法について書きます。

複数のサーバーに同じコンテンツを置くには、それぞれのサーバーにFTPでアップロードするか、なんらかの方法で同期させます。
lsyncd + rsyncd を使って自動同期させる方法もあります。別の投稿で書いていますので参考にしてください。

■ DNSラウンドロビン

DNSラウンドロビンとは、非常に単純な方法です。

設定としては、DNSサーバーあるいはレンタルDNSのゾーン設定において、1つのホスト名のゾーンタイプ A (IPアドレスの指定)を複数行設定し、1つのホスト名に複数のIPアドレスを割り付けます。

これだけです。

例)

domain.com.zone


...
...

www 	IN	A	111.111.111.111
www 	IN	A	111.111.111.222
www 	IN	A	111.111.111.333

A を複数設定しておくと、DNS正引きに対して設定されたIPアドレスのいずれかが返されます。

この例で、http://www.domain.com へのアクセスは、ときに 111.111.111.111、またときには 111.111.111.222 または 111.111.111.333 のサーバーへのアクセスになります。
完全にではありませんが、まあまあ、おおよそ均等にアクセスされると期待できますので負荷分散になります。

■ DNSラウンドロビンの注意点

DNSラウンドロビンを行うときに注意することは、全てのサーバー上のコンテンツ、ブラウザに表示させるものを常に同じにしておくことです。
タイムラグができるだけ少なく、常に完全に同期させておくこと。

ブログ/CMS系のホームページの場合、コンテンツのデータ部分がデータベースにあるときは要注意です。
MySQL/PostgreSQLなどのデータベースを分散サーバー全てで同じように動かし、DBデータを常に同期するのは得策ではないです。レプリケーション(DBを複製させる機能)で同期させることもできますがお勧めしません。
制約として、DBデータを更新するサーバーは常にどれか1つをマスター、他をスレーブとするルールが必要になってきて運用が難しいです。
(トラックバックやゲストが書き込めるような機能は極力止めなければなりません)

一般的には、別途DB専用サーバーを用意し、DNSラウンドロビンするWebサーバーからラウンドロビンしないDBサーバーへDBアクセスさせるようにします。
これにより、DBデータを更新するサーバーは常にラウンドロビンの影響を受けないようにします。

似たようなことで、昔ながらの掲示板CGIというのがあります。
これはデータがDBへ格納するようになっていないものがほとんどで、データの更新がブラウザからインタラクティブに行えるので要注意、原則運用不可です。
仮にDNSラウンドロビンで実体の違う複数のサーバー(しかし同じURL)の掲示板に同時に別々の訪問者が書き込んだら、どれを正として同期したらいいかわかりませんよね。

ですから、ブラウザからインタラクティブに更新でき、そのデータがそのサーバーに保存されるタイプのホームページはDNSラウンドロビンでは原則運用不可になります。

コメントを残す