<div dir="auto"><div>Thanks for the explanation.  Sorry if I'm being dense but is there some way to get udp passive health check to fail to the next server?<div dir="auto"><br></div><div dir="auto">Meaning,based on my configuration, am I doing something wrong or is this simply unavailable with udp?</div><div dir="auto"><br></div><div dir="auto">Thanks</div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Feb 24, 2022, 1:31 AM Sergey Kandaurov <<a href="mailto:pluknet@nginx.com">pluknet@nginx.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
> On 23 Feb 2022, at 06:45, Pawel Fraczek <<a href="mailto:fraczekp@gmail.com" target="_blank" rel="noreferrer">fraczekp@gmail.com</a>> wrote:<br>
> <br>
> Hi, I'm trying to building a syslog load balancer and I'm running into issues with the failover of UDP messages. TCP works just fine, when the server goes down, all messages failover to the active server. But with UDP, that does not happen. Maybe someone can point me to what I'm doing wrong. Below is the config.<br>
> upstream syssrv {<br>
>  server <br>
> <a href="http://192.168.167.108:5500" rel="noreferrer noreferrer" target="_blank">192.168.167.108:5500</a><br>
>  max_fails=2 fail_timeout=15s;<br>
>  server <br>
> <a href="http://192.168.167.109:5500" rel="noreferrer noreferrer" target="_blank">192.168.167.109:5500</a><br>
>  max_fails=2 fail_timeout=15s;<br>
>  }<br>
>  server {<br>
>  listen 5500;<br>
>  proxy_protocol on;<br>
>  proxy_pass syssrv;<br>
>  proxy_timeout 1s;<br>
>  proxy_connect_timeout 1s;<br>
>  }<br>
>  server {<br>
>  listen 5500 udp;<br>
>  proxy_pass syssrv;<br>
>  proxy_timeout 1s;<br>
>  proxy_connect_timeout 1s;<br>
>  proxy_bind $remote_addr transparent;<br>
>  }<br>
> }<br>
> <br>
> I have a script that enumerates each message (n) like this "Testing -proto: udp - n"<br>
> I see both servers getting the message when they are online (even - odd numbers) but when one goes down, once server continues to only get the even numbers, so I'm losing 50% of the messages.<br>
> I tried to debug the setup and I see nginx marking that the udp packets timed out. I see this:<br>
> 2022/02/22 20:05:13 [info] 21362#21362: *777 udp client <a href="http://192.168.167.101:51529" rel="noreferrer noreferrer" target="_blank">192.168.167.101:51529</a> connected to <a href="http://0.0.0.0:5500" rel="noreferrer noreferrer" target="_blank">0.0.0.0:5500</a><br>
> <br>
> 2022/02/22 20:05:13 [info] 21362#21362: *777 udp proxy <br>
> <a href="http://192.168.167.101:34912" rel="noreferrer noreferrer" target="_blank">192.168.167.101:34912</a> connected to <a href="http://192.168.167.108:5500" rel="noreferrer noreferrer" target="_blank">192.168.167.108:5500</a><br>
> <br>
> 2022/02/22 20:05:13 [info] 21362#21362: *779 udp client <br>
> <a href="http://192.168.167.101:53862" rel="noreferrer noreferrer" target="_blank">192.168.167.101:53862</a> connected to <a href="http://0.0.0.0:5500" rel="noreferrer noreferrer" target="_blank">0.0.0.0:5500</a><br>
> <br>
> 2022/02/22 20:05:13 [info] 21362#21362: *779 udp proxy <br>
> <a href="http://192.168.167.101:35506" rel="noreferrer noreferrer" target="_blank">192.168.167.101:35506</a> connected to <a href="http://192.168.167.109:5500" rel="noreferrer noreferrer" target="_blank">192.168.167.109:5500</a><br>
> Then this:<br>
> 2022/02/22 20:05:14 [info] 21362#21362: *771 udp timed out, packets from/to client:1/0, bytes from/to client:145/0, bytes from/to upstream:0/145<br>
> <br>
> But, it's not redirecting the connection to the healthy server. This seems pretty simple but any ideas what I'm doing wrong? It would seem that the non-commercial version should be able to do this, no?<br>
> Any help is appreciated. I also tried to add a backup, but it doesn't work with UDP<br>
<br>
The stream module has no notion of the application protocol,<br>
hence it only switches to next upstream on connect() errors.<br>
<br>
Due to the nature of the UDP protocol, which is essentially<br>
connectionless, usually it cannot be reported as connect()<br>
failure if the peer is down.  In this case, it is only seen<br>
as connection timeout or recv() error while reading back<br>
from upstream.  This means no next upstream logic for UDP.<br>
<br>
The waiting time can be shortened, if the peer reports<br>
back with the ICMP error, such as "port unreachable".<br>
In this case, it is seen as recv() error immediately,<br>
without waiting for connection timeout.<br>
<br>
Any way, the peer is marked as failed, that is, it is switched<br>
off temporarily for subsequent connections until "fail_timeout".<br>
This is logged as "upstream server temporarily disabled"<br>
on the [warn] logging level.<br>
<br>
-- <br>
Sergey Kandaurov<br>
<br>
_______________________________________________<br>
nginx mailing list -- <a href="mailto:nginx@nginx.org" target="_blank" rel="noreferrer">nginx@nginx.org</a><br>
To unsubscribe send an email to <a href="mailto:nginx-leave@nginx.org" target="_blank" rel="noreferrer">nginx-leave@nginx.org</a><br>
</blockquote></div></div></div>