Archives de catégorie : Non classé

Surveillance de la temperature des disques avec Zabbix

Je cherchais un moyen de suivre la température de mes disques durs  et je suis tombé sur cet article.

http://virtuallyhyper.com/2013/10/monitor-smart-attributes-zabbix/

Dans l’ensemble, il est encore à jour. J’ai juste rencontré un souci avec le script perl qui doit renvoyer les informations sur les disques.

Le programme ne renvoyait pas une liste au format json.
J’ai dû modifier la ligne suivante:

par

Ce qui me permet de voir l’évolution de la température des disques dans Zabbix (Je le faisais déjà sous cacti et je trouvais que ça manquait sou Zabbix).

temp

L’article source permet aussi de surveiller le nombre de secteur ré alloué et lever une alerte préventive lorsque le disque commence à défaillir.

 

Mon disque est rempli de snapshots

En analysant l’espace disque d’un serveur, je me suis aperçu que sur notre nexus (repository manager) nous avions un historique assez impressionnant de snapshot. En effet, nous avions tous les builds depuis près de 4 ans à raison d’un build par jour. Cela occupait pas moins de 700Go.

Continuer la lecture

Redis Cluster en java

En commençant à regarder le mode cluster de redis à travers une image docker déjà construire https://github.com/Grokzen/docker-redis-cluster, je me suis aperçu que ce n’est pas si transparent. En effaçant, si on essaye d’ajouter une valeur mais que la clé ne correspond au bon noeud, redis ne renvoi pas OK mais plutôt l’indication de ou insérer la donnée:

Je me suis demandé comment gérer cela dans un programme Java. Est-ce le driver qui va faire le travail ou il faut le gérer à la main.

Si on utilise le driver standard de Jedis, voici ce qu’on obtiens:

Heureusement, Jedis propose une classe pour résoudre ce problème (Je n’ai rien trouvé coté JRedis).

 

Le driver est même capable de récupérer les autres noeuds. Dans l’exemple j’ai indiqué un seul noeud, mais avec le code suivant :

on voit bien que le driver a pu récupérer les autres noeuds:

les sources sont ici

Quelques liens utiles:
commandes redis cluster

– À la découverte de Redis Cluster 3.0

 

Mettre à jour docker sous ubuntu

Pour faire suite au précédent article, je voulais utiliser la fonctionnalité du link qui modifie le /etc/hosts du conteneur parent pour ajouter le nom et l’ip du conteneur fils. Mais cette fonctionnalité est arrivée avec docker 0.11.

Si vous êtes comme moi sous ubuntu 14.04, mon premier réflmexe a été comme indiqué dans la documentation, d’installer docker à partir d’un des dépôts d’ubuntu:

Or dans ce dépôt la version ne suit pas les différentes releases du projet.

Si vous voulez mettre à jour docker dans une version plus récente (1.0.0 aujourd’hui), voila ce qu’il faut faire:

Ce qui nous donne une version :

On peut donc maintenant vérifier que la fonctionnalité est bien présente:

J’ai lancé le serveur redis et l’ai linké à un conteneur de test. On voit bien que dans le /etc/hosts, l’ip du conteneur redis est ajouté. Dans le prochain article, nous allons donc pouvoir lié la datasource et les serveurs applicatifs sans avoir a connaitre à l’avance l’ip de la datasource.

 

Partage de session avec redis, tomcat et docker

Maintenant que nous avons 2 serveurs tomcat, ça serait bien de pouvoir les arrêter un par un (pour effectuer une livraison par exemples) sans que cela n’ait d’impact pour l’utilisateur. Je pense notamment à la gestion de la session utilisateur. Je vais donc essayer de stocker (sérialiser) la session dans une base nosql. Vu qu’il faut juste stocker un couple clé/valeur, c’est beaucoup moins lourd qu’une base de données.

Préparation du code

Pour commencer, je vais reprendre le travail de James Coleman sur ce sujet https://github.com/jcoleman/tomcat-redis-session-manager. Tout d’abord comme je ne suis pas très à l’aise avec gradle (pour le moment), j’ai commencé par créer un pom.xml pour gérer les dépendances et plus tard créer une image docker. Comme expliqué dans le préambule du repository, la détection de la modification de la session pose des soucis si on modifie directement l’objet après avoir fait un getAttribute()

J’ai donc décidé (pour l’exemple) de forcer l’enregistrement de la session à la fin de chaque requête. Il faudra vérifier avec un test de charge que ça ne pose pas de soucis pour une mise en production. Pour utiliser cette libraire, il faut la builder et l’ajouter au répertoire lib de tomcat (ça ne fonctionne pas si la librairie est embarqué dans le projet. Pour faciliter un peu les choses, maven va créer une librairie qui contiendra ses propres dépendances:

Ensuite, il suffit juste au niveau du projet de modifier le fichier META-INF/context.xml pour ajouter une valve et un manager:

On peut personnaliser la machine et le port de redis ainsi que la durée d’une session (ici j’ai réglé à 3 min). Maintenant que tout est configuré, voyons comment intégré cela dans docker.

Préparation des images

J’ai créé un fichier Dockerfile dans le projet tomcat-redis-session-manager pour créer une nouvelle image se basant sur jolokia/tomcat-6.0 et ajoutant notre librairie dans le répertoire lib.

D’ailleurs, il semble que docker est des soucis avec des répertoires symboliques target. Si je remplace la dernière ligne par

j’obtiens l’erreur suivante (/opt/tomcat étant un lien symbolique vers opt/apache-tomcat-${TOMCAT_VERSION})

J’ai ensuite modifier le fichier Dockerfile du projet session-webapp pour se baser sur l’image qu’on vient de créer:

Il ne reste plus qu’à lancer toutes les images pour voir le résultat

Lancement des images

Je commence par lancer redis:

avec la même commande que dans le dernier article, je récupère son ip (à mettre dans le context.xml) Je lance ensuite un redis-cli pour tester la connectivité

Mon serveur redis est donc opérationnel. Je lance maintenant 2 serveurs tomcat et haproxy. Je me connecte maintenant sur le site, je me loggue et fais des refresh sur la page index.jsp. Cela nous donne dans logs:

Je suis bien resté sur le même serveur à chaque fois et j’ai bien récupéré ma donnée product. Si ne n’avais pas fait la modification dans RedisSessionManager, la valeur de product serait toujours de 1. J’ai ensuite arrêté le serveur tomcat et fais des refresh sur index.jsp. Cela nous donne:

J’ai donc bien récupérer ma session et la valeur de product. Pour voir le contenu des clés de redis, on peut utiliser la commande (a ne pas faire en production):

Voila comment tester facilement la persistance de session avec redis et docker.

Les sources sont ici:

load balancing haproxy sous docker

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:

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:

 

Le serveur ne trouve aucun serveur « backend ». C’est ce que l’on constate aussi en regardant les stats:

stats1

En démarrant un container tomcat, on peut voir que les choses s’améliorent:

 

stats2

On a maintenant un premier backend. Et effectivement, en allant sur le site, j’obtiens bien la page voulue

hello1

Je lance maintenant le deuxième:

stats3

Nous avons maintenant une infrastructure avec 2 serveur tomcat et un load balancer devant.

En lancant une commande de type :

On voit bien l’alternance des serveurs dans les logs et dans les stats.

stats4

Les sources de l’exemple sont disponible ici: git.

Contruire une image docker à la suite d’un build maven

Pour mes premiers pas avec docker, je souhaitais faire une appli web java très simple qui s’intègre dans une image docker au moment du build.

J’ai trouvé quelques exemples de plugin maven pour construire facilement une image  mais la plupart utilise une api REST en http qui ne fonctionne plus depuis la version 0.56 de docker. Il faut maintenant utiliser une socket Unix.

J’ai donc utiliser un plugin maven pour lancer la construction de l’image via une ligne de commande (il y a sûrement mieux, mais c’était aussi pour aller vite):

Cette commande va construire l’image à partir d’un fichier DockerFile et va poser un tag composé du nom de l’artefact et de la version. Ce sera plus facile pour retrouver l’image par la suite.

Le fichier Dockerfile est construit comme ceci:

On indique à partir de quelle image on se base. Ici c’est un tomcat.

Puis on ajoute le war dans un répertoire particulier pour que tomcat le charge au démarrage.

Et enfin, on expose le port 8080 pour pouvoir accéder au tomcat depuis l’extérieur du conteneur.

Pour ce faire, il faut lancer le container avec la commande:

Puis la commande :

qui va lister les containers en cours d’exécution et indiquer le container id de chacun.

Et enfin la commande suivante pour récupérer l’adresse du container.

On peut maintenant vérifier que l’application fonctionne bien dans un navigateur:

hello world

Voila pour cette première rencontre avec docker.

Les sources sont ici : https://github.com/BenoitCharret/session-webapp

 

installation de docker sur ubuntu

L’installation sur une distribution ubuntu 14.04 est assez facile (http://docs.docker.io/installation/ubuntulinux/)

Pour tester l’installation on peut lancer la commande suivante qui va telecharger une image ubuntu et executer la commande /bin/bash

 

Publier sur un repository distant avec git et une clé ssh

Voici deux articles pour mettre en place une clé ssh avec git.

Pour générer sa clé et la tester:

https://help.github.com/articles/generating-ssh-keys

Pour que la clé soit prise en compte en ligne de commande:

http://matharvard.ca/posts/2011/aug/11/git-push-with-specific-ssh-key/

A bientot