Le monitoring, cette belle activité

Par Maxime, le 21 décembre 2009.

Dans un récent article Comment être productif avec 5 écrans (en même temps, ils sont tous récents vu l’âge de ce blog), je vous parlais de mon écran dédié au monitoring. Voici donc le billet tant attendu. Mais je vous préviens, il risque d’être inintéressant :-)

L’hébergement des différents sites de ma société (en somme, VDM et ses déclinaisons linguistiques) est entièrement géré par SD France au niveau matériel, et par votre serviteur au niveau logiciel / administration système. La question qui s’est donc rapidement posée une fois que tout était mis en place fut celle de la surveillance de toutes ces machines, autrement appelée le monitoring.

Les premiers termes qui viennent à l’esprit lorsque l’on parle de monitoring sont Nagios, MRTG, et autres RRDTool, qui sont les outils les plus populaires dans la surveillance en réseau. Pour ma part je les ai trouvés bien trop complexes pour les quelques données dont j’avais besoin au quotidien, c’est pour cela que je me suis orienté sur une solution maison que je vais vous décrire ci-dessous.

Côté serveur

Même si tout un écran peut sembler important niveau espace, lorsque l’on parle de 27 serveurs à monitorer individuellement, il faut se montrer efficace. Il a donc fallu identifier les points-clés à surveiller. J’ai choisi les suivants :

  • Etat de la réplication MySQL : Point névralgique évident lorsque l’on parle de réplication circulaire master-master. Si un des serveurs ne réplique plus, toute la boucle est endommagée immédiatement.
  • Secondes de retard MySQL : Ce n’est pas précisément le temps de retard d’une réplication par rapport à son maître, il s’agit plus précisément de la différence entre le temps actuel et l’heure indiquée sur le log que l’esclave est en train de répliquer. Cela reste cependant un bon indicateur de l’état de santé de la réplication.
  • Connexions Apache : Permet de savoir en permanence les connexions à un instant t sur le cluster Web, ainsi que les types de connexions (lecture, écriture, slot inactif).
  • Statut du serveur Memcache : Le serveur memcache est assez sollicité pour stocker de manière centralisée les sessions PHP du cluster, ainsi que certaines données des sites.
  • Modifications sur le FTP : Plusieurs personnes travaillant sur le FTP, il est parfois utile de savoir quels ont été les derniers fichiers modifiés lorsque survient un problème inexplicable par le simple état des machines. J’ai codé un script qui établit automatiquement un diff du fichier uploadé versus le fichier original, pour plus de lisibilité.

Une fois ces points identifiés avec succès, il a fallu coder les agents qui enverront les données à un serveur central (j’ai dédié un serveur au monitoring). Ces agents envoient actuellement les informations toutes les 5 secondes via le réseau local sur une interface VLAN. Je les ai codés en PHP ou en Perl selon l’inspiration du moment. C’est un serveur Web qui récolte les données et peuple une base MySQL, mais peu importe le langage du moment que les variables sont renseignées dans la base de données.

Côté client

Ma base se peuple maintenant à la vitesse de la lumière (ou du cuivre, selon le degré de poésie). Il faut maintenant développer l’interface qui affichera les données en temps réel sur mon écran de droite.

e25v.png

Par pure déformation professionnelle, j’ai encore tâté de l’HTML. Les connexions à Apache que vous voyez ci-dessus ainsi que les secondes de retard MySQL plus bas ont été réalisées via l’excellente librairie Flash Amcharts que j’avais déjà utilisée auparavant. Cette librairie crée des graphiques en Flash à la volée, au moyen de fichiers XML ou CSV, et permet aussi de rafraîchir ses données à intervalles de temps réguliers.

awak.png

Concernant les données qui ne nécessitent pas de vision en fonction du temps, j’ai tout simplement utilisé de l’AJAX (avec jQuery) qui permet par exemple de rafraîchir l’état de la réplication MySQL et d’afficher l’erreur explicite en cas de panne. J’ai aussi utilisé cette technique pour afficher les dernières modifications du serveur FTP.

rh2t.png

Enfin, comme le résultat donne une page Web, j’avais besoin qu’elle se comporte comme une véritable application, afin d’éviter qu’elle se ferme lorsque je devais redémarrer Safari, ou tout simplement pour pouvoir placer la fenêtre de manière permanente en plein écran sur la droite. J’ai utilisé comme à chaque fois Fluid qui permet tout cela, et même bien plus avec ses librairies Javascript intégrées (vous pouvez par exemple mettre des badges ou des notifications Growl très simplement).

Et quand t’es dehors ?

Avoir un smartphone est forcément indispensable, dans mon cas c’est un iPhone. Vous n’êtes pas sans savoir qu’il ne gère pas le Flash, et quand bien même il le gérerait, ce serait trop lourd pour vérifier d’un coup d’oeil l’état de mes serveurs en Edge ou en Wap. J’ai donc codé une page HTML avec les entêtes HTML qui vont bien pour que l’iPhone considère ça comme une application à part entière :

<meta name="robots" content="noindex" />
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;"/>
<meta http-equiv="cache-control" content="no-cache"/>
<meta name="format-detection" content="telephone=no" />
<meta content="yes" name="apple-mobile-web-app-capable" />
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="apple-touch-icon" href="/mgmt.png"/>
<script type="text/javascript">
	addEventListener(
		"load",
		function() {
		setTimeout(hideURLbar, 0);
		setTimeout('window.location.reload(true)', 5000);
		}, false
	);
	function hideURLbar() { window.scrollTo(0, 1); }
</script>

La page se rafraichit automatiquement toutes les 5 secondes pour me permettre de supprimer totalement la barre d’adresse de l’écran de contrôle.

J’ajoute à côté du screen une autre application qui s’appelle HostMonitor [iTunes], très pratique pour simplement tester des ports sur des machines distantes, le tout sous forme de groupes. Utile si vous voulez juste jeter un oeil sur l’état de santé de votre réseau.

IMG_0378.PNG       IMG_0379.PNG
Le monitoring version iPhone, et HostMonitor.

Un autre outil que j’utilise (mais moins souvent), c’est iStat. Cette application se présente sous la forme d’un client iPhone et de serveur à installer sur tous les ordinateurs que vous souhaitez monitorer. L’avantage est qu’il marche sur Linux aussi bien que sur Mac, avec seulement un port TCP à ouvrir sur chaque serveur. Le détail des paramètres système est paramétrable.

IMG_0376.PNG       IMG_0377.PNG
iStat en action.

Concernant l’installation sur des serveurs Linux, le code source est disponible sur Google Code. Une bonne âme a créé un paquet Debian à partir de ces sources, elle s’appelle Marius (iStat My Linux on My Phone) et le lien se trouve en bas de son article. Un coup de dpkg -i plus tard et vous avez un serveur iStat sur votre Debian (pensez aussi à éditer le /etc/istat.conf si vous ne souhaitez pas que tout le monde connaisse vos stats).

Voilà pour le billet promis, désolé si j’ai mis un peu de temps à le rédiger, et pour la consistance finale de l’article, mais j’ai eu du mal à trouver une meilleure présentation. Comme d’habitude, si vous avez des questions, je tenterai d’y répondre avec mon humble expérience.

31 commentaires

Jérémy

J’aime beaucoup cette façon de faire ! Je vais tester les applis iPhone pour surveiller quelques serveurs dont j’ai la charge.

Jovien

Ne connaissant que peu de choses dans ce domaine, j’ai trouvé ton article très intéressant. D’une part choisir les outils qui t’étaient nécessaires au monitoring de tes serveurs et les agrémenter de façon à ce que ce soit le plus « agréable » à utiliser, il fallait le raconter !

Martin

Maxime Question idiote: pourquoi n’a pas utilisé de solutions de monitoring du genre Zabbix, Nagios+Centreon, etc ?

Hwd

Merci pour ton article ! Je l’attendais depuis ton dernier billet. Mais je t’avoue que je reste un peu sur ma faim :(

J’utilise principalement Nagios avec des plugins Homemade en Perl/PHP et Cacti pour sa partie graph. Mais tu n’en dis pas assez sur la manière d’aller chercher tes infos… tu utilises PHP/Perl pour parser Apache Status ? Tu travailles uniquement avec des requêtes SNMP ou p-e que tu utilises récupère les infos avec des commandes unix depuis tes serveurs ? Dis nous en plus, çà m’intéresse énormément, j’essaye de mettre ce type de monitoring en place, et ca répondrait à certaines de mes problématiques. :)

Je me suis codé aussi une interface pour avoir un aperçu en une seule page de l’état de mes frontaux/dbs, etc, c’est vraiment pratique, mais il me manque maintenant l’aspect graph simple & propre comme ce que tu as mis en place.

Maxime

@Jovien : Merci :)

@Martin : C’est expliqué dans le troisième paragraphe, t’es pas allé loin :-)

@Hwd : Pour les connexions Apache c’est du parse de apache2ctl, les autres sont des variables que tu peux obtenir en faisant une connexion basique sur le serveur (que ce soit MySQL ou Memcache)

Loris

J’adore, une version open source de tes scripts est prévue? :)

Louis

Ton niveau en programmation est tout simplement impressionnant. A chaque fois, ça me met une claque :-D

Bon, par contre, autant je comprend l’utilité de sa solution quand tu es chez toi, autant je ne vois pas bien comment tu peux réagir à tout problème quand tu es dehors. OK, ton iPhone te donnes l’état de la situation, mais bon, ton iPhone n’est pas suffisant pour fixer les différents problèmes. Comment prévoies-tu de réagir dans ce cas là ?

MErci d’avance.

Maxime

@Loris : Disons que comme ce sont des scripts internes, le diffuser m’obligerait à le rendre propre et j’ai vraiment pas le temps pour traiter la globalité du truc. Cependant si certains parseurs t’intéressent je peux toujours mettre les codes ici.

@Louis : Merci :) C’est clair que l’iPhone n’est pas pratique pour agir, juste pour surveiller, même si j’ai un terminal qui peut servir en cas de petit pépin. Sinon j’ai souvent mon macbook pro avec une clé 3G à portée de main quand je bouge.

Loris

Pourquoi pas, on utilise déjà nagios et mrtg, en fait ce que je cherche plutôt et tu as peut être une idée, c’est un gros parser de log d’erreurs (apache, php, sendmail, slowqueries, etc) qui presenterait le tout de façon classe et pratique :D

Jérémy

@Loris tail -f :-)

plus sérieusement pour les logs la ou je travaille on a un serveur syslog et on va tout chercher dessus au besoin. Nous n’avons pas développé d’afficheur de log car nous avons énormément de logs a visualiser donc on tail | grep au besoin !

Sinon pour du monitoring simple avec graph j’utilise parfois FAN qui une distrib autour de Centreon Nagios et quelques autres plugins.

Maxime

@Loris pareil que @Jérémy, je tail le syslog au besoin, sinon mes alertes sont faites avec le monitoring que j’ai mis en place (il vérifie automatiquement l’évolution de certaines valeurs et envoie des notifications si anomalie)

Martin

@Maxime non mais tu donnes pas d’explications tu dis juste que c’est trop « user-friendly » moi qui penser que tu aimais mettre les mains dans le cambouis (quoique tu les as mises dans la merde pendant pas mal de temps chez OVH)

Maxime

@Martin justement je dis l’inverse, c’est pas assez user-friendly :D j’aime beaucoup mettre la main dans le cambouis mais dans ce cas précis ça m’intéressait plus de développer mon monitoring surtout pour certaines évolutions spécifiques (comme la surveillance du memcache ou les seuils d’alerte)

Martin

Je viens de me relire.. j’ai oublié des mots, vraiment le Champagne un dimanche ca me fait dire n’importe quoi le lundi… /quit

Hwd

Tu pourrais mettre à dispo tes parsers comme tu l’as mentionné plus haut ?

Maxime

@Hwd le seul qui n’est pas complètement dénué d’intérêt de par leur simplicité c’est le parseur apache2 : http://pastie.org/751726

Les autres sont juste des connexions aux serveurs, les variables sont dans les tableaux de retour.

Maxence

Sympa :) Sa fait une sacré configuration, j’utilise istats sur différents serveurs et c’est bien pratique.

Sinon pourquoi avoir changé d’hébergeur ? Pour le vlan ?

Maxime

@Maxence : Le VLAN, entre autres. Le support aussi, je reviens d’OVH. Avoir un prestataire qui s’occupe de ses clients pour de vrai, c’est toujours mieux :-)

Mathieu

J’imagine que tous les serveurs de SD France sont en Europe. Tu sais comment ils se comportent pour vos utilisateurs américains ? Il n’y a pas trop de latence ?
J’ai souvent eu envie de ramener mes sites en France (ou en Europe tout du moins) mais vu que 80% de nos clients sont américains j’ai toujours eu peur que la qualité de navigation soit affaiblie pour eux si je le faisais.
Tu utilises des sondes du type ip-Label pour vérifier ce genre de choses ?

Perso j’utilise PlotKit pour mes graphs : http://www.liquidx.net/plotkit/
Ca date un peu mais les graphs sont jolis. Sinon il y’a la librairie Google…

Maxime

@Mathieu : Oui les serveurs de SD France sont parisiens, même :-) En fait tout le statique est hébergé ailleurs, chez Cachefly, qui est dispersé partout dans le monde. Il ne reste qu’à délivrer le contenu dynamique depuis la France.

Concernant les librairies d’affichage c’est clair qu’il y a plein d’alternatives possibles :-) J’ai utilisé amcharts car je m’y étais déjà fait les doigts il y a quelques temps…

taynus —

En etant au Canada (Montreal), je ping VDM et FML a 92ms, google.fr a 95ms, lemonde.fr a 103ms et google.com a 22ms :D. Le chargement de VDM est un poil plus rapide que celui de FML.
Tout ca avec une connexion de 10 mb/s.

Martin

@Maxime tu ne graphs pas LVS ? :)

Maxime

@Martin : bah, bof, tu veux grapher quoi de LVS ?

Martin

@Maxime : http://tepedino.org/lvs-rrd/ tu verras c’est très love, ca te donne une bonne idée de la fréquentation :)

jchavarria

Comme promis, très intéressant cet article :P

Moi je dis juste, que ca manque un peu de APE tout ça ;-) *sifflote*

ALexandre "bragon" Legrix

@Martin : SD France utilise aussi des outils de monitoring perso.

@Maxime : Je graph LVS sur mes cluster, et c’est vrai que ça donne une très bonne idée de la répartition sur les différentes machines.

@Matthieu && @Taynus : comme nous utilisons en tant qu’un de nos transitaires Level3 nous avons une bonne connectivité vers/depuis les USA.

Martin

@Alexandre : vous avez des hommes-heures à perdre pas moi !

Maxime

@Alexandre && @Martin : Merci pour les graphes LVS, en fait c’est le ipvsadm dans le temps, en gros :) c’est sûrement con mais comme j’ai jamais eu de problèmes avec le balancing je vois pas trop l’intérêt de me grapher ça, mais je le ferai peut-être au cas où.

Cyril Bouthors

Bonjour,

J’ai vu sur vos graphs qu’environ 50% des slots Apache sont en « closing », c’est à dire qu’ils attendent que le client termine de télécharger le document. Cela a tendance à surcharger Apache en cas de forte audience, notamment avec les clients « lents » type 3G, RTC, ADSL avec upload saturé avec le p2p, connexions depuis le Brésil, etc.

En général quand ce symptôme apparait, j’installe un reverse proxy HTTP qui a pour effet de réduire d’un ordre 10-100 le nombre de slots Apache bloqués en « closing ».

Voici quelques exemples récents :

Passage de 150 slots à 5 :
http://texom1.housing.isvtec.com/munin/localdomain/localhost.localdomain-apache_processes.html

Passage de 130 slots à 1 :
http://ns132.hiwit.net/munin/Autres/OVH1-apache_processes.html

J’espère que cette optimisation pourra vous être utile.

N’hésitez pas à me contacter pour tout renseignement complémentaire.

Cordialement,

Laisser un commentaire

Note : Pour qu'un commentaire soit affiché, votre e-mail doit être valide, et votre texte ne doit pas comporter d'insultes. Si vous ne respectez pas ça, n'essayez même pas de commenter.