Web サーバー/スレーブDB サーバー間の負荷分散
Webサーバー群とスレーブDBサーバー群の間のSQLクエリ分散(クエリの振り分け)には、DNSラウンドロビンを利用している。これは、DNSサーバーに特定のホスト名で問い合わせを行なうと、問い合わせのたびに異なるIPアドレスを返す仕組みである。DeNAでもモバオクサービス開始時から利用しており、実績のある仕組みである。
このような負荷分散には比較的高価な専用ハードウェア(L4スイッチやアプリケーションレイヤスイッチと呼ばれる)か、フリーのLinux Virtual Server(以下、LVS)を使うことが多いが、特定のハードウェアにトラフィックを集める必要があるので、その点がボトルネックになりやすいという問題がある。LVSはDirect Server Return(以下、DSR)という機能を持っており、リクエストだけを負荷分散サーバーで受けて複数の実サーバーに振り分け、レスポンスは実サーバーから直接リクエスト元に返すことが可能である。ブラウザとWebサーバー間のHTTPトラフィックの場合、一般的にリクエストパケットはレスポンスパケットの100分の1以下となるため、この方法は有効とされている。
では、この方法はWebサーバー/DBサーバー間の負荷分散にも応用できるのだろうか?
図4-1~3は、ある日のモバゲータウン日記機能のスレーブDBトラフィックを示している。これらを見るとWebサーバーからのリクエストのトラフィックと、それに対するレスポンスのトラフィックに大きな差はない。つまり、DSRを使ったとしてもボトルネックを回避する方法にはならない。このリクエスト/レスポンストラフィックの比率は利用するSQLによっても異なる可能性があるが、DNSラウンドロビンの場合、WebサーバーとDBサーバーは、特定のハードウェアを介さずに直接通信できるため、このボトルネックがまったく発生しないというメリットがある。
ただし、DNSラウンドロビンには、次のような問題点が存在している。
分散比率の制御
DNSラウンドロビンは、均等にクエリを分散する。例えば、4台のスレーブサーバーが存在する場合、1台に対するクエリは4分の1となる。スレーブ群にサーバーを追加していく際に処理能力の異なるサーバーが混在すると、スレーブサーバーごとの処理能力に応じた分散制御ができず、レスポンスに差が生じることになる。
スレーブ群全体としての性能を最大化させるためには、この分散比率の制御が必要となってくる。
障害時の対応
DNSラウンドロビンは、耐故障性を備えていない。DNSラウンドロビンで返されたIPアドレスに接続できない場合の対応として、DeNAでは独自に開発したDB接続フレームワークを用意している。このフレームは、ほかに返されたIPアドレスに接続させる機能を持っているが、リトライのコストがかかるためスレーブサーバーに障害が発生した場合は手動でDNSから切り離す必要がある。
一般的なBIND namedなどでDNSサーバーを運用する場合、IPアドレスとホスト名の関連付けはゾーンファイルというフラットファイルで管理するが、ゾーンファイルで数百台のマシンの状態管理まで行なうことはかなりの労力を必要とする。