I have several small server and one big server that contain mirror of that several small server. Let’s call it Server A, Server B, Server C and Server D for group of small server, and the big server will have Server X as name.
I want to redirect user to Server X if one of Server A to D is down/unreachable, once the server is gone up the user would have been redirected back to their corresponding server. Below is an example of desired scenario.
John search up www.example.com hosted on Server B.
Haproxy redirect John to Server B.
John is doing something on www.example.com on server B.
Server B is down ! John got redirected to Server X.
John is doing something on www.example.com on server X.
Server B is up ! John got redirected back to server B from Server X.
I want to do the same setup with all other server (Server A to D), hence I only needed a failover and not load balancer.
I’m pretty sure this is possible with haproxy, but I haven’t find a way to do this setup. Can anyone who knowledgeable give me a way to perform this setup.
hello @Liso ,
I think you need to create two backends , one with the four servers ( A-D ) and one with only server X inside the backend blocks like so:
backend fourofthem
mode http
balance roundrobin
server A ip-for-A check
server B ip-for-B check
server C ip-for-C check
server D ip-for-D check
backend justx
mode http
balance roundrobin
server X ip-for-X check
Now , in your frontend you may specify an acl that checks for the number of servers in backend “fourofthem” and redirect your traffic to backend “justx” if the number of servers is less than four
and justx is alive.
The frontend could look like this:
frontend thefrontend
listen....
acl atleastonedown nbsrv(fourofthem) lt 4
acl x_is_still_alive nbsrv(justx) ge 1
use_backend justx if atleastonedown x_is_still_alive
default_backend fourofthem
As soon as the one backend of “fourofthem” goes down the first acl will return true and if justx is alive as well , it will get the traffic. Otherwise all traffic will end in your default backend “fourofthem”.
For reference nbsrv() receives a string input argument, which is the backend name and returns the number of alive servers in that backend.
don’t think that this will work. as soon one of the four servers is down ALL traffic will be routed to serverX.
you can setup a backup server. i am not sure if the backup server will receive requests as soon one of the main servers is down. and i am not sure if the stickyness will route the requests back to the original server (user-request to serverB, serverB is down, user-request to serverX, as soon as serveB is up again the user is back on serverB), i could image that then the load-balancing routing is done new. maybe you have to check this with a sample setup?
I misunderstood the goal, i thought @Liso wanted to send all traffic to X if any one server failed.
I that case then in my example if we add all 4 servers AND server X in justx backend it will work as expected.
If any server in the default backend fails , the frontend will send the traffic to justx backend.
server B would be failed, so checks for it fail , so all requests are servers by A C D and X.
backend justx
mode http
balance roundrobin
server X ip-for-X check
server A ip-for-A check
server B ip-for-B check
server C ip-for-C check
server D ip-for-D check