50 votes

Comment supprimer un nœud équilibré de haproxy via la ligne de commande ?

J'utilise haproxy comme équilibreur de charge et, à partir de l'interface web de statistiques fournie avec haproxy, je peux mettre un serveur web en mode maintenance (et le remettre en service), ce qui est très bien !

Cependant, je souhaite également pouvoir effectuer cette même action à partir de la ligne de commande (pour l'utiliser dans certains flux de déploiement automatisés). Est-ce possible, et si oui, comment ?

Merci beaucoup

64voto

esnowrackley Points 553

Mise à jour (28 août 2012) : J'ai maintenant tendance à utiliser haproxyctl qui utilise les méthodes décrites ci-dessous.


J'ai corrigé le problème après quelques recherches supplémentaires, pour tous ceux qui ont le même problème :-)

Vous pouvez ajouter un socket unix dans votre configuration, puis interagir avec lui ( Voici les commandes possibles ).

A mettre en place :

sudo nano /etc/haproxy/haproxy.cfg

Dans votre section "global", ajoutez :

stats socket /etc/haproxy/haproxysock level admin

Redémarrez votre démon haproxy (par ex. sudo service haproxy restart )

Vous avez maintenant besoin de socat (si vous ne l'avez pas, il vous suffit de apt-get install socat sur Ubuntu).

Il ne vous reste plus qu'à lancer cette commande pour démanteler un nœud :

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

Pour le rétablir, remplacez disable par enable dans la commande ci-dessus.

0 votes

Bonjour, puis-je savoir pourquoi la plupart du temps cela ne fonctionne pas ? J'utilise Haproxy 1.8. EG : Bien que le poids affiché soit "0 (initial 60)", l'interface affiche toujours le poids 60 et les connexions passent toujours.

21voto

Kyle Brandt Points 81077

Outre la méthode de l'écho de beardwizzle, vous pouvez également procéder de manière interactive :

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

7 votes

A grand Le piège ici est que socat de Debian ne supporte pas "readline" bien qu'il le dise dans la page de manuel. Ils l'ont supprimé à cause d'un conflit de licence entre libreadline (GPL) et OpenSSL. Dans ce cas, vous devez utiliser socat /var/run/haproxy.stat stdio pour chaque commande

9voto

nex3 Points 4309

Si vous n'avez accès qu'à netcat ( nc ), vous pouvez l'utiliser pour interagir avec le fichier socket de HAProxy de manière similaire à 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

Pour désactiver un serveur :

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

Veillez à ce que le fichier socket ait le niveau d'accès approprié pour effectuer les opérations ci-dessus. Il s'agit principalement de quelque chose comme ceci :

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

Sinon, vous obtiendrez des erreurs de refus d'autorisation :

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

$

Références

7voto

mijhael3000 Points 136

La solution la plus simple est la suivante :

1 - Configurez votre serveur web pour qu'il renvoie le code 503 si un fichier nommé maintenance.html (par exemple) existe. Avec Apache, vous pouvez le faire comme suit :

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

2 - Configurez votre backend haproxy pour qu'il vérifie une URL au lieu de seulement vérifier un port comme suit :

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 - Redémarrez votre serveur web et votre équilibreur de charge.

4 - Mettez votre serveur web en mode maintenance.

touch /var/www/maintenance.html

5 - Retirez votre serveur web du mode maintenance.

rm -f /var/www/maintenance.html

2voto

hachre Points 1016

Vous pouvez également "supprimer" temporairement la page du bilan de santé d'un serveur, afin de mettre le point final hors service et de publier ensuite votre application.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X