Dev Study
← Webを支えるソフトウェア
レッスン 3 / 13·約 7 分·第3期 Webを支えるソフトウェア

負荷分散の選び方 — どの実体へ配るか

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP
  3. ルータ経路選択
  4. ロードバランサ振り分け今ここ
  5. Nginx受け口
  6. アプリ処理
  7. DB保存

第27〜28週で「取り次ぐ段」を見ました。今週はその段の最初の判断——どの実体へ配るか——です。

まず結論

HTTPやTLSのRFCは負荷分散方式を規定していません(ほかの標準文書までは確かめていません)。名称も挙動もベンダ実装依存です。

だから「規格ではこう」ではなく「nginx ではこの名前で、既定はこれ」と書きます。主語を実装名にすることが今週の技能です。

? 読む前に予測

「ラウンドロビン、最少接続数、ハッシュ法という負荷分散アルゴリズムは標準化されている」——この評価はどれでしょうか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

配り先を選ぶ、それだけの話

取り次ぐ段の向こうに、同じアプリケーションの実体が複数並んでいます。届いた1件をどれへ渡すか。負荷分散とは、この1回の選択のことです。

選び方には名前が付いています。順番に配る、接続が少ないところへ配る、値から計算して決める。しかしHTTPやTLSのRFCには、この名前と挙動の規定はありません。

具体実物

nginx は何をどう呼んでいるか

nginx の分散方式(ngx_http_upstream_module に基づく)表
ディレクティブ 何を見て決めるか
(既定) weighted round-robin。順に配りつつ重みを反映
least_conn アクティブ接続数が最も少ないサーバへ(重みを考慮)
ip_hash クライアントIPに基づく。同じクライアントは常に同じサーバへ
hash 指定キーのハッシュ値で決定。consistent で ketama 一貫性ハッシュ
random ランダムに選択(重みを考慮)

既定は「重み付きラウンドロビン」です。公式の別ページ load_balancing.html は weighted を付けずに round-robin と書きますが、同じページの Weighted load balancing 節で weight の反映を説明しており、語は違っても内容は一致しています。また「ハッシュ法」という単一の方式はなく、ip_hash と hash の2つです。

✓ ここまでの確認

nginx の既定を、公式モジュールドキュメントに即して述べたものはどれですか。

✓ ここまでの確認

「nginx にはハッシュ法という方式が1つある」は正確ですか。

⇄ 2つを見比べる
具体例 A

LBの分散方式(今週)

届いたリクエストをどのサーバへ渡すかを決めます。規則は製品のディレクティブとして書かれ、HTTPやTLSのRFCには規定がありません。

nginx の upstream(方式を書かなければ既定が効く)設定ファイル
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
具体例 B

CPUのスケジューラ(第12週)

実行可能なプロセスを、どのコアで走らせるかを決めます。第12週で見たとおり、この規則はOSの実装が持っています。

割り当てる側と、割り当てられる先表
待っているもの 配り先
LB リクエスト 複数のサーバ
OS プロセス 複数のCPUコア

LBの分散方式と、OSのプロセススケジューラ。共通する構造は何でしょうか。そして「その規則はどこに書かれているか」を問うと何が見えるでしょうか。

「選ぶ主体」「選ばれる対象」「選び方が書かれている場所」に分けて比べてください。

この章のまとめ

  • HTTPやTLSのRFCは負荷分散アルゴリズムを規定していない。 名称も挙動もベンダ実装依存。
  • 挙動を述べるときは実装名を主語にする。
  • nginx の既定は、モジュールdocでは weighted round-robin。別の公式ページは round-robin と書くが、weight の反映も説明しており内容は一致。
  • least_conn が数えるのはアクティブ接続数であって処理の重さではない。
  • 「ハッシュ法」という単一の方式は無い。 ip_hash と hash の2つ。
  • LBの分散もOSのスケジューラも同じ構造だが、規則の出どころはどちらも実装。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

環境:

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 3正解: 0

「ラウンドロビンはRFC標準なので、どのLB製品でも同じ挙動です」と説明されました。どう指摘しますか。

用語集(4語)
weighted round-robin
ngx_http_upstream_module が既定として挙げる方式。順に選びつつ weight の重みを反映する。
least_conn
アクティブ接続数が最少のサーバへ重みを考慮して渡す nginx のディレクティブ。数えるのは接続数であって処理の重さではない。
ip_hash / hash
いずれもハッシュ分散だが別のディレクティブ。前者はクライアントIP、後者は指定キーのハッシュで対応を決める。
ベンダ用語
製品説明のために広まった語で、RFCやIANAに定義が無いもの。負荷分散アルゴリズム名や「L7ロードバランサ」(第14週)。