Benjamin Smith <lists@...> writes: > > Igor, > > Thanks for the response; I didn't see this email until just now as it didn't > go through the mailing list and so wasn't filtered as expected. > > I spent my morning trying everything I could think of to get haproxy's agent- > check to work consistently. The main symptom is that haproxy would mark hosts > with the status of "DRAIN" and provide no clues as to why, even with log- > health-checks on. After a *lot* of trial and error, I've found the following > that seem to be bugs, on the latest 1.5.11 release, running on CentOS 6. > > 1) agent-check output words sometimes handled inconsistently, ignored, or > misunderstood if " " was used instead of "," as a separator. > > This is understood: > echo "ready,78%\r\n" > > This line often causes a DRAIN state. A restart of haproxy was insufficient to > clear the DRAIN state: (see #3) > echo "ready 78%\r\n" > > 2) Inconsistent logging of DRAIN status change when health logging was on. > (the server would turn blue in the stats page without any logging as to why. > Logging status would sometimes say " Server $service/$name is UP (leaving > forced drain)" even as the stats page continues to report DRAIN state! > > 3) Even when the agent output was amended as above, for hosts that were set to > the DRAIN state pursuant to #1 issue were not brought back to ready/up state > until "enable health $service/$host" and/or "enable agent $service/$host" was > sent to the stats port. > > 4) Setting the server weight to 10 seems to help a significant amount. If, in > fact, haproxy can't handle 35% of 1 it should throw an error on startup IMHO. > > See also my comments interspersed below: > > Thanks, > > Benjamin Smith > > On Tuesday, April 14, 2015 10:50:31 AM you wrote: > > On Tue, Apr 14, 2015 at 10:11 AM, Igor Cicimov < > > > > igorc@...> wrote: > > > On Tue, Apr 14, 2015 at 5:00 AM, Benjamin Smith <lists@...> > > > > > > wrote: > > >> We have 5 Apache servers behind haproxy and we're trying to enable use > > >> the > > >> "httpchk" option along with some performance monitoring. For some reason, > > >> haproxy keeps thinking that 3/5 apache servers are "down" even though > > >> it's > > >> obvious that haproxy is both asking the questions and the servers are > > >> answering. > > >> > > >> Is there a way to log httpchk failures? How can I ask haproxy why it > > >> seems to > > >> think that several apache servers are down? > > >> > > >> Our config: > > >> CentOS 6.x recently updated, 64 bit. > > >> > > >> Performing an agent-check manually seems to give good results. The below > > >> result is immediate: > > >> [root <at> xr1 ~]# telnet 10.1.1.12 9333 > > >> Trying 10.1.1.12... > > >> Connected to 10.1.1.12. > > >> Escape character is '^]'. > > >> up 78% > > >> Connection closed by foreign host. > > >> > > >> > > >> I can see that xinetd on the logic server got the response: > > >> Apr 13 18:45:02 curie xinetd[21890]: EXIT: calcload333 status=0 pid=25693 > > >> duration=0(sec) > > >> Apr 13 18:45:06 curie xinetd[21890]: START: calcload333 pid=26590 > > >> from=::ffff:10.1.1.1 > > >> > > >> > > >> I can see that apache is serving happy replies to the load balancer: > > >> [root <at> curie ~]# tail -f /var/log/httpd/access_log | grep -i "10.1.1.1 " > > >> 10.1.1.1 - - [13/Apr/2015:18:47:15 +0000] "OPTIONS / HTTP/1.0" 302 - "-" > > >> "-" > > >> 10.1.1.1 - - [13/Apr/2015:18:47:17 +0000] "OPTIONS / HTTP/1.0" 302 - "-" > > >> "-" > > >> 10.1.1.1 - - [13/Apr/2015:18:47:19 +0000] "OPTIONS / HTTP/1.0" 302 - "-" > > >> "-" > > >> ^C > > > > > > I have a feeling you might have been little bit confused here. Per my > > > understanding, and your configuration: > > > > > > server server10 10.1.1.10:20333 maxconn 256 *check agent-check agent-port > > > 9333 agent-inter 4000* > > > > > > the HAP is doing a health check on the agent you are using and not on the > > > Apache so the apache response in this case looks irrelevant to me. I don't > > > know how did you setup the agent since you haven't posted that part but > > > this is an excellent article by Malcolm Turnbull, the inventor of > > > agent-check, that might help: > > > > > > > > > http://blog.loadbalancer.org/open-source-windows-service-for- reporting-ser > > > ver-load-back-to-haproxy-load-balancer-feedback-agent/ > > We used this exact blog entry as our starting point. In our case, the xinetd > script compares load average, apache process count, cpu info and a little salt > to come up with a number ranging from 0% to 500%. > > > and press enter twice and check the output. Other option is using curl: > > > > $ curl -s -S -i --http1.0 -X OPTIONS http://10.1.1.12:20333/ > > [root <at> xr1 ~]# curl -s -S -i --http1.0 -X OPTIONS http://10.1.1.12:20333 > HTTP/1.1 302 Found > Date: Tue, 14 Apr 2015 23:39:40 GMT > Server: Apache/2.2.15 (CentOS) > X-Powered-By: PHP/5.3.3 > Set-Cookie: PHPSESSID=3ph0dvg4quebl1b2e711d8i5p1; path=/; secure > Cache-Control: public, must-revalidate, max-age=0 > X-Served-By: curie.-SNIP- > Location: /mod.php/index.php > Vary: Accept-Encoding > Content-Length: 0 > Connection: close > Content-Type: text/html; charset=UTF-8 > > > and some variations of the above that I often use to check the headers only: > > > > $ curl -s -S -I --http1.0 -X OPTIONS http://10.1.1.12:20333/ > > $ curl -s -S -D - --http1.0 -X OPTIONS http://10.1.1.12:20333/ > > > > You can also try the health check with HTTP/1.1 version which provides > > keepalive but you need to specify the Host header in that case. > > > > By the way, any errors in the haproxy logs? Maybe set the log mode to debug? > > Originally there was very little useful data in the log files at all. Adding > the log-health-checks helped but it's still frustratingly incomplete. > >
I ran into a similar scenario yesterday on 'HA-Proxy version 1.5.4 2014/09/02'. We had a situation where a radosgw on one of the backend servers was not releasing memory and apache was occasionally showing 500 error messages in the apache log, rados had stopped logging so we wanted to stop new connections going to the server and then restart radosgw. Initially we issued the 'server disable' command to the haproxy socket, and saw in the health status that the server was in MAINT mode, but didnt see new connections stop arriving at the server, so we waited and watched it and about 30 minutes later we issued the 'status drain' command to the socket, and immediately saw connections stop arriving. We restarted the radosgw service at this point. We then issued the 'status ready' command to the socket and saw connections start arriving again, but the server was flip-flopping between MAINT and DRAIN states in the health status output. It was only after I re-issued the 'server enable' command twice to the socket that the server appeared in the health status output as being consistently colored green in its row, and showing UP status. However I still saw the following in the logs after issuing the last 'server enable' command. from: haproxy-status.log: +++++ Server swift_cluster/css-host1-036 is UP/READY (leaving forced maintenance). Server swift_nonssl_cluster/css-host1-036 is UP (leaving forced drain). +++++ The hosts still appear to be receiving new connections, even before i re-issued the 'server enable' command again to the socket and the health status output was showing the host flip-flopping between the MAINT and DRAIN states. Everything seems ok/UP now, and has been stable for the last 12 hours, with no apparent change in the health status output. ...hope this helps... Lucky