分散方式
* 分散方式には、大きく分けて、以下の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