負荷分散

ネットワーク負荷・サーバー負荷に関してはかなり専門的分野だったり、エンジニアさん専門のコテコテ技術だったりするのでありまして、Web制作をしているクリエイターといえどもレンタルサーバーなんかの場合だと負荷分散っていってもゴリゴリと専門的な技術でもってカスタマイズする機会は殆どできないわけで、結局これらの技術は一般的に必要に迫られることは殆どないわけですが、ここではレンタルサーバーでも何とか負荷分散できる技術を二つ紹介します。前提としては.htaccessファイルが使えることと、独自ドメインの設定をしていて、DNSサーバーでゾーンファイルなどの設定変更が行えるというのが前提になります。ゾーンファイルを直接編集できなくても一部だけWEBページ上から編集可能であったりすることでもできたり、条件はいろいろなので一概には設定可能かどうかは確かめてみないとわからないのですが、一時的なアクセス集中でサーバー負荷がひどい場合には、そこそこ使える技術ですので試してみてください。
負荷分散技術の前提になる部分の知識なのですが、サーバーには唯一のファイルがある…というのが一応表面上の前提になっていますが、唯一のファイルにアクセスする際に同様にして唯一のサーバーだったらアクセス集中の際にはパンクしてしまいます。ですので、唯一のファイルをミラーリング(ほかのサーバーにコピー)してからアクセスをそれぞれの複数のサーバーに分散させるというのが負荷分散です。で、ある一つのURLにアクセスすると当然同じ内容のページにアクセスできるのですが、そのアクセス先がどのサーバーであるのかというのは任意であるということになります。ですので、サーバーが一つ壊れてしまっても残っているサーバに同様のコンテンツがあれば特に問題はないということになります。Googleでは負荷分散やHDDが物理的に壊れてしまうというリスクに対して常に同じ内容を4〜5カ所で保存しているそうです。あくまでも噂ですが、まんざら嘘ではなさそうです。
しかし負荷分散にも2種類あることを覚えておいてください。
一つは転送量の負荷、もう一つはサーバーの情報処理の負荷です。前者はネットワークの転送量の問題、後者はサーバーそれ自体の性能やメモリ、CPUなどの処理系の問題であるということです。どちらの負荷を分散してゆくかというのもその状況に応じてということになります。
この負荷分散の際にはPerlやPHPなどの言語でIPで振り分けたりとかいろいろできるわけなのですが、この際にはオーバーヘッドという問題があって、負荷分散プログラムそのものが負荷をかける…という本末転倒なことになってしまう場合もあります。負荷分散プログラムが負荷をかけてしまうのは、サーバー自体がその処理をしているのですから当然といえば当然ということになります。負荷分散処理(特にWEBサーバーの場合)はそのサーバーの外で負荷分散処理をするのが基本です。ここで紹介するのは、.htaccessを使って比較的オーバーヘッドの少ないモジュールを使ってしまおうというやり方と、DNSサーバーという外部のサーバーでそもそもの分散作業を行ってしまおうという方法です。

ReWrite

Apache2にはReWriteモジュールなるものがあります。mod_rewriteというものでApacheサーバーでしたらどのサーバーにも導入が可能です。たいていの場合は最初からインストールされていて使えるようになっているはずです。ReWriteモジュールは設定したパスに対して、複数の場所へリダイレクトできるというものです。たったこれだけの機能なので結構楽に設定できます。(気楽ではあるのですが、実際には難しい正規表現を考えたりと厄介ではありますが)
まず、http://www.omnioo.com/というパスがあったとして、それらの分散として、もう2つのミラーサーバーを用意します。http://sub1.omnioo.com/とhttp://www.omnioo.com/だとすると、

[.htaccess]
# Rewriteエンジンの有効化
RewriteEngine On # OnとかOffで設定(デフォルトではOffになっているはず)
# 書き換え基準のパス設定
RewriteBase / # Apacheで設定したDocumentRootを基準に/(ROOT)以下のパスを設定できます。
# リダイレクトの条件設定
# IPアドレスの末尾が奇数の場合はMirror1へリダイレクト
RewriteCond %{REMOTE_ADDR} (1¦3¦5¦7¦9)$
RewriteRule images/(.*) http://www.omnioo.com/images/$1 [R,L]
# 上記に合致しないものはMirror2へリダイレクト
RewriteRule images/(.*) http://www.omnioo.com/images/$1 [R,L]

このやり方ですと、IPアドレスの末尾の数字が1|3|5|7|9(奇数)の場合には/images/ディレクトリ以下のファイルがリダイレクトされ他のミラーサーバーから転送されることになります。いずれにしろミラーサーバーをこしらえないことには使う意味がないんですが、ミラーリングもrsyncを使えば比較的簡単にできるので負荷がきわめて深刻な場合は是非試してみてください。少なくとも上記のやり方では負荷が2分の1になります。

ラウンドロビン

DNSサーバーの通称ラウンドロビンと言われる手法も比較的一般的です。DNSについてここでは詳しく触れませんが、DNSサーバーで行われていることは「どのドメインにどのIPが合致しているのか調べる」機能が主な仕事であり、仮にomnioo.comのドメインが121.2.73.119のIPとわかるためにはDNSサーバーに問い合わせてみてその結果を得ているのです。この際に、omnioo.comのIPを複数設定することができれば先のmod_rewriteと同じように同じドメインで複数のサーバーに向けてクライアントを振り分けることができるのです。
ラウンドロビンの負荷分散では、DNSのAレコード(など)を複数設定して、DNSサーバー(たいていはbind)の接続できないレコード情報をスキップして次のレコードを検索するという性質を利用します。この性質を利用すると複数のサーバーを設定するだけで接続できないサーバーを自動的にスキップするので、負荷がかかった接続しづらいサーバーを自動的に選択して接続できるというわけです。設定方法・記述方法は非常に簡単でゾーンファイルに以下のように書きます。

omnioo.com IN A 192.168.1.2
omnioo.com IN A 192.168.1.3
omnioo.com IN A 192.168.1.4

1つのドメインに対して複数のIPアドレスを指定してあげることによって、上から順番に接続してゆきます。いわゆるロードバランサー(最近はいろいろなロードバランサーがありますが)は基本的にはこのDNSの機能を使っています。

Last update: 2016.09.06 (火)