HAProxy - URL 基于负载均衡的路由 - 使用 listen 和 use-server

HAProxy - URL Based routing with load balancing - using listen and use-server

我需要配置HAProxy将不同路径的请求转发到不同的后端,其中一些后端需要做负载均衡。所以我遇到了 this question,那里提供的解决方案确实有效,但由于我们的约定,我需要使用 listenuse-server 而不是 frontenduse_backend.

所以现在我有这样的东西:

listen poq [url]:[port]
    acl has_cool_url path_beg -i /cool
    use-server cool if has_cool_url
    server cool [ip]:[port] check
    server default [ip]:[port] check

我不能用这个:

listen poq [url]:[port]
    acl has_cool_url path_beg -i /cool
    use_backend cool if has_cool_url
    use_backend notcool if !has_cool_url

backend cool
    balance roundrobin
    server first [ip]:[port] check
    server second [ip]:[port] check

backend notcool
    server third [ip]:[port] check

因为我们的惯例告诉我们要在 listen 块中定义所有内容。

所以我的问题是:有没有这样的:

listen poq [url]:[port]
    acl has_cool_url path_beg -i /cool
    use-server {first, second} if has_cool_url
    server first [ip]:[port] check
    server second [ip]:[port] check
    server default [ip]:[port] check

firstsecond 是使用循环法进行负载平衡的吗?

您的约定是武断的并且限制了您的功能。 listen 块在功能上类似于具有相同名称的单个 frontendbackend 块,以及从前端指向后端的隐式 default_backendlisten 块旨在用于简单配置。

后端的意义在于后端中的所有服务器都提供相同的服务。 use-server 允许您 select 恰好一台服务器。

只有你可以用listen做的事情是平衡一组默认服务器,加上一个或多个单独的服务器,使用条件匹配单独寻址,但是他们无法平衡。

listen poq [url]:[port]
    acl has_warm_url path_beg -i /warm
    use-server warm-server if has_warm_url
    acl has_hot_url path_beg -i /hot
    use-server hot-server if has_hot_url
    server warm-server [ip]:[port] check weight 0
    server hot-server [ip]:[port] check weight 0
    server default1 [ip]:[port] check
    server default2 [ip]:[port] check

在此配置中,/warm 转到 warm-server,/hot 转到 hot-server。这两个服务器的权重为 0,以防止它们处理任何其他请求。

其他一切都在 default1 和 default2 之间平衡。

这是 listen 的所有灵活性,因为 HAProxy 只为每个后端执行一组平衡,并且如上所述,listen 部分是以下功能的隐式组合一组匹配的 frontendbackend.