Selection of server in upstream directive using hash

Roman Arutyunyan arut at nginx.com
Mon Oct 9 10:23:49 UTC 2017


Hi Ruben,

On Mon, Oct 09, 2017 at 11:51:54AM +0200, Ruben wrote:
> First of all thanks for your reply. But what happens if I have for example
> a hostname: test, which resolves to a randomized list of multiple ip's.
> Such that when I do:
> 
> dig test
> 10.0.0.8
> 10.0.0.9
> 10.0.0.10
> 
> and a few moments later
> 
> dig test
> 10.0.0.10
> 10.0.0.8
> 10.0.0.9
> 
> Is it then still consistent on the ip's or is the consistency just on the
> name "test" in this case?

The consistency is only about choosing the name "test".  Once the name is
chosen (consistently), its ips are balanced by the round-robin balancer.
With this approach you can change ips of your server or add new addresses to
it and everything will keep working as before.  However, you cannot stick
to a particular ip address of a server.

> From the docs I read that it resolves the hostname and injects the ip's as
> server when multiple ip's are returned. But it's not completely clear on
> which the hash is acting.
> 
> I am asking this, because docker constantly returns a randomized fixed list
> of ip's (for dns load balancing). But I always want to route a user,
> targetting for some url, to the same container.

In the commercial version of nginx we have the sticky module, which can be used
to solve your issue:

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#sticky

> 2017-10-09 11:25 GMT+02:00 Roman Arutyunyan <arut at nginx.com>:
> 
> > Hi Ruben,
> >
> > On Mon, Oct 09, 2017 at 09:33:55AM +0200, Ruben wrote:
> > > I was wondering what the selection algorithm is for choosing a server in
> > > the upstream directive using hash. Is the selection based on the ip of
> > the
> > > server or is it based on the position of the list.
> > >
> > > So if I have for example the following configuration:
> > >
> > > upstream test {
> > >   hash $arg_test;
> > >   server 10.0.0.10;
> > >   server 10.0.0.9;
> > >   server 10.0.0.8;
> > > }
> > >
> > > or (ip's in different order)
> > >
> > > upstream chat {
> > >   hash $arg_test;
> > >   server 10.0.0.8;
> > >   server 10.0.0.9;
> > >   server 10.0.0.10;
> > > }
> > >
> > > If someone is targeting an url with ?test=1, is it in both configs
> > directed
> > > to the same ip or not. So is the selection based on the ip or based omn
> > the
> > > position in the list.
> >
> > The regular (non-consistent) hash balancer selects a server based on the
> > position in the list.  However, the consistent hash balancer
> > (hash $arg_test consistent) makes a selection based on the server name/ip
> > specified in the "server" directive.
> >
> > --
> > Roman Arutyunyan
> > _______________________________________________
> > nginx mailing list
> > nginx at nginx.org
> > http://mailman.nginx.org/mailman/listinfo/nginx
> >

> _______________________________________________
> nginx mailing list
> nginx at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx


-- 
Roman Arutyunyan


More information about the nginx mailing list