message 3 / Robert Paprocki

Ian Morris Nieves imnieves at gmail.com
Tue Feb 4 21:32:42 UTC 2020


Hi Robert,  Thanks for your input on this.  I sincerely appreciate it.

At the moment I am trying to get the most out of DNS (on Docker)… as a way to discover services (individual containers and replicas of containers).

If I can solve the issue without having to introduce a new tool or container, I would really like to.  In that sense, I am not trying to use the perfect tool for every job… I am trying to maximize the usage of existing tools to minimize the number of different tools.  Yes, this is my own design decision, and there is a price for that.

Coming back to consistent hashing, it still does not make sense to me that nginx falls back to round robin for individual hostnames that map to >1 IP, because that breaks the point of consistent hashing any time a node enters/leaves the hostname.  Regardless of my own use case, when does this behavior actually make sense?

Your point about dynamically populating the upstream block makes alot of sense.  +1 !!
I could actually use that work-around without a new service discovery mechanism.  I could actually run a script in the background to get the multiple IP addresses that the hostname maps to… and update the nginx conf accordingly.

Still, nginx already has resolver… and a TTL… so pinging DNS is something nginx is already doing…  seems strange I should have to re-invent that wheel.

I wonder if someone would chime in and say that this behavior is a feature (and if so, what is the use case?) or is it a bug (or possibly oversight?)?

Best,
Ian




> ------------------------------
> 
> Message: 3
> Date: Mon, 3 Feb 2020 13:28:20 -0800
> From: Robert Paprocki <rpaprocki at fearnothingproductions.net>
> To: nginx at nginx.org
> Subject: Re: upstream hash consistent seems to depend on order of DNS
> 	entries (Maxim Dounin)
> Message-ID:
> 	<CAEuShZcwsqndFmQbp-UUmXa3-pMJzKcBf8jNbxgAuYo0chDK7Q at mail.gmail.com>
> Content-Type: text/plain; charset="utf-8"
> 
>> In my case, the number of hosts will change over time, and I can?t update
> the nginx config.  So I thought it would make sense to use a hostname that
> resolves to many IPs.  This would be a scalable solutioin
> 
> In that case, it makes sense to use a templating tool to dynamically
> populate the contents of the upstream{} block. Hook it in with your service
> discovery/registration system.
> 
> On Mon, Feb 3, 2020 at 12:59 PM Ian Morris Nieves <imnieves at gmail.com>
> wrote:
> 
>> Hi Maxim,
>> 
>> Thank you for your response.
>> OK, I understand what you have said.
>> 
>> This seems slightly strange to me.  We both understand the purpose/point
>> of hashing (consistent or not consistent).  Why does it then make sense to
>> fall-back to round robin?
>> 
>> In my case, the number of hosts will change over time, and I can?t update
>> the nginx config.  So I thought it would make sense to use a hostname that
>> resolves to many IPs.  This would be a scalable solutioin.
>> 
>> I would think that the more correct solution would be to hash the IP
>> addresses that all the names resolve to?. not the names themselves.
>> 
>> I must be missing/mis-understanding something.  Does the current
>> implementation/solution make sense to you?
>> 
>> Best,
>> Ian
>> 
>>> 
>>> Message: 2
>>> Date: Mon, 3 Feb 2020 16:05:38 +0300
>>> From: Maxim Dounin <mdounin at mdounin.ru>
>>> To: nginx at nginx.org
>>> Subject: Re: upstream hash consistent seems to depend on order of DNS
>>>      entries
>>> Message-ID: <20200203130538.GR12894 at mdounin.ru>
>>> Content-Type: text/plain; charset=utf-8
>>> 
>>> Hello!
>>> 
>>> On Sat, Feb 01, 2020 at 11:48:00AM -0800, Ian Morris Nieves wrote:
>>> 
>>>> Here is the setup:
>>>> - I am running nginx in a single docker container and it has an
>>>> upstream to a docker service which is composed of 3 docker
>>>> containers (which happens to be php-fpm)
>>>> - the service is configured to _not_ expose a single virtual ip
>>>> address (vip), instead the service exposes the ip addresses of
>>>> all 3 containers through docker?s built-in DNS.  When this DNS
>>>> is asked for the IP address of the service it will respond with
>>>> a list of 3 IP address but the list will rotate in round-robin
>>>> fashion each time a lookup is performed.  Thus the first IP in
>>>> the list will not be the same for any 2 consecutive lookups.
>>>> 
>>>> My first question is:
>>>> Is it the correct behavior that consistent hashing depends on
>>>> the order of IP addresses in the DNS query response?  I can
>>>> imagine arguments either way, and it is possible that this
>>>> critical detail is outside the scope of consistent hashing.  I
>>>> will also forward this question to the author of Ketama.
>>> 
>>> Consistent hashing uses the _name_ as written in the
>>> configuration, not the IP addresses the name resolves to.
>>> 
>>> If a name resolves to multiple IP addresses, these addresses are
>>> considered equal and requests are distributed between them using
>>> round-robin balancing.
>>> 
>>> That is, to balance multiple servers (containers) using consistent
>>> hashing, you have to configure an upstream block with multiple
>>> "server" directives in it.
>>> 
>>> --
>>> Maxim Dounin
>>> http://mdounin.ru/
>>> 
>> 
>> _______________________________________________
>> nginx mailing list
>> nginx at nginx.org
>> http://mailman.nginx.org/mailman/listinfo/nginx
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <http://mailman.nginx.org/pipermail/nginx/attachments/20200203/ee22d974/attachment-0001.htm>
> 


More information about the nginx mailing list