Wie kann ich einen ausgeglichenen Knoten von Haproxy über die Befehlszeile entfernen?

46

Ich habe Haproxy als Load-Balancer ausgeführt und über die mit Haproxy gelieferte Statistik-Webschnittstelle kann ich einen Webserver in den Wartungsmodus versetzen (und ihn wieder zurücksetzen) - was großartig ist!

Ich möchte diese Aktion jedoch auch über die Befehlszeile ausführen können (zur Verwendung in einigen automatisierten Bereitstellungsworkflows). Ist das möglich und wenn ja wie?

Danke vielmals

isNaN1247
quelle

Antworten:

59

Update (28. August 2012): Heutzutage verwende ich eher Haproxyctl , das die unten beschriebenen Methoden verwendet.


Ich habe es nach ein wenig mehr Nachforschungen für alle anderen mit dem gleichen Problem behoben: -

Sie können einen Unix-Socket in Ihre Konfiguration einfügen und dann damit interagieren ( hier sind die möglichen Befehle ).

So richten Sie ein:

sudo nano /etc/haproxy/haproxy.cfg

Fügen Sie in Ihrem Bereich "Global" Folgendes hinzu:

stats socket /etc/haproxy/haproxysock level admin

Starten Sie Ihren Haproxy-Daemon neu (zB sudo service haproxy restart)

Jetzt brauchst du socat (wenn du es nicht hast, nur apt-get install socatauf Ubuntu).

Jetzt müssen Sie nur noch diesen Befehl auslösen, um einen Knoten herunterzufahren:

echo "disable server yourbackendname/yourservername" | socat stdio /etc/haproxy/haproxysock

Um es wieder zu aktivieren, ersetzen Sie "disable" durch "enable" im obigen Befehl.

isNaN1247
quelle
21

Zusätzlich zur Echomethode von beardwizzle können Sie dies auch interaktiv tun:

root@ny-lb01:/etc/haproxy# sudo socat readline /var/run/haproxy.stat 

prompt
> set timeout cli 1d
> disable server foo/web01
> help
Unknown command. Please enter one of the following commands only :
  clear counters : clear max statistics counters (add 'all' for all counters)
  clear table    : remove an entry from a table
  help           : this message
  prompt         : toggle interactive mode with prompt
  quit           : disconnect
  show info      : report information about the running process
  show stat      : report counters for each proxy and server
  show errors    : report last request and response errors for each proxy
  show sess [id] : report the list of current sessions or dump this session
  show table [id]: report table usage stats or dump this table's contents
  get weight     : report a server's current weight
  set weight     : change a server's weight
  set timeout    : change a timeout setting
  disable server : set a server in maintenance mode
  enable server  : re-enable a server that was previously in maintenance mode
Kyle Brandt
quelle
6
Ein großes Problem dabei ist, dass Debians Socat "readline" nicht unterstützt, obwohl dies in der Manpage so steht. Sie haben es aufgrund eines Lizenzkonflikts zwischen libreadline (GPL) und OpenSSL ausgebessert. In diesem Fall verwenden Sie socat /var/run/haproxy.stat stdiofür jeden einzelnen Befehl
bentolor
7

Wenn Sie nur Zugriff auf netcat ( nc) haben, können Sie damit auf ähnliche Weise wie mit HAProxys Socket-Datei interagieren socat.

$ echo "show info" | nc -U /var/lib/haproxy/stats | head -10
Name: HAProxy
Version: 1.5.2
Release_date: 2014/07/12
Nbproc: 1
Process_num: 1
Pid: 29745
Uptime: 0d 0h14m35s
Uptime_sec: 875
Memmax_MB: 0
Ulimit-n: 8034

So deaktivieren Sie einen Server:

$ echo "enable server bk_dservers/ds02" | nc -U /var/lib/haproxy/stats

Stellen Sie sicher, dass die Socket-Datei über die entsprechende Zugriffsberechtigung verfügt, um die oben genannten Vorgänge auszuführen. Hauptsächlich so etwas:

stats       socket /var/lib/haproxy/stats level admin

Andernfalls erhalten Sie Fehler, denen die Erlaubnis verweigert wurde:

$ echo "disable server bk_dservers/ds02" | nc -U /var/lib/haproxy/stats
Permission denied

$

Verweise

slm
quelle
7

Der einfache Weg ist:

1 - Konfigurieren Sie Ihren Webserver so, dass er 503-Code zurückgibt, wenn beispielsweise eine Datei mit dem Namen maintenance.html vorhanden ist. Mit Apache können Sie dies wie folgt tun:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{ENV:REDIRECT_STATUS} !=503
  RewriteCond "/var/www/maintenance.html" -f
  RewriteRule ^(.*)$ /$1 [R=503,L]
</IfModule>

2 - Konfigurieren Sie Ihr Haproxy-Backend so, dass eine URL überprüft wird, anstatt nur einen Port wie folgt zu überprüfen:

backend site
    balance roundrobin
    option httpchk GET /index.html
    server myserver1.example.com 192.0.2.1:80 cookie S1 check inter 2000 fall 3
    server myserver2.example.com 192.0.2.2:80 cookie S2 check inter 2000 fall 3

3 - Starten Sie Ihren Webserver und Load Balancer neu.

4 - Versetzen Sie Ihren Webserver in den Wartungsmodus.

touch /var/www/maintenance.html

5 - Entfernen Sie Ihren Webserver aus dem Wartungsmodus.

rm -f /var/www/maintenance.html
mijhael3000
quelle
2

Sie können die Integritätsprüfungsseite auch vorübergehend von einem Server "entfernen", um den Endpunkt herunterzufahren und Ihre Anwendung dann zu veröffentlichen.

Rafael Oliveira
quelle
0

Wenn Sie Debian haben, Readline funktioniert nicht, ist Netcat eine bessere Option für interaktive:

user@server:/etc/haproxy$ sudo nc -U /etc/haproxy/haproxysock
prompt
> show info
Name: HAProxy
Version: 1.7.11-1ppa1~xenial
Release_date: 2018/04/30
Nbproc: 1
Process_num: 1
Pid: 12307
Uptime: 0d 10h33m22s
...

Nicht interaktiv:

echo "show info;show stat" | sudo nc -U /etc/haproxy/haproxysock
wjenkins9
quelle