Hi,

My questions and remarks inline.

On Wed, May 23, 2012 at 11:42 PM, Zulu Chas <zuluc...@hotmail.com> wrote:
> Hi!
>
> I'm trying to use HAproxy to support the concepts of "offline", "in
> maintenance mode", and "not working" servers.

Any good reason to do that???
(I'm a bit curious)

>  I have separate health checks
> for each condition and I have been trying to use ACLs to be able to switch
> between backends.  In addition to the fact that this doesn't seem to work,
> I'm also not loving having to repeat the server lists (which are the same)
> for each backend.

Nothing weird here, this is how HAProxy configuration works.

>  But perhaps I'm misunderstanding something fundamental
> here about how I should be tackling this.  As far as I can tell, having
> multiple httpchk's per backend doesn't work in an "if any of these fail,
> then call mark this server offline"

you can have a single health check per backend.


> -- I think it's more like "if any of
> these succeed, mark this server online" -- and that's what's making this
> scenario complex.

euh.... I might misunderstanding something.
There is nothing more simple that "if the health check is successful,
then the server is considered healthy"...

>  That is, the /check can pass but I might have marked the
> server offline manually or be in the process of deploying and so
> /maintenance.html exists -- it's not a strictly boolean (online/offline)
> issue.
>
> Here's the setup:
>
> global
>   maxconn 1024
>   log   127.0.0.1       local0 notice
>   spread-checks 5
>   daemon
>   user haproxy
>
> defaults
>   log global
>   mode http
>   balance leastconn
>   maxconn 500
>   option httplog
>   option abortonclose
>   option httpclose
>   option forwardfor
>   retries 3
>   option redispatch
>   timeout client 1m
>   timeout connect 30s
>   timeout server 1m
>   stats enable
>   stats uri     /haproxy?stats
>   stats auth    hauser:hapasswd
>   monitor-uri /haproxy?monitor
>   timeout check 10000
>
> frontend staging 0.0.0.0:8080
>   # if the number of servers *not marked offline* is *less than the total
> number of app servers* (in this case, 2), then it is considered degraded
>   acl degraded nbsrv(only_online) lt 2
>

This will match 0 and 1

>   # if the number of servers *not marked offline* is *less than one*, the
> site is considered down
>   acl down nbsrv(only_online) lt 1
>

This will match 0, so you're both down and degraded ACL covers the
same value (0).
Which may lead to an issue later....

>   # if the number of servers without the maintenance page is *less than the
> total number of app servers* (in this case, 2), then it is
> considered maintenance mode
>   acl mx_mode nbsrv(maintenance) lt 2
>
>   # if the number of servers without the maintenance page is less than 1,
> we're down because everything is in maintenance mode
>   acl down_mx nbsrv(maintenance) lt 1
>

Same remark as above.


>   # if not running at full potential, use the backend that identified the
> degraded state
>   use_backend only_online if degraded
>   use_backend maintenance if mx_mode
>
>   # if we are down for any reason, use the backend that identified that fact
>   use_backend backup_only if down
>   use_backend backup_only if down_mx
>

Here is the problem (see above).
The 2 use_backend above will NEVER match, because the degraded ad
mx_mode ACL overlaps their values!

>   # by default, use 'normal ops'
>   default_backend normal
>
>
> backend only_online
>   # if /offline exists, the server has been intentionally marked as offline
>   option httpchk HEAD /offline HTTP/1.0
>   http-check expect status 404
>   http-check send-state
>   server App1 app1:8080 check inter 5000 rise 2 fall 2
>   server App2 app2:8080 check inter 5000 rise 2 fall 2
>
>
> backend maintenance
>   # if /maintenance.html exists, the server is in maintance mode
>   option httpchk HEAD /maintenance.html HTTP/1.0
>   http-check expect status 404
>   http-check send-state
>   server App1 app1:8080 check inter 2000 rise 2 fall 2
>   server App2 app2:8080 check inter 2000 rise 2 fall 2
>
>
> backend normal
>   cookie SESSIONID insert indirect
>   option httpchk HEAD /check HTTP/1.0
>   http-check send-state
>   server App1 app1:8080 cookie A check inter 10000 rise 2 fall 2
>   server App2 app2:8080 cookie B check inter 10000 rise 2 fall 2
>   server Backup1 app3:8080 cookie C check inter 10000 rise 2 fall 2 backup
>
>
> backend backup_only
>   option httpchk HEAD /check HTTP/1.0
>   http-check send-state
>   server Backup1 app3:8080 check inter 2000 rise 2 fall 2
>



Do you know the "disable-on-404" option?
it may help you make your configuration in the right way (not
considering a 404 as a healthy response).

cheers

Reply via email to