¿Cómo puedo eliminar el nodo equilibrado de haproxy a través de la línea de comando?

46

Tengo haproxy ejecutándose como mi equilibrador de carga y desde la interfaz web de estadísticas que viene con haproxy, puedo poner un servidor web en modo de mantenimiento (y volver a ponerlo en marcha), ¡lo cual es genial!

Sin embargo, también quiero poder realizar esa misma acción desde la línea de comandos (para usar en algunos flujos de trabajo de implementación automatizados). ¿Es posible? y si lo es, cómo?

Muchas gracias

isNaN1247
fuente

Respuestas:

59

Actualización (28 de agosto de 2012): ahora tiendo a usar haproxyctl hoy en día, que utiliza los métodos que se describen a continuación.


Lo arreglé después de un poco más de investigación, para cualquier otra persona con el mismo problema:

Puede agregar un socket Unix en su configuración, luego interactuar con eso ( aquí están los posibles comandos ).

Para configurar:

sudo nano /etc/haproxy/haproxy.cfg

En su sección 'global' agregue:

stats socket /etc/haproxy/haproxysock level admin

Reinicia tu demonio haproxy (por ejemplo sudo service haproxy restart)

Ahora necesita socat (si no lo tiene, solo apt-get install socaten Ubuntu).

Ahora todo lo que necesita hacer es disparar este comando para eliminar un nodo:

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

Para volver a ponerlo en marcha, reemplace disable con enable en el comando anterior.

isNaN1247
fuente
21

Además del método echo de beardwizzle, también puedes hacer esto de forma interactiva:

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
fuente
66
Una gran dificultad aquí es que el socat de Debian no admite "readline", aunque lo dice en la página del manual. Lo repararon debido a un choque de licencias entre libreadline (GPL) y OpenSSL. En este caso, se usa socat /var/run/haproxy.stat stdiopara cada comando
bentolor
7

En el caso de que solo tenga acceso a netcat ( nc), puede usarlo para interactuar con el archivo de socket de HAProxy de manera similar a 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

Para deshabilitar un servidor:

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

Asegúrese de que el archivo de socket tenga el nivel de acceso adecuado para realizar lo anterior. Principalmente algo como esto:

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

De lo contrario, obtendrá permisos denegados errores:

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

$

Referencias

slm
fuente
7

La manera fácil es:

1 - Configure su servidor web para que devuelva el código 503 si existe un archivo llamado maintenance.html (por ejemplo). Con apache puedes hacerlo de la siguiente manera:

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

2 - Configure su backend haproxy para verificar una URL en lugar de solo verificar un puerto de la siguiente manera:

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 - Reinicia tu servidor web y balanceador de carga.

4 - Pon tu servidor web en modo de mantenimiento.

touch /var/www/maintenance.html

5 - Elimine su servidor web del modo de mantenimiento.

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

También puede "eliminar" temporalmente la página de comprobación de estado de un servidor, para bajar el punto final y luego publicar su aplicación.

rafael oliveira
fuente
0

Si tiene Debian, readline no funciona, netcat es una mejor opción para interactiva:

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
...

No interactivo:

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