Hi Ruben, You are defining only one server, in your backend so even if your resolvers return 3 addresses, HAProxy will pick only one (probably the first).
You need to define three servers, you can do it manually (three server lines) or use the "server-template" keyword. On 13/10/2017 14:59, Ruben wrote: > Well =fun should be a variable name. But the name, whatever it is, > should always be routed to the same ip based on some consistency > algorhithm. > > I've build some DNS server to correct for the randomizing of the > server list from the dns. So the following: > > dig @ordered-dns-proxy chat > > always gives me the list: > > 10.0.0.11 > 10.0.0.12 > 10.0.0.13 > > in this order. > > My config now looks like: > ------------- > defaults > mode http > timeout client 5s > timeout connect 5s > timeout server 5s > > resolvers dns > nameserver srv_dns ordered-dns-proxy:53 > > frontend all > bind :80 > mode http > timeout client 120s > option forwardfor > > default_backend chat > > backend chat > balance url_param chatName > timeout server 120s > > server srv_chat chat:80 resolvers dns > --------------- > > But still not working. It is always routed to a different server. > > What I want to accomplish is something like. > > dig @ordered-dns-proxy chat > > always gives me the list: > > 10.0.0.11 > 10.0.0.12 > 10.0.0.13 > > I want to have the connection: > > ?chatName=xxxx > > crc32(xxxx) % 3 is for example 2 > > always route to the second server in the dns list. > > With my current config this won't happen. The balancer is always going > to the first. > > > > 2017-10-11 1:27 GMT+02:00 Igor Cicimov <[email protected] > <mailto:[email protected]>>: > > > > > > > > On Tue, Oct 10, 2017 at 11:25 PM, Ruben <[email protected] > <mailto:[email protected]>> wrote: > >> > >> I have some stateful chat servers (SockJS) running in docker swarm > mode. When doing dig chat I get an unordered randomized list of > servers for example: > >> > >> (every time the order is different) > >> 10.0.0.12 > >> 10.0.0.10 > >> 10.0.0.11 > >> > >> The chat is accessed by a chatName url parameter. Now I want to be > able to run a chat-load-balancer service in docker with multiple > replicas using the haproxy image. > >> > >> The problem is that docker always resolves to a randomized list > when doing dig chat. > >> > >> I want to map the chatName param from the url to a fixed server > which always have the same ip from the list of ips of dig chat. So the > mapping of the url_param should not be based on the position of the > server in the list, but solely on the ip of the server. > >> > >> So for example ?chatName=fun should always route to ip 10.0.0.12, > no matter what. > >> > >> My current haproxy.cfg is: > >> > >> defaults > >> mode http > >> timeout client 5s > >> timeout connect 5s > >> timeout server 5s > >> > >> frontend frontend_chat > >> bind :80 > >> mode http > >> timeout client 120s > >> option forwardfor > >> option http-server-close > >> option http-pretend-keepalive > >> default_backend backend_chat > >> > >> backend backend_chat > >> balance url_param chatName > >> timeout server 120s > >> server chat chat:80 > >> > >> At the moment it seems that only the Commercial Subscribtion of > Nginx can handle this kind of cases using the sticky route $variable > ...; directive in the upstream module. > > > > > > Maybe try: > > > > http-request set-header Host 10.0.0.12 if { query -m beg -i > chatName=fun } > > -- Moemen MHEDHBI

