複数のアプリケーション、バックエンド、およびサーバー間の負荷分散は、リソースの最適化、パフォーマンスの向上、およびサービスのフォールト トレランスのプロセスの一部です。
ロード バランサとしての Nginx
この Web サーバーは、構成時に最も幅広い機能と柔軟性を備えているため、最も一般的で生産的なソリューションの 1 つと見なされています。そのため、負荷分散には Nginx がよく使用されます。
いくつかのアプローチと実装がありますが、最初にモジュール ngx_http_upstream_module の可用性を確認してください:
# nginx -v
欠落している場合は、このモジュールを追加して Nginx を再構築する必要があります。その後、Web サーバーの構成を開始できます。バランシングを有効にするには、アップストリーム ディレクティブ (http セクション) を Nginx 構成ファイルに追加します。
upstream backend { server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
ここで、必要なグループのリダイレクトを指定する必要があります:
server { location / { proxy_pass http://backend; } }
さらに、Nginx は追加のパラメーターと負荷分散方法をサポートしています。
バランシング方法の選択
Nginx は、いくつかの負荷分散方法を提供しています。
ラウンドロビン
デフォルトでは、ウェブサーバーはリクエストをバックエンド間で均等に分散します (ただし、重みを考慮します)。これは Nginx の標準的な方法であるため、包含ディレクティブはありません。
least_conn
リクエストは最初に、アクティブな接続の数が最も少ないバックエンドに送信されます (ただし、重みは考慮されます):
upstream backend { least_conn; server backend1.somesite.com; server backend2.somesite.com; }
ハッシュと IP ハッシュ
この方法を使用すると、クライアントとバックエンドの間に一種の永続的な接続を作成できます。リクエストごとに、Nginx はテキスト、Web サーバー変数、またはそれらの組み合わせで構成されるハッシュを計算し、それをバックエンドにマップします。
upstream backend { hash $scheme$request_uri; server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
IP ハッシュは HTTP でのみ機能します。これは、クライアントの IP アドレスによってハッシュが計算される定義済みのオプションです:
upstream backend { ip_hash; server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
バックエンドの重み
スタック上の特定のバックエンドが他のものよりも強力な場合、重みが役立ちます:
upstream backend { server backend1.somesite.com weight=10; server backend2.somesite.com weight=5; server backend3.somesite.com; server 192.0.0.1 backup; }
この例では、16 のリクエストごとに、最初のバックエンドが 10 を処理し、2 番目が 5 を処理し、3 番目が 1 を処理します。この場合、バックアップ サーバーは 3 つのメイン バックエンドが利用できない場合にのみリクエストを受け取ります。
モニタリング
バックエンド サーバーが使用できないと Nginx が判断した場合、バックエンド サーバーへのリクエストの送信を一時的に停止します。これには 2 つのディレクティブが関与します:
- max_fails — 接続試行の失敗回数を設定します。その後、バックエンドは一定時間使用不可と見なされます。
- fail_timeout — サーバーが利用できないと見なされる時間
パラメータは次のようになります:
upstream backend { server backend1.somesite.com; server backend2.somesite.com max_fails=3 fail_timeout=30s; server backend3.somesite.com max_fails=2; }
結論
適切なバランシング方法を選択すると、負荷をより均等に分散できます。バックエンドの重み付け、監視、サーバーのフォールト トレランスを忘れないでください。