web-dev-qa-db-ja.com

HAProxyはルックアップテーブルに基づいてバックエンドを選択できますか?

アイテムA、B、およびCがあるとします。server01とserver02の2つのバックエンドサーバーがあります。

アイテムAはserver01で処理でき、アイテムBとCはserver02で処理できます。新しいアイテムとサーバーが追加および削除され、ファイル、Redis、Memcacheなど(プロキシがサポートするものは何でも)内のアイテムIDとバックエンドサーバー間のハッシュテーブルがプログラムで更新されます。

/items/${id}などのフロントエンドを作成し、HAProxyを${id}に基づいて正しいバックエンドサーバーにルーティングできますか?では、どのIDがどのサーバーに関連付けられているかを調べることで?

そうでない場合、Nginxはこれを行うことができますか?

4
kvz

はい、HAProxyを使用してこれを簡単に行うことができます。サーバーが提供するIDのリストを使用してACLを作成し、それをuse-serverディレクティブに適用するだけです。 IE:

acl server1-ids path_beg -i /items/id1 /istems/id2
use-server server1 if server1-ids
5
Baptiste

maps を使用して機能させることができます。

これは、HAProxy.comブログの post で完全に概説されています。これらはHostヘッダーに基づいてマッピングされていますが、URLで機能するように構成を変更するのは簡単です。

ここでのもう1つの利点は、http-[request|response] [set-map|del-map]キーワードを使用して、または管理ソケットを介して、マッピングエントリを動的に追加および削除できることです。
http-[request|response]またはソケットを介して行われた変更は再起動間で保持されないため、マップファイルを同時に更新するために帯域外プロセスが必要になりますが、それはすべて一緒に別の質問です。

サーバーごとにバックエンドがあり、次の内容の/etc/haproxy/items.mapというマップファイルが与えられていると仮定します。

#itemPath    backendname
/item/a      bk_server01
/item/b      bk_server02
/item/c      bk_server02

フロントエンドで次のようなことを行います。

frontend ft_items
  [...]
  use_backend %[path,lower,map(/etc/haproxy/items.map,bk_default)]

両方のサーバーが同じバックエンドにある場合は、すべてのアイテムをキャッチするACL(acl items path_beg /items)をフロントエンドに記述し、それらをバックエンド(use_backend servers if items)に送信して、フロントエンドのuse_backend行を適切なif-に置き換えます。バックエンドでuse_server行を記述しました。

5
GregL