HAProxy - Management
Alasta 20 Juillet 2013 ha Apache CentOS cli HA Proxy Linux Load Balancer Open Source Reverse Proxy
Description : Dans cet articles nous allons voir la granularité du management.
Le Management :
Description
C'est un bien grand mot pour indiquer comment mettre des serveurs backend en backup, maintenance via le fichier de configuration et le pseudo cli.
Configuration
Serveur en Backup
haproxy.cfg
Il suffit d'ajouter backup à la ligne "server ...."
global log 127.0.0.1 local0 log 127.0.0.1 local1 notice #log loghost local0 info maxconn 4096 #debug #quiet user haproxy group haproxy stats socket /var/run/haproxy.stat level admin defaults log global mode http option httplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen IP_stats 192.168.5.17:80 stats enable stats uri /stats // Endroit où les stats seront consultables stats auth pseudo:password // votre username : password frontend ft_www bind 192.168.5.18:80 mode http log global option httplog maxconn 4000 default_backend bk_apache backend bk_apache balance static-rr mode http server apache1 10.0.0.1:80 check server apache2 10.0.0.2:80 check backup server apache3 10.0.0.3:80 check backup
Page Web
On voit bien qu'il n'y a pas de load balancing dans notre exemple car sur 3 serveurs il y en a 2 en backups.Page de statistiques
Comme précédemment on voit bien que toutes les requêtes sont envoyées sur apache1 et les 2 autres serveurs en backup.
Simulation de panne de apache1
Faisons tomber apache1 :
service httpd stop
Les stats nous indiquent bien qu'apache1 est down mais à par les nombres de sessions, visuellement on voit pas trop qu'apache2 à prit le relais.
Autre point indiqué dans la documentation officiel, il n'y a qu'un backup qui prend le relais en cas de perte de TOUS les serveurs normaux.
Pour avoir plusieurs serveurs backups actif, il faut ajouter option allbackups dans la section backend.
Il est peut être intéressant d'avoir un serveur de backup pour distribuer une page d'indisponibilité, dans ce cas ne pas mettre de cookie (voir article persistance).
Serveur en Disabled
haproxy.cfg
Il suffit d'ajouter disabled à la ligne "server ...."
Je focalise sur la partie du fichier qui nous intérésse.
backend bk_apache balance static-rr mode http option allbackups server apache1 10.0.0.1:80 check server apache2 10.0.0.2:80 check server apache3 10.0.0.3:80 check disabled
Cela aura pour effet de mettre le serveur MAINT pour maintenance.
Page de Statistiques
C'est bien beau de mettre un serveur en maintenance, mais un load balancer en production c'est pas génial de faire des redémarrages de service !
Pour palier à cela il y a un pseudo cli, pourquoi pseudo, parce qu'il a le mérite d'exister mais pas assez de fonctionnalités hélàs.
CLI
Sur ma configuration j'ai du installer socat :
yum install socat
Il faut avoir la ligne suivante dans la section global :
stats socket /var/run/haproxy.stat level admin
L'interface
root@haproxy ~ # socat stdio /var/run/haproxy.stat prompt > ? Unknown command. Please enter one of the following commands only : clear counters : clear max statistics counters (add 'all' for all counters) 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 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
Sur ma configuration après quelques secondes (genre le temps de voir la syntax d'une commande), le shell m'éjecte ...
Partons de l'exemple précédent, à savoir apache3 en maintenance, nous allons le réactiver sans redémarrage du service haproxy :
root@haproxy ~ # socat readline /var/run/haproxy.stat prompt > enable server bk_apache/apache3
Note :
Les actions en CLI ne survivent pas au redémarrage de service !
Comme on le voit au dessus, il y a d'autres actions comme affichage des erreurs, stats, session, poids d'un serveur backend (on le verra plus tard), modifier le poids d'un serveur à la volée.
Attention certaines actions ne peuvent pas être appliquées avec certaines méthode de load balancong (ex : modif de poids sur un algo static-rr).
Il est possible de le faire via la commande echo :
# echo "show stat" | socat stdio /var/run/haproxy.stat pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt, IP_stats,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,1,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,, IP_stats,BACKEND,0,0,0,0,2000,0,0,0,0,0,,0,0,0,0,UP,0,0,0,,0,114,0,,1,1,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0, ft_www,FRONTEND,,,0,0,4000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,2,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,, bk_apache,apache1,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,1,0,0,0,114,0,,1,3,1,,0,,2,0,,0,L4OK,,0,0,0,0,0,0,0,0,,,,0,0, bk_apache,apache2,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,2,1,0,0,0,114,0,,1,3,2,,0,,2,0,,0,L4OK,,0,0,0,0,0,0,0,0,,,,0,0, bk_apache,apache3,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,3,1,0,0,0,114,0,,1,3,3,,0,,2,0,,0,L4OK,,0,0,0,0,0,0,0,0,,,,0,0, bk_apache,BACKEND,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,UP,6,3,0,,0,114,0,,1,3,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0,
Le poids des serveurs
Dans une ferme de serveurs il n'est pas rare d'avoir des serveurs avec des capacités de traitements différents, pour cela il faut mettre des poids (weight) différents aux serveurs.
Il faut pour cela "connaître" ou avoir une idée des performances des serveurs.
Pour simplifier l'explication on va schématiser (un peu à l'extrème) ainsi :
- apache1 a 1 processeur
- apache2 a 2 processeurs
- apache3 a 3 processeurs
Ce qui va avoir pour effet d'envoyer 1 requête à apache1, 2 à apache2 et 3 à apache3.
Dans la section backend de haproxy.cfg :
backend bk_apache balance roundrobin mode http server apache1 10.0.0.1:80 check weight 1 server apache2 10.0.0.2:80 check weight 2 server apache3 10.0.0.3:80 check weight 3
On voit bien la répartition entre les différents serveurs backend.