Après avoir créé une première image contenant une application basique sous tomcat, je vais tester une montée en charge. Pour cela, nous allons lancer 2 containers tomcat et mettre en place un HA proxy (il s’agit d’un load balancer logiciel qui va répartir la charge entre les 2 containers tomcat.
Je vais utiliser l’image suivante : https://index.docker.io/u/dockerfile/haproxy.
Il y a juste à surcharger la configuration pour l’adapter à nos besoins:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
global log 127.0.0.1 local0 log 127.0.0.1 local1 notice chroot /var/lib/haproxy user haproxy group haproxy # daemon defaults log global mode http option httplog option dontlognull contimeout 5000 clitimeout 50000 srvtimeout 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http listen session-webapp :80 balance roundrobin server tomcat1 172.17.0.3:8080 check server tomcat2 172.17.0.4:8080 check stats enable stats uri /stats |
j’ai repris le fichier de l’image et j’ai ajouté la partie en bas. On va donc faire du round robin entre nos 2 serveurs tomcat qui sont ensuite définis. J’ai gardé la partie stats pour vérifier que tout se passe bien.
En démarrant un container, on obtient le résultat suivant:
1 |
docker run -i -t -v /tmp/session-webapp/src/main/haproxy:/haproxy-override dockerfile/haproxy |
1 2 3 |
[WARNING] 143/194932 (12) : Server session-webapp/tomcat1 is DOWN, reason: Layer4 timeout, check duration: 2002ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue. [WARNING] 143/194933 (12) : Server session-webapp/tomcat2 is DOWN, reason: Layer4 timeout, check duration: 2002ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue. [ALERT] 143/194933 (12) : proxy 'session-webapp' has no server available! |
Le serveur ne trouve aucun serveur « backend ». C’est ce que l’on constate aussi en regardant les stats:
En démarrant un container tomcat, on peut voir que les choses s’améliorent:
1 |
docker run -i -t session-webapp/1.0-SNAPSHOT |
1 |
[WARNING] 143/195256 (12) : Server session-webapp/tomcat1 is UP, reason: Layer4 check passed, check duration: 0ms. 1 active and 0 backup servers online. 0 sessions requeued, 0 total in queue. |
On a maintenant un premier backend. Et effectivement, en allant sur le site, j’obtiens bien la page voulue
Je lance maintenant le deuxième:
1 |
[WARNING] 143/195615 (12) : Server session-webapp/tomcat2 is UP, reason: Layer4 check passed, check duration: 0ms. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue. |
Nous avons maintenant une infrastructure avec 2 serveur tomcat et un load balancer devant.
En lancant une commande de type :
1 |
while [ 1 -eq 1 ]; do wget "http://172.17.0.2/session-webapp/"; done |
On voit bien l’alternance des serveurs dans les logs et dans les stats.
Les sources de l’exemple sont disponible ici: git.