はじめに
HAProxy(ハイアベイラビリティプロキシ)は、人気のあるオープンソースのソフトウェアTCP/HTTPロードバランサーおよびプロキシソリューションであり、Linux、macOS、およびFreeBSDで実行できます。その最も一般的な使用法は、ワークロードを複数のサーバー(Web、アプリケーション、データベースなど)に分散することで、サーバー環境のパフォーマンスと信頼性を向上させることです。GitHub、Imgur、Instagram、Twitterなど、多くの有名な環境で使用されています。
このガイドでは、HAProxyの概要、ロードバランシング用語の概要、および独自のサーバー環境のパフォーマンスと信頼性を向上させるためにどのように使用できるかの例を確認します。
HAProxy用語
ロードバランシングおよびプロキシングを議論する際に重要な用語や概念が多数あります。以下のサブセクションで一般的に使用される用語を確認します。
基本的なロードバランシングの種類に入る前に、ACL、バックエンド、フロントエンドをレビューしてください。
アクセス制御リスト(ACL)
ロードバランシングに関連して、ACL(アクセス制御リスト)は条件をテストし、テスト結果に基づいてアクション(たとえば、サーバーを選択するか、リクエストをブロックするなど)を実行するために使用されます。ACLの使用により、パターンマッチングやバックエンドへの接続数など、さまざまな要因に基づいて柔軟なネットワークトラフィックの転送が可能になります。
ACLの例:
acl url_blog path_beg /blog
このACLは、ユーザーのリクエストのパスが/blog
で始まる場合に一致します。たとえば、http://yourdomain.com/blog/blog-entry-1
のリクエストが一致します。
ACLの使用方法の詳細については、HAProxy Configuration Manualを参照してください。
バックエンド
A backend is a set of servers that receives forwarded requests. Backends are defined in the backend section of the HAProxy configuration. In its most basic form, a backend can be defined by:
- 使用するロードバランシングアルゴリズム
- a list of servers and ports
A backend can contain one or many servers in it. Generally speaking, adding more servers to your backend will increase your potential load capacity by spreading the load over multiple servers. Increased reliability is also achieved through this manner, in case some of your backend servers become unavailable.
以下は、ポート80でリスニングされている2つのWebサーバーが含まれるweb-backend
とblog-backend
の2つのバックエンド構成の例です:
backend web-backend
balance roundrobin
server web1 web1.yourdomain.com:80 check
server web2 web2.yourdomain.com:80 check
backend blog-backend
balance roundrobin
mode http
server blog1 blog1.yourdomain.com:80 check
server blog1 blog1.yourdomain.com:80 check
balance roundrobin
行は、ロードバランシングアルゴリズムを指定します。詳細はLoad Balancing Algorithmsセクションに記載されています。
mode http
は、レイヤー7のプロキシングが使用されることを指定します。これは負荷分散の種類セクションで説明されています。
server
ディレクティブの末尾にあるcheck
オプションは、それらのバックエンドサーバーでヘルスチェックを実行することを指定します。
フロントエンド
A frontend defines how requests should be forwarded to backends. Frontends are defined in the frontend
section of the HAProxy configuration. Their definitions are composed of the following components:
- a set of IP addresses and a port (e.g. 10.1.1.7:80, *:443, etc.)
- ACL
use_backend
ルールは、一致するACL条件に応じて使用するバックエンドを定義し、default_backend
ルールはその他のすべてのケースを処理します。
A frontend can be configured to various types of network traffic, as explained in the next section.
負荷分散の種類
これで、負荷分散で使用される基本的なコンポーネントの理解ができたので、基本的な負荷分散の種類に移ることができます。
負荷分散なし
A simple web application environment with no load balancing might look like the following:

この例では、ユーザーは直接あなたのウェブサーバーに接続し、yourdomain.com
にアクセスします。負荷分散はありません。単一のウェブサーバーがダウンした場合、ユーザーはウェブサーバーにアクセスできなくなります。さらに、多くのユーザーが同時にサーバーにアクセスしようとしており、サーバーがその負荷を処理できない場合、ユーザーは遅い体験をしたり、まったく接続できない場合があります。
レイヤー4負荷分散
複数のサーバーにネットワークトラフィックを負荷分散する最も簡単な方法は、レイヤー4(トランスポートレイヤー)負荷分散を使用することです。この方法で負荷分散すると、IP範囲とポートに基づいてユーザートラフィックが転送されます(つまり、http://yourdomain.com/anything
へのリクエストが入った場合、トラフィックはyourdomain.com
のすべてのリクエストを処理するバックエンドにport 80
で転送されます)。レイヤー4の詳細については、当社のTCPセクションのネットワーキング入門をご覧ください。
以下は、レイヤー4負荷分散の簡単な例のダイアグラムです:

ユーザーはロードバランサーにアクセスし、ユーザーのリクエストをバックエンドサーバーのweb-backendグループに転送します。選択されたバックエンドサーバーは、直接ユーザーのリクエストに応答します。一般的に、web-backendのすべてのサーバーは同一のコンテンツを提供する必要があります。さもないと、ユーザーは不整合なコンテンツを受け取る可能性があります。両方のWebサーバーが同じデータベースサーバーに接続していることに注意してください。
レイヤー7ロードバランシング
ネットワークトラフィックをロードバランスするもう1つのより複雑な方法は、レイヤー7(アプリケーションレイヤー)ロードバランシングを使用することです。レイヤー7を使用すると、ロードバランサーはユーザーのリクエストのコンテンツに基づいて異なるバックエンドサーバーにリクエストを転送できます。このロードバランシングモードを使用すると、同じドメインとポートの下で複数のWebアプリケーションサーバーを実行できます。レイヤー7の詳細については、当社のネットワーキング入門のHTTPサブセクションをご覧ください。
以下は、レイヤー7ロードバランシングの単純な例の図です:

この例では、ユーザーがyourdomain.com/blog
をリクエストした場合、ブログアプリケーションを実行するサーバーセットであるblogバックエンドに転送されます。他のリクエストはweb-backendに転送され、別のアプリケーションを実行しているかもしれません。この例では、両方のバックエンドが同じデータベースサーバーを使用しています。
A snippet of the example frontend configuration would look like this:
frontend http
bind *:80
mode http
acl url_blog path_beg /blog
use_backend blog-backend if url_blog
default_backend web-backend
これはポート80でのすべての着信トラフィックを処理するhttp
という名前のフロントエンドを構成します。
acl url_blog path_beg /blog
は、ユーザーのリクエストのパスが/blog
で始まる場合にリクエストと一致します。
use_backend blog-backend if url_blog
はACLを使用してトラフィックをblog-backend
にプロキシします。
default_backend web-backend
は、その他のすべてのトラフィックがweb-backend
に転送されることを指定します。
負荷分散アルゴリズム
使用される負荷分散アルゴリズムによって、バックエンドのサーバーが負荷分散されたときに選択されるサーバーが決まります。 HAProxyには複数のアルゴリズムのオプションがあります。負荷分散アルゴリズムに加えて、サーバーには他のサーバーよりも頻繁に選択される方法を操作するためのweightパラメーターを割り当てることができます。
A few of the commonly used algorithms are as follows:
roundrobin
ラウンドロビンは、サーバーを順番に選択します。これがデフォルトのアルゴリズムです。
leastconn
最も少ない接続数のサーバーを選択します。これは、長時間のセッションにはお勧めです。同じバックエンドのサーバーもラウンドロビン形式で切り替えられます。
ソース
これにより、ユーザーがリクエストを行っているソースIPアドレスのハッシュに基づいてどのサーバーを使用するかが選択されます。この方法により、同じユーザーが同じサーバーに接続されることが保証されます。
スティッキーセッション
一部のアプリケーションでは、ユーザーが引き続き同じバックエンドサーバーに接続する必要があります。これは、appsession
パラメーターを使用してこれを必要とするバックエンドでスティッキーセッションを使用することで実現できます。スティッキーセッション
ヘルスチェック
HAProxyはヘルスチェックを使用して、バックエンドサーバーがリクエストを処理できるかどうかを判断します。これにより、サーバーが利用できなくなった場合にバックエンドから手動でサーバーを削除する必要がなくなります。デフォルトのヘルスチェックは、サーバーとのTCP接続の確立を試行することです。
サーバーがヘルスチェックに失敗し、そのためリクエストを処理できない場合、自動的にバックエンドから無効にされ、それが再び健康になるまでトラフィックは転送されません。 バックエンドのすべてのサーバーが失敗すると、少なくともそのバックエンドのサーバーの1つが再び健康になるまで、サービスが利用できなくなります。
データベースサーバーなどの特定のタイプのバックエンドでは、デフォルトのヘルスチェックがサーバーがまだ健康かどうかを判断する必要はありません。
Nginxウェブサーバーは、単独のプロキシサーバーやロードバランサーとしても使用でき、キャッシュおよび圧縮機能のためにHAProxyと組み合わせて使用されることがよくあります。
高可用性
このチュートリアルで説明されているレイヤー4および7のロードバランシングセットアップは、どちらもロードバランサーを使用してトラフィックを複数のバックエンドサーバーの1つに誘導します。 ただし、これらのセットアップでは、ロードバランサーは単一の障害点です。それがダウンしたり、リクエストで過負荷になったりすると、サービスの遅延やダウンタイムが発生する可能性があります。
A high availability (HA) setup is broadly defined as infrastructure without a single point of failure. It prevents a single server failure from being a downtime event by adding redundancy to every layer of your architecture. A load balancer facilitates redundancy for the backend layer (web/app servers), but for a true high availability setup, you need to have redundant load balancers as well.
以下は、高可用性セットアップのダイアグラムです:
この例では、1つのアクティブなロードバランサーと1つ以上のパッシブなロードバランサーが静的IPアドレスの背後にあり、そのIPアドレスが別のサーバーに再マップできるようになっています。ユーザーがウェブサイトにアクセスすると、リクエストは外部IPアドレスを介してアクティブなロードバランサーに送信されます。そのロードバランサーが障害になると、フェイルオーバー機構がそれを検出し、自動的にIPアドレスをパッシブサーバーの1つに再割り当てします。アクティブ/パッシブHAセットアップを実装するためのさまざまな方法があります。詳細については、予約済みIPの使用方法を読んでください。
結論
ロードバランシングの理解とHAProxyの活用方法を学びましたので、自分のサーバー環境のパフォーマンスと信頼性を向上させるための堅固な基盤ができました。
HAProxyの出力を後で表示する方法に興味がある場合は、CentOS 8でRsyslogを使用したHAProxyログの構成方法をチェックしてください。
問題を解決したい場合は、共通のHAProxyエラーを確認してください。さらなるトラブルシューティングが必要な場合は、共通のHAProxyエラーのトラブルシューティング方法を参照してください。