【設計】ロードバランス / 負荷分散

はじめに

 * ロードバランス = Load balancing = 負荷分散

分散方式

 * 分散方式には、大きく分けて、以下の2つに分けられる

 [1] 静的分散方式
   => あらかじめ決めた順序でリクエストを各サーバに振り分ける方式
 [2] 動的分散方式
   => 振り分け時に最適なサーバを選択し、リクエストを振り分ける方式

[1] 静的分散方式

 [1-1] ラウンドロビンDNS(Round Robin DNS)
   * DNSサーバーのレコードにおいて、同一のホスト名に対して複数のサーバーのIPアドレスを登録しておく方法
   => DNSサーバーは、問い合わせに対し、登録されたIPアドレスを順繰りに返答していくので、
      結果的に複数のサーバーにアクセスが分散する。
  [デメリット]
   * もし、振り分け先のサーバーが故障しても、DNSサーバーは検知できないので、
     そのサーバーにもリクエストを振り分け続けてしまう
   * 性能のいいサーバーだろうが、負荷の高いサーバーだろうが、関係なく振り分けてしまう

 [1-2] 静的な重み付きラウンドロビン
   * 各サーバーへの振り分けを均等ではなく、異なる割合で振り分ける方法
   => 例えば、もっとも処理能力の高いサーバーに多くのリクエストを振り分けるといった重み付けが可能

[2] 動的分散方式

 [2-1] 最小コネクション(Least Connection)
   * コネクション数が一番少ないサーバーに割り振る
 [2-2] 最速応答(Fastest)
   * 一番応答が速いサーバーに割り振る
 [2-3] 最小データ通信量
   * 転送したデータ量が少ないサーバに優先的にリクエストを振り分ける
 [2-4] CPU負荷分散(CPU Load)
   * CPU負荷が一番軽いサーバーに割り振る

ロードバランスの必須機能

1) ヘルスチェック : サーバーの状態を把握する
2) セッション維持 : 同じクライアントのリクエストを継続的に同一のサーバーに振り当てる

1) ヘルスチェック

必要性

 * 以下の理由から、ロードバランサー側は、サーバーの動作状態をきちんと把握する必要がある。
  1) サーバーに障害が発生したら、ロードバランサは振り分け対象からそのサーバーをいち早く外し、
     別のサーバーに処理を引き継がなければならないため
  2) 負荷の高いサーバーがあれば、そのサーバーへのリクエストの振り分けの数は絞る必要があるため

実現方法

1) Pingを定期的にサーバーに送信
2) TCPでセッションを張る
3) HTTPなどで実際にデータの送受信を行なう

2) セッション維持

 * 同一クライアントからの要求は、同一サーバに固定的に割り振り、同一サーバを使ってセッションを維持する

必要性

ロードバランシングを用いて、リクエストを振り分けると複数のサーバーを有効活用できる。
しかし、オンラインショッピングのように、品物をカートに入れ、決済を行なうという一連の手続きが発生すると、
クライアントからのリクエストが、異なるサーバーに振り分けられると、どの商品をカートに入れたかわからないので、
エラーが発生してしまう

そのため...
 * 1つのトランザクションを継続して特定のサーバーに振り分けることができる
   セッション維持(セッション・パーシステンス;Session Persistence)が必要となる

実現方法

1) 送信元のIPアドレスをチェックし、そのIPアドレスからのリクエストを同一のサーバーに振り分ける
2) HTTPでの利用を前提に、クッキーを使う

参考文献

http://ascii.jp/elem/000/000/506/506272/
http://ascii.jp/elem/000/000/506/506272/index-2.html


関連記事

高可用性システム構築について

http://blogs.yahoo.co.jp/dk521123/34672360.html