負荷分散について

負荷分散は、着信トラフィックを複数の対応する仮想プライベートサーバーに分散するための便利なメカニズムです。処理メカニズムを複数のマシンに割り当てることで、アプリケーションに冗長性が提供され、フォールトトレランスと安定性の向上が保証されます。 負荷分散のためのラウンドロビンアルゴリズムは、訪問者を一連のIPの1つに送信します。 最も基本的なレベルでは、実装が非常に簡単なラウンドロビンは、サーバーの応答時間や訪問者の地理的地域など、より微妙な要素を考慮せずにサーバーの負荷を分散します。

設定

このチュートリアルの手順では、ユーザーがVPSに対するroot権限を持っている必要があります。 これを設定する方法は、ユーザーチュートリアルで確認できます。

nginxロードバランシングを設定する前に、VPSにnginxをインストールしておく必要があります。 apt-getを使用してすばやくインストールできます。

sudo apt-get install nginx

アップストリームモジュール

ラウンドロビンロードバランサーを設定するには、nginxアップストリームモジュールを使用する必要があります。 構成をnginx設定に組み込みます。

先に進んで、Webサイトの構成を開きます(私の例では、一般的なデフォルトの仮想ホストで作業します)。

sudo nano /etc/nginx/sites-available/default

ファイルに負荷分散構成を追加する必要があります。

まず、次のようなアップストリームモジュールを含める必要があります。

upstream backend  {
  server backend1.example.com;
  server backend2.example.com;
  server backend3.example.com;
}

次に、構成でモジュールをさらに参照する必要があります。

 server {
  location / {
    proxy_pass  http://backend;
  }
}

nginxを再起動します:

sudo service nginx restart

すべての仮想プライベートサーバーが配置されている限り、ロードバランサーが訪問者をリンクサーバーに均等に分散し始めることがわかります。

指令

前のセクションでは、複数の仮想サーバーに負荷を均等に分散する方法について説明しました。 ただし、これがデータを操作するための最も効率的な方法ではない場合がある理由はたくさんあります。 サイト訪問者をより効果的に誘導するために使用できるいくつかのディレクティブがあります。

重さ

より正確にサーバーにユーザーを割り当て始める1つの方法は、特定のマシンに特定の重みを割り当てることです。 Nginxでは、各サーバーに転送する必要のあるトラフィックの割合を指定する番号を割り当てることができます。

サーバーの重みを含む負荷分散されたセットアップは、次のようになります。

upstream backend  {
  server backend1.example.com weight=1;
  server backend2.example.com weight=2;
  server backend3.example.com weight=4;
}

デフォルトの重みは1です。 重みが2の場合、backend2.exampleはbackend1の2倍のトラフィックを送信し、重みが4のbackend3は、backend2の2倍、バックエンド1の4倍のトラフィックを処理します。

ハッシュ

IPハッシュを使用すると、サーバーはIPアドレスに従ってクライアントに応答し、訪問者が訪問するたびに同じVPSに戻ることができます(サーバーがダウンしている場合を除く)。 サーバーが非アクティブであることがわかっている場合は、サーバーをダウンとしてマークする必要があります。 ダウンサーバーにルーティングされるはずだったすべてのIPは、別のIPに転送されます。

以下の構成に例を示します。

upstream backend {
  ip_hash;
  server   backend1.example.com;
  server   backend2.example.com;
  server   backend3.example.com  down;
 }

マックスは失敗する

デフォルトのラウンドロビン設定によれば、nginxは、サーバーが応答していなくても、仮想プライベートサーバーにデータを送信し続けます。 Maxが失敗すると、応答しないサーバーを設定された時間動作不能にすることで、これを自動的に防ぐことができます。

最大失敗に関連する2つの要因があります:max_failsとfall_timeout。 最大失敗とは、サーバーが非アクティブであると見なされる前にサーバーへの接続に失敗した最大回数を指します。 Fall_timeoutは、サーバーが動作不能と見なされる長さを指定します。 時間が経過すると、サーバーに到達するための新しい試行が再開されます。 デフォルトのタイムアウト値は10秒です。

サンプル構成は次のようになります。

upstream backend  {
  server backend1.example.com max_fails=3  fail_timeout=15s;
  server backend2.example.com weight=2;
  server backend3.example.com weight=4;

続きを見る

これは、単純なラウンドロビン負荷分散の簡単な概要です。 さらに、サーバーを高速化および最適化する他の方法があります。

EtelSverdlov著