architecture
Remontée d’alerte par SMS avec les API SFR
par guiguiabloc le 03 déc., 2009, sous architecture, geekerie, linux
Comme tout bon sysadmin qui se respecte, vous surveillez scrupuleusement vos serveurs, vos équipements ou que sais-je encore via des outils de monitoring divers et variés.
Votre infrastructure chérie est tellement scrutée que cela rendrais jalouse n’importe quelle jeune maman devant surveiller son bambin.
D’ailleurs, je me suis toujours demander pourquoi on ne passait pas les bébés sous Nagios…
Cela donnerait des résultats intéressants :
AH AH AH :D
Bref…
Les remontées d’alertes “critique” doivent pouvoir avertir en temps réel le sysadmin et comme vous le savez, c’est toujours quand on est loin de son écran que la panne intervient.
L’idéal étant de pouvoir ajouter aux diverses méthodes d’alertes (mails, alarme Nagios, etc…) l’envoi d’un SMS sur votre portable.
Si votre opérateur téléphonique est SFR, vous avez la première solution de vous créer une adresse mail en @sfr.fr.
En activant sur www.sfr.fr, rubrique Messagerie, l’alerte SMS, vous recevez un texto a chaque mail reçu sur cette BAL.
Il vous suffit donc de donner un Sujet de mail lié a l’alerte pour voir s’afficher succinctement sur votre téléphone l’alerte en question.
Le concept est intéressant, malheureusement, le SMS arrive assez aléatoirement, entre une dizaine de minutes à… plusieurs heures.
Forcément, côté remontée d’alerte en temps réel, on fait mieux…
La deuxième solution est beaucoup plus fun et plus efficace.
Je vous propose tout simplement d’utiliser les API de SFR et de contacter directement leur Webservice en SOAP, comme on peut le faire avec OVH.
Classe, non ?
Car chose que vous ne savez peut-être pas, mais les opérateurs téléphoniques proposent discrètement des kits des développement (SDK) permettant de communiquer avec leur infrastructure via la plupart du temps un webservice accessible depuis le nain ternet.
C’est le cas chez Orange sur http://www.orangepartner.com/site/frfr/home/p_home.jsp et également chez SFR.
Client SFR, c’est donc chez eux que je vais utiliser les API.
L’atelier de développement SFR, appelé RED, est accessible sur http://red.sfr.fr/dev-zone/index.php.
L’inscription est gratuite et vous donne accès aux téléchargements des SDK (Php, JAVA et PUB (Market Place SFR).
Egalement avec la mise a disposition des SDK, vous disposez d’un “compte” lié a une application (le red101) qui vous crédite d’un nombre de points vous permettant de tester le service et vos développements (100 SMS pour le mois par exemple)
Les API disponibles sont nombreuses et franchement intéressantes (envoi et réception de SMS, de MMS, géolocalisation de portable, gestion d’évenement, utilisation de carnet d’adresses unifié, etc…)
D’ailleurs, certaines applications développées par la communauté mérite le coup d’oeil
Sachez également que vous avez la possiblité d’acheter des packs de jetons. Exemple pour une vingtaine d’euros vous avec 350 utilisations de l’API SMS ou 267 utilisations de l’API Loc.
Le solde offert est largement suffisant pour couvrir ce que nous voulons faire, une remontée d’alerte critique par SMS sur notre portable.
N’étant pas développeur, j’ai donc choisi forcément le kit PHP, langage qui s’adaptera parfaitement à mon niveau
Les prérequis sur votre serveur sont le module soap et les librairies openssl
Sous Debian :
apt-get install php-soap openssl libssl0.9.8
Tout d’abord, téléchargement du SFR-Red_PHP_SDK_v1.1.
Avec le SDK, vous recevrez également par mail vos certificats SSL a utiliser avec l’API.
Première chose a faire, changer le mot de passe par défaut du certificat (fourni dans le mail) :
openssl rsa -des3 -in guiguiabloc.pem -out guiguiabloc.pem Enter pass phrase for Guiguiabloc.pem: writing RSA key Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
L’arborescence se présente ainsi (j’ai copié mes certificats dans le répertoire pour des raisons de facilité) :
docs/ config.php examples/ wsdl/ Guiguiabloc.crt Guiguiabloc.p12 lib/ config.php Guiguiabloc.jks Guiguiabloc.pem
On renseigne le fichier config.php
<?php /**** Configuration ****/ //Emplacement de la racine du WebService $red_ws_root_endpoint = "https://ws.red.sfr.fr/red-ws/"; //Authentification HTTPS Certificat $red_partner_cert_filepath = "/opt/sfr/Guiguiabloc.pem"; $red_partner_cert_password = "lemotdepaseSSL"; //Authentification Basic Auth $red_partner_name = "Guiguiabloc"; $red_service_name = "red101"; $red_service_password = "lemotdepassequivousaetecommunique"; ?>
Et c’est tout
A vous maintenant d’écrire le script PHP utilisant la méthode SendSMS par exemple :
alerte-sms_bascule-IpFO.php
<?php
//Chargement de la configuration RED
include("/opt/sfr/lib/sfr_red_sdk.v1.1.php");
$REDClientSMS = new SMSService();
$retour = $REDClientSMS->sendSMS(new
UserIdentifier("0612345678","PhoneNumber"),"ALERTE Bascule IPFailOver");
?>On appelle le script : php alerte-sms_bascule-IpFO.php
et hop; magique, un SMS du 6011
:-D
Si vous utilisez heartbeat pour vos bascules d’IP FailOver (suite à la lecture de cet excellent billet ), il vous suffit de rajouter l’appel a ce script dans /etc/ha.d/ressource.d/IPaddrFO.
case $2 in
start) /etc/ha.d/ns11111-failoverupdate.py
php /opt/sfr/alerte-sms_bascule-IpFO.php
ip_start $1;;
stop) ip_stop $1;;
status) ip_status $1;;
monitor) ip_monitor $1;;
*) usage
exit 1
;;
esacCôté Nagios, je suppose que vous gérez déjà les niveaux d’escalades (lire cet excellent Wifi : http://wiki.nagios-fr.org/nagios/objects-reference )
Nagios envoi un mail à la BAL d’escalade et vous executer le script a réception de mail :
dans /etc/aliases
nagiossms: "|php /opt/sfr/alerte-nagios.php"
(par exemple hein, je vous laisse à votre imagination débordante
)
Voilà donc une solution simple pour remonter vos alertes en temps réels, que ce soit vos états critiques Nagios, vos bascules d’IP failover ou la coupure EDF sur votre Onduleur
Amusez-vous bien ![]()
Hadoop, doop, doop, doop…
par guiguiabloc le 12 nov., 2009, sous architecture, linux, sécurité
Un billet qui propose même une version musicale : http://www.youtube.com/watch?v=LUm19zKdASY
Bon ok , je sors…
Vous me direz, j’aurais pu faire pire et vous proposer une nouvelle version de “Oh chéri, chéri” de Karen Cheryl
(désolé Fred…
)
Pour être franc avec vous, j’ai longuement hésité avant de me lancer dans l’écriture de ce billet.
Le sujet est tellement vaste et les possibilités d’utilisation si nombreuses qu’il m’aurait fallu des pages et des pages pour en faire le tour (en plus je suis certain d’avoir un retour amusé de certaines personnes de mon entourage sur ce billet :-D)
Mais après tout, pourquoi pas ? Donc je vais l’aborder sans plonger dans les détails mais suffisamment, je pense, pour pouvoir vous amuser (c’est bien le but, non ?
)
Hadoop, quoi que c’est ?
Pour citer Wikipédia :
“Hadoop est un framework java libre destiné aux applications distribués et à la gestion intensive des données. Il permet aux applications de travailler avec des milliers de nœuds et des pétaoctets de données. Hadoop a été inspiré par les publications MapReduce, GoogleFS et BigTable de Google.”
Parmi les éléments composant Hadoop, nous allons retrouver principalement:
- HDFS (Hadoop Distributed File System), le système de fichiers distribués
- MAPREDUCE , un framework pour les calculs parallèles et distribués
- HBASE , la base de données distribuées
- ZOOKEEPER , un service de centralisation pour coordonner les systèmes distribués
- PIG , plateforme pour l’analyse d’un grand nombre de données
Vous l’avez compris, Hadoop sert principalement au traitement de gros volumes de données.
A cet effet, je vous invite à regarder la vidéo d’Olivier Grisel lors de sa présentation d’Hadoop et MapReduce a l’Open Source Developers Conference 2009 (vous retrouverez cette présentation ICI ).
Vous me direz “Oui mais bon, en quoi ça me concerne moi ???”.
Tsss, petit scarabée, il n’y a pas si longtemps, dans une galaxie lointaine, vous stockiez l’intégralité de vos photos de vacances de votre vie sur un disque de 10 Go….
Aujourd’hui où le moindre APN bas de gamme prend une photo de 5 Mo, je vous laisse imaginer la volumétrie nécessaire pour stocker l’intégralité de vos clichés de vacances avec Tata Simone et surtout la cousine Juliette…
Bref, vous l’avez compris, la capacité des disques augmentent mais les vitesses de transfert, elles ne suivent pas.
En 1990, sur un disque de 1,4Go, avec un taux de transfert de 4,4 Mo/s, il vous fallait environ 5 minutes pour le lire entièrement. De nos jours, pour un disque d’1To, avec un taux de transfert de 100 Mo/sec, il vous faut presque 2h30 pour la même opération…
Diviser ces données sur 100 disques et, par cette lecture parallèle, toutes les données peuvent être lues en moins de 2 minutes.
Ceux qui utilisent le système RAID doivent comprendre
Pour de plus amples détails, je vous invite a parcourir le Wiki Hadoop ou vous plonger dans l’excellent “Hadoop, The definitive Guide” chez O’Reilly .
Pour bien comprendre le fonctionnement d’Hadoop, comme toujours, un joli dessin pour tenter de conceptualiser le bouzin.
Il faut discerner tout d’abord la partie HDFS qui est le système de fichier distribué d’Hadoop, composé d’un serveur maître, le NameNode et de serveurs détenant les données proprement dites, les Datanodes.
Quand une application cliente a besoin d’accéder a une information, elle interroge le NameNode qui lui indique les Datanodes sur lesquels se trouve ces informations. Une fois en possession de cette liste, l’application cliente va directement interroger le(s) Datanodes.
Dans une architecture HDFS, un fichier est découpé en un ou plusieurs blocs et réparti sur les datanodes du cluster. De plus, chaque bloc est répliqué suivant le facteur de réplication que vous avez spécifié dans votre configuration.
Je ne vais pas vous expliquer en détails la façon dont est architecturé HDFS, je vous invite à lire cette page pour bien comprendre la structure :
http://hadoop.apache.org/common/docs/current/hdfs_design.html
Ensuite, par dessus HDFS, nous avons la partie moteur MAP/REDUCE avec un JobTracker, genre de centralisateur de tâches, et des TaskTracker qui se chargent d’executer les travaux demandés.
Le Client soumet la requète de travail au JobTracker qui va les transmettre au(x) TaskTracker concerné(s) en s’efforcant d’être au plus proche de la donnée.
Concernant MapReduce, son rôle consiste à diviser le traitement en 2 étapes :
- la première phase (Map) est une étape d’ingestion et de transformation des données sous la forme de paires clé/valeur
- la seconde phase (Reduce) est une étape de fusion des enregistrements par clé pour former le résultat final
Source : InternetCollaboratif
, sinon je vous invite à vous rendre sur cette page de Wikipédia qui vous donnera un peu plus d’explication sur son fonctionnement (inutile que je vous raconte la même chose
)
Sachez enfin qu’Hadoop est utilisé chez Yahoo!, Facebook, le New York Times, Last.fm etc… Bref, déjà bien éprouvé en production…
Bien, trêve de bavardage, attaquons nous a tout cela.
La société Cloudera propose sur son site une installation automatisée d’Hadoop, permettant de monter son cluster Hadoop en trois clics et configurable à souhait.
Excellente initiative qui mérite d’être saluée.
Mais bon, nous, on n’a pas peur, on est même plutôt “couillu” donc on va se la faire en mode installation a la mimine.
Pré-requis :
- Un JAVA 1.6 sur les serveurs : http://java.sun.com/javase/downloads/index.jsp
- Un utilisateur “hadoop” par exemple
- une paire de clés ssh privé/publique pour cet utilisateur afin de contrôler les noeuds du cluster
Téléchargez les sources sur : http://hadoop.apache.org/core/releases.html
tar xzvf hadoop-0.20.1.tar.gz chown -R hadoop:hadoop hadoop-0.20.1 su - hadoop ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa ssh localhost (et sur les autres noeuds également)
Il existe 3 modes d’installation d’Hadoop :
- Mode StandAlone (local)
- Mode Pseudo-Distributed(chaque démon Hadoop est lancé dans un process Java indépendant)
- Mode Fully-Distributed (Cluster)
Bien évidemment, nous, même pas peur, on va se faire l’installation “Cluster”.
Pour ce billet, je vais partir sur un cluster de 4 machines comme décris dans le schéma plus haut.
Pour faciliter les tests, le NameNode sera également DataNode.
Un petit dessin reprenant le nom des machines et leurs rôles pour la suite :
Les fichiers de configurations se trouve dans.. conf.
Voici les principaux :
hadoop-env.sh Variables d’environment utilisées par Hadoop
core-site.xml Configuration principal (comme les paramètres I/O pour HDFS et MapReduce
hdfs-site.xml Configuration des démons HDFS
mapred-site.xml Configuration pour le démon MapReduce (jobtracker et les tasktrackers)
masters Liste des machines qui sont NameNode secondaire
slaves Liste des machines qui sont datanodes et tasktracker
Vous n’avez pas à spécifier le NameNode et le JobTracker dans le fichier “masters”.
Pour la partie HDFS, c’est en lançant le script start-dfs.sh sur la machine qu’elle va être désignée NameNode et executer le démarrage des datanodes listées dans le fichier “slaves”.
Idem pour la partie MapReduce et le script stop-mapred.sh.
Le premier a modifier est celui de l’environnement, puis le core-site.xml et le hdfs-site.xml pour la partie HDFS, enfin le maprep.xml pour la partie Mapreduce.
hadoop-env.sh
export JAVA_HOME=/opt/jdk1.6.0_16 # Taille mémoire allouée à chaque démon (ici 2Go) export HADOOP_HEAPSIZE=2000 export HADOOP_LOG_DIR=/tmp
Il existe d’autres options que vous pouvez affiner.
core-site.xml
On définit l’URI du NameNode
fs.default.name hdfs://guiguiabloc-namenode/
hdfs-site.xml (HDFS)
<!-- ici le chemin local du filesystem où le NameNode stocke ses données --> dfs.name.dir /data/hdfs <!-- ici le chemin local du filesystem où le DataNode stocke ses données --> dfs.data.dir /data/hdfs2
mapred-site.xml (MAPREDUCE)
Ici on spécifie le répertoire local qui servira a MapReduce pour écrire ses données temporaires.
Puis le répertoire système proprement dit (dans le filesystem HDFS)
mapred.job.tracker guiguiabloc-jobtracker:8021 mapred.local.dir /opt/mapred mapred.system.dir /hdfs/mapred/system mapred.tasktracker.map.tasks.maximum 4
slaves
Ici nous spécifions tout les noeuds datanodes/tasktrackers
guiguiabloc-namenode
guiguiabloc-datanode-a
guiguiabloc-datanode-b
Commencons les joyeusetés :
On “formate” notre HDFS (sur guiguiabloc-namenode)
guiguiabloc-namenode:~$ bin/hadoop namenode -format 09/11/12 14:38:31 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = guiguiabloc-namenode/127.0.1.1 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 0.20.1 STARTUP_MSG: build = http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.20.1-rc1 -r 810220; compiled by 'oom' on Tue Sep 1 20:55:56 UTC 2009 ************************************************************/ Re-format filesystem in /data/hdfs ? (Y or N) Y 09/11/12 14:38:33 INFO namenode.FSNamesystem: fsOwner=hadoop,hadoop 09/11/12 14:38:33 INFO namenode.FSNamesystem: supergroup=supergroup 09/11/12 14:38:33 INFO namenode.FSNamesystem: isPermissionEnabled=true 09/11/12 14:38:33 INFO common.Storage: Image file of size 96 saved in 0 seconds. 09/11/12 14:38:34 INFO common.Storage: Storage directory /data/hdfs has been successfully formatted. 09/11/12 14:38:34 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at guiguiabloc-namenode/127.0.1.1 ************************************************************/
Puis on démarre le Namenode (qui se chargera de démarrer les datanodes)
$ bin/start-dfs.sh starting namenode, logging to /tmp/hadoop-hadoop-namenode-guiguiabloc-namenode.out guiguiabloc-namenode: starting datanode, logging to /tmp/hadoop-hadoop-datanode-guiguiabloc-namenode.out guiguiabloc-datanode-b: starting datanode, logging to /tmp/hadoop-hadoop-datanode-guiguiabloc-datanode-b.out guiguiabloc-datanode-a: starting datanode, logging to /tmp/hadoop-hadoop-datanode-guiguiabloc-datanode-a.out localhost: starting secondarynamenode, logging to /tmp/hadoop-hadoop-secondarynamenode-guiguiabloc-namenode.out
Si tout se déroule correctement, vous devriez voir les noeuds esclaves démarrés :
2009-11-12 16:14:38,974 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting DataNode STARTUP_MSG: host = guiguiabloc-datanode-a/91.xx.xx.xx STARTUP_MSG: args = [] STARTUP_MSG: version = 0.20.1 STARTUP_MSG: build = http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.20.1-rc1 -r 810220; compiled by 'oom' on Tue Sep 1 20:55:56 UTC 2009 ************************************************************/ 2009-11-12 16:14:39,297 INFO org.apache.hadoop.hdfs.server.common.Storage: Storage directory /data/hdfs is not formatted. 2009-11-12 16:14:39,297 INFO org.apache.hadoop.hdfs.server.common.Storage: Formatting ... 2009-11-12 16:14:40,062 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Registered FSDatasetStatusMBean 2009-11-12 16:14:40,065 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Opened info server at 50010 2009-11-12 16:14:40,068 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Balancing bandwith is 1048576 bytes/s ...
Il ne vous reste qu’a vous connecter sur l’interface http://guiguiabloc-namenode:50070 pour voir l’état de votrte cluster
Maintenant démarrons la partie MapReduce.
hadoop@guiguiabloc-jobtracker:~$ bin/start-mapred.sh starting jobtracker, logging to /tmp/hadoop-hadoop-jobtracker-guiguiabloc-jobtracker.out guiguiabloc-namenode: starting tasktracker, logging to /tmp/hadoop-hadoop-tasktracker-guiguiabloc-namenode.out guiguiabloc-datanode-a: starting tasktracker, logging to /tmp/hadoop-hadoop-tasktracker-guiguiabloc-datanode-a.out guiguiabloc-datanode-b: starting tasktracker, logging to /tmp/hadoop-hadoop-tasktracker-guiguiabloc-datanode-b.out
Idem les noeuds tasktracker démarrent également :
2009-11-12 16:58:09,822 INFO org.apache.hadoop.mapred.TaskTracker: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting TaskTracker STARTUP_MSG: host = guiguiabloc-datanode-b/91.xx.xx.xx STARTUP_MSG: args = [] STARTUP_MSG: version = 0.20.1 STARTUP_MSG: build = http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.20.1-rc1 -r 810220; compiled by 'oom' on Tue Sep 1 20:55:56 UTC 2009 ************************************************************/ ... 2009-11-12 16:58:47,185 INFO org.apache.hadoop.ipc.Server: IPC Server handler 6 on 43676: starting 2009-11-12 16:58:47,185 INFO org.apache.hadoop.mapred.TaskTracker: TaskTracker up at: localhost/127.0.0.1:43676 2009-11-12 16:58:47,186 INFO org.apache.hadoop.mapred.TaskTracker: Starting tracker tracker_guiguiabloc-datanode-b:localhost/127.0.0.1:43676 2009-11-12 16:58:47,230 INFO org.apache.hadoop.ipc.Server: IPC Server handler 7 on 43676: starting 2009-11-12 16:58:47,238 INFO org.apache.hadoop.mapred.TaskTracker: Using MemoryCalculatorPlugin : org.apache.hadoop.util.LinuxMemoryCalculatorPlugin@1af33d6 2009-11-12 16:58:47,241 WARN org.apache.hadoop.mapred.TaskTracker: TaskTracker's totalMemoryAllottedForTasks is -1. TaskMemoryManager is disabled. 2009-11-12 16:58:47,242 INFO org.apache.hadoop.mapred.IndexCache: IndexCache created with max memory = 10485760 2009-11-12 16:58:47,243 INFO org.apache.hadoop.mapred.TaskTracker: Starting thread: Map-events fetcher for all reduce tasks on tracker_guiguiabloc-datanode-b:localhost/127.0.0.1:43676
Vous pouvez vérifier l’état de l’ensemble en vous connectant sur http://guiguiabloc-jobtracker:50030
Une fois tout bien démarrer, il ne vous reste qu’a créer les accès pour les utilisateurs :
$ bin/hadoop fs -mkdir /user/username $ bin/hadoop fs -chown username:username /user/username
Pour appliquer un quota d’ 1To a un user par exemple :
$ bin/hadoop dfsadmin -setSpaceQuota 1t /user/username
Des outils de Benchmark sont fournis avec, vous permettant de tester votre cluster :
Par exemple pour tester l’écriture de 10 fichiers de 1G
$ bin/hadoop jar /opt/hadoop/hadoop-0.20.1-test.jar TestDFSIO -write -nrFiles 10 -filesize 1000
Idem pour les Mapreduces
$ bin/hadoop jar /opt/hadoop/hadoop-0.20.1-examples.jar randomwriter random-data $ bin/hadoop jar /opt/hadoop/hadoop-0.20.1-examples.jar sort random-data sorted-data Running on 3 nodes to sort from hdfs://guiguiabloc-namenode/user/hadoop/random-data into hdfs://guiguiabloc-namenode/user/hadoop/sorted-data with 5 reduces. Job started: Thu Nov 12 16:47:41 CET 2009
Dans votre interface d’administration, les Jobs s’afficheront avec le résultat.
Vous voilà désormais à la tête d’un joli cluster Hadoop qu’il est grand temps de mettre à contribution.
Je vous invite a lire les nombreux tuto qui existent sur le site d’Hadoop (http://hadoop.apache.org/common/docs/current/mapred_tutorial.html par exemple).
Voila pour cette première approche d’Hadoop, en espérant que cela à titiller votre envie d’en savoir plus sur cette architecture.
Bien évidemment, je n’ai fait qu’approcher le sujet, j’y reviendrais peut-être dans d’autres billets maitenant que notre architecture Hadoop est en place afin de vous montrer la formidable puissance de cet environnement.
Amusez-vous bien ![]()
Cisco Etherchannel, VTP, OSPF et HSRP
par guiguiabloc le 11 oct., 2009, sous architecture, cisco, geekerie
Outch, la, on cumule
Dans les précédentes aventures du Blog, je vous avais fait part de mon “acquisition” de 2 routeurs Cisco 3620.
Après avoir fait un peu “mumuse” avec (ah la la, les geeks et leurs joujoux…) il était temps de les racker dans ma baie et surtout de repenser un peu l’architecture de mon LAN.
Je vous propose donc aujourd’hui un billet un peu “rigolo” sur les technos Cisco mais surtout, comment appliquer en quelques minutes des configurations que vous avez de très fortes chances de rencontrer dans un réseau d’entreprise.
Je ne détaillerais pas en nombreuses lignes le principe de fonctionnement des technologies mises en oeuvre (je vous laisse surfer sur le Nain Ternet pour plus de détails, ou, si vous le souhaitez, je pourrais m’attarder sur l’une d’entre elles sur un autre billet), mais je vous expliquerais l’essentiel (je pense) pour les utiliser.
D’ailleurs, je vous invite à farfouiller cet excellent site qui regorge de détails sur les technologies Cisco :
Bon, une tasse de café/guronsan/doliprane prête ? Les onglets sur YouPorn YouTube, P0rno.org AFP.com fermés ? On se concentre, et on y va.
(<privatejoke> Fred me susurre de se détendre avant l’effort, donc, oui, Fred, un peu de Karen Cheryl avant tout </privatejoke>)
- Etats des lieux
Le rackage est achevé et la baie réseau de la maison ressemble à cela actuellement :
Donc une architecture normale de particulier…
Mon switch Cisco Catalyst commencant a être saturé, il est temps de mettre en fonction le catalyst 2950 qui me servait de Spare en cas de panne.
Pour schématiser ce que nous allons mettre en place, voici a quoi ressemble les branchements dans la baie (provisoirement il s’entend
)
La liaison entre les deux switchs se fait par câbles réseaux croisés (dans mon cas, j’en utilise deux), que je vais agréger dans un etherchannel.
- ETHERCHANNEL
L’etherchannel est une technique d’interconnexion LAN entre switches (ou routeurs bien sûr) pour offrir sur un seul lien logique, plusieurs ports Fast ou Gigabit Ethernert.
Non seulement cela vous permet de créer une redondance en cas de panne d’une interface mais également d’agréger le débit disponible et/ou de faire de l’équilibrage de charge.
Sous Linux, vous trouverez cette technique sous le nom de “Channel Bonding” ou “Teaming” sous l’OS SALE.
La syntaxe entre le 2924 et le 2950 est différente, donc adaptons nous :
sw-2924 :
interface FastEthernet0/21 description --- portchannel sw-2950 fa 0/21 --- duplex full speed 100 port group 1 distribution destination switchport trunk encapsulation dot1q switchport mode trunk ! interface FastEthernet0/22 description --- portchannel sw-2950 fa 0/22 --- duplex full speed 100 port group 1 distribution destination switchport trunk encapsulation dot1q switchport mode trunk sw-2924#sh port group 1 Group Interface Transmit Distribution ----- --------------------- --------------------- 1 FastEthernet0/21 destination address 1 FastEthernet0/22 destination address
sw-2950 :
interface Port-channel1 switchport mode trunk speed 100 duplex full flowcontrol send off interface FastEthernet0/21 description --- port-channel sw-2924 fa 0/21 --- switchport mode trunk speed 100 duplex full no cdp enable channel-group 1 mode on ! interface FastEthernet0/22 description --- portchannel sw-2924 fa 0/22 --- switchport mode trunk speed 100 duplex full no cdp enable channel-group 1 mode on sw-2950#sh interfaces port-channel 1 status Port Name Status Vlan Duplex Speed Type Po1 connected trunk full 100 sw-2950#sh interfaces port-channel 1 etherchannel Age of the Port-channel = 0d:00h:21m:02s Logical slot/port = 1/0 Number of ports = 2 GC = 0x00000000 HotStandBy port = null Port state = Port-channel Ag-Inuse Protocol = - Ports in the Port-channel: Index Load Port EC state No of bits ------+------+------+------------------+----------- 0 00 Fa0/21 On/FEC 0 0 00 Fa0/22 On/FEC 0
Voila pour la partie liaison redondante des deux switches.
NB: Pour les puristes, je suis en mode “on” (etherchannel) car c’est le seul mode que comprend le 2924, bien évidemment, sur des gammes supérieures, essayez le mode active/passive/auto ou desirable suivant le protocole que vous souhaitez utiliser (LACP ou PAgP).
- VTP
Comme je l’avais expliqué dans un précédent billet , j’utilise les Vlans dans mon réseau. Afin d’éviter de devoir renseigner les vlans dans chaque switches, nous allons utiliser VTP (Vlan Trunking Procotol), toujours en niveau 2, qui permet de centraliser la base de données des Vlans sur un switch et de le diffuser aux autres du même domaine.
Très pratique mais aussi très dangereux si vous y aller a la légère
.
Sur le 2924, je le définis comme “Server” :
sw-2924# vlan database sw-2924# vtp server sw-2924# vtp domain GUIGUIABLOCVTP sw-2924# vtp password weshjesuislepatron sw-2924# sh vtp status VTP Version : 2 Configuration Revision : 2 Maximum VLANs supported locally : 68 Number of existing VLANs : 19 VTP Operating Mode : Server VTP Domain Name : GUIGUIABLOCVTP
Sur le 2950, il va falloir définir VTP en mode client (il existe 3 modes, serveur, client et transparent (ou autonome)).
ATTENTION : le champ “Configuration Revision” du futur client est très important, il faut absolument que sa valeur soit inférieure au “Server” sinon vous risquez de perdre vos vlans ! (expérience connue….).
Donc, première chose à faire, sauvegarder votre vlan.dat :
sw-2924#copy flash:vlan.dat tftp://10.154.12.1 Address or name of remote host [10.154.12.1]? Destination filename [vlan.dat]? !! 1396 bytes copied in 0.57 secs
Le plus simple étant de passer le client en mode “Transparent” d’abord, puis “Client” après, ce qui remettra a zéro le numéro de révision.
sw-2950(config)#vtp mode transparent sw-2950#sh vtp status VTP Version : 2 Configuration Revision : 0 sw-2950(config)#vtp mode client sw-2950(config)# vtp domain GUIGUIABLOCVTP sw-2950(config)# vtp password weshjesuislepatron
Après quelques secondes, vous devriez voir les VLANs appris par le client :
sw-2950#sh vtp status VTP Version : 2 Configuration Revision : 2 Maximum VLANs supported locally : 128 Number of existing VLANs : 19 VTP Operating Mode : Client VTP Domain Name : GUIGUIABLOCVTP
Désormais, les ajouts, suppressions, modifications de VLANs ne se feront que sur le 2924, qui les répercuteras sur le 2950.
- OSPF
Ah, ah, ah. Alors là il faudrait quelques heures pour en faire le tour c’est pourquoi je ne vais pas m’attarder en détails. Surtout qu’il existe un excellent article de “Monsieur” hr du GCU-SQUAD dans le Jardin qui vous expliquera tout en détails :
Pour résumer très basiquement, OSPF est un protocole de routage IP interne. Chaque routeur communique a ses voisins les réseaux auxquels il est directement connecté. Cette base connue de tous permet ensuite a chaque routeur de déterminer la route la plus courte vers chacun des réseaux. Ce protocole étant dynamique, un changement de route, une perte de lien est apprise en quelques secondes par les autres routeurs qui se chargeront ou de l’assimiler ou de trouver un autre chemin pour se rendre dans le réseau impacté.
Sur mon routeur principal, le 2611, on prépare la conf (les chiffres entre parenthèses vous amènent a l’explication) :
router ospf 1 log-adjacency-changes area 0 authentication message-digest redistribute connected metric-type 1 subnets (1) redistribute static subnets (1) passive-interface default (2) no passive-interface FastEthernet0/0.100 (3) network 10.154.100.0 0.0.0.255 area 0 (4)
(1) J’annonce tous les réseaux sur lesquels je suis directement connecté (également les subnets)
(2) Je désactive OSPF sur toutes les interfaces sauf celles explicitement nommées
(3) Je parle OSPF sur la sub-interface fa 0/0.100
(4) J’annonce le réseau 10.154.100.0/24 en tant qu’area0, réseau qui correspond a mon backbone.
On prépare les deux routeurs 3620 :
rt-3620-a
interface Loopback1 ip address 10.154.13.8 255.255.255.255 router ospf 1 log-adjacency-changes area 0 authentication message-digest redistribute connected subnets passive-interface default no passive-interface FastEthernet0/0.100 network 10.154.100.248 0.0.0.0 area 0
rt-3620-b
interface Loopback1 ip address 10.154.13.9 255.255.255.255 router ospf 1 log-adjacency-changes area 0 authentication message-digest redistribute connected subnets passive-interface default no passive-interface FastEthernet0/0.100 network 10.154.100.249 0.0.0.0 area 0
Roulez jeunesse, le temps que ca converge (quelques secondes) et les routes sont apprises de partout :
rt-2611#sh ip ospf neighbor Neighbor ID Pri State Dead Time Address Interface 10.154.13.8 1 FULL/DROTHER 00:00:33 10.154.100.248 FastEthernet0/0.100 10.154.13.9 1 FULL/BDR 00:00:33 10.154.100.249 FastEthernet0/0.100
FULL = nous sommes voisins et échangeons les routes
DROTHER = nous ne sommes ni DR (designated router) ni BDR (backup designated router)
BDR = nous sommes le “backup designated router” de ce réseau
rt-2611# sh ip route ... O E2 10.154.13.9/32 [110/20] via 10.154.100.249, 00:00:05, FastEthernet0/0.100 O E2 10.154.13.8/32 [110/20] via 10.154.100.248, 00:00:05, FastEthernet0/0.100 ... rt-3620-b#sh ip route ... C 10.154.13.9/32 is directly connected, Loopback1 O E2 10.154.13.8/32 [110/20] via 10.154.100.248, 00:00:40, FastEthernet0/0.100 O E1 10.154.13.1/32 [110/21] via 10.154.100.253, 00:00:40, FastEthernet0/0.100 ...
Mouahhh c’est beau
- HSRP
Dernière étape et non la moindre, mise en place d’HSRP.
Le Hot Standby Router Protocol est un protocole propriétaire de Cisco que vous connaissez sûrement sous d’autres noms dans d’autres environnements comme VRRP ou (et surtout), CARP sous *BSD dont je vous ai souvent parler. (ICI ou LA)
Ce protocole permet de “partager” une IP Virtuelle qui sera affectée au routeur “Maitre”. En cas de panne de ce routeur, le routeur “Esclave” s’approprie cette adresse IP et reprend donc la continuité de service.
Pour une solution de continuité de service, c’est quand même ce qu’il se fait de mieux (qui a dit VSS au fond ?
:-) )
Nous allons configuré une interface de routage pour le Vlan 600, en 10.154.60.254 que se partageront le rt-3620-a, le Maître en 10.154.60.248 et le rt-3620-b, l’Esclave en 10.154.60.249 dans le groupe 10 (ce n’est qu’un identifiant pour HSRP et ses membres)
rt-3620-a(config)#int fa 0/0.600 rt-3620-a(config-subif)#encapsulation dot1Q 600 rt-3620-a(config-subif)#ip address 10.154.60.248 255.255.255.0 rt-3620-a(config-subif)#standby 10 priority 100 rt-3620-a(config-subif)#standby 10 ip 10.154.60.254 rt-3620-b(config)#int fa 0/0.600 rt-3620-b(config-subif)#encapsulation dot1Q 600 rt-3620-b(config-subif)#ip address 10.154.60.249 255.255.255.0 rt-3620-b(config-subif)#standby 10 priority 80 rt-3620-b(config-subif)#standby ip 10.154.60.254
On vérifie que ca ping :
Guiguiabloc-a:~# ping 10.154.60.254 PING 10.154.60.254 (10.154.60.254) 56(84) bytes of data. 64 bytes from 10.154.60.254: icmp_seq=1 ttl=255 time=1.44 ms 64 bytes from 10.154.60.254: icmp_seq=2 ttl=255 time=1.69 ms
Le traceroute me confirme le routeur Maître :
Guiguiabloc-a:~# traceroute 10.154.60.254 traceroute to 10.154.60.254 (10.154.60.254), 30 hops max, 40 byte packets 1 * 2 10.154.100.248 (10.154.100.248) 7.797 ms * *
Sur le rt-3620-b, on voit que l’interface est en attente :
FastEthernet0/0.600 is up, line protocol is up Internet protocol processing disabled
Ne reste qu’a couper l’interface pour avoir une bascule transparente
rt-3620-a(config)#int fa 0/0.600 rt-3620-a(config-subif)#shut Guiguiabloc-a:~# traceroute 10.154.60.254 traceroute to 10.154.60.254 (10.154.60.254), 30 hops max, 40 byte packets 1 * 2 10.154.100.249 (10.154.100.249) 7.705 ms
Magique
Voila donc en “quelques” lignes une approche de diverses techonologies que vous croiserez sûrement dans un LAN d’entreprise.
Il est évident qu’a petite échelle c’est un régal a mettre en place, sur une grosse infra, on est beaucoup plus enclin a réfléchir avant d’appuyer sur la touche “entrée”…
Espérant avoir titiller votre fibre réseau, amusez vous bien ![]()
Réplication de serveurs Memcached
par guiguiabloc le 08 sept., 2009, sous architecture, linux
C’est la rentrée, j’espère que les vacances se sont bien passées pour tout le monde, et que, comme moi, vous avez énormément pris sur vous en croisant un panneau “Wi-Fi libre accès” sous les regards noirs et appuyés de Madame… :-p (le même regard qu’elle vous jettera d’ailleurs quand, sur la plage, refoulant le souvenir de cette borne Wi-Fi, vos yeux glisseront subrepticement sur le corps de la jeune demoiselle à quelques pas de vous, quand elle dégrafera son haut de maillot de bain…) BREF !!!
Fin de l’encart “vacances perverses”
et je vous souhaite une bonne reprise quand même
Nul besoin de vous refaire une présentation de Memcached dont j’avais abordé le sujet précédemment.
Vous l’utilisez parce que vous avez une forte charge sur vos serveurs et vous avez été conquis par ses performances, et c’est bien
Comme vous le savez, fidèles lecteurs (ou pas) de ce blog (et je vous en remercie, c’est toujours très agréable de savoir que le temps passé a tester et écrire des articles est au moins lu par quelques milliers dizaines de personnes
), j’aborde assez souvent la notion de haute-disponibilité.
Outre l’incomparable avantage de permettre au Sysadmin de pouvoir terminer sa nuit tranquillement sans devoir se rendre a 4h du matin au Datacenter pour remettre en service un serveur capricieux, elle permet surtout de disposer d’une infrastructure solide et disponible de façon quasi-permanente qui feront les joies de votre DI/RSI/DRH/DAF etc. etc. (liste non exhaustive).
Dans cette architecture hautement disponible, vous avez greffé un serveur memcached (ou pour soulager vos serveurs de base de données, ou pour distribuer du contenu statique, ou gérer vos sessions utilisateurs, ou que sais-je encore…).
Oui mais voila, si le serveur Memcached tombe, et bien ca colle quand même un frein à vos performances en attendant qu’il reparte.
Nous aurions bien évidemment pu installer un deuxième serveur Memcached en secours et basculer une ip flottante type fail-over/carp sur l’esclave en cas de panne du Maître mais il faut repeupler le cache… Pas très sexy comme méthode (même si efficace).
Je vous propose donc une autre solution, une réplication Memcached entre X serveurs de ce type.
(et là vous pouvez faire “Oooohhh”)
- REPCACHED
Pour cette solution, nous allons utiliser le projet REPCACHED qui ajoute a Memcached les fonctions de réplication dont vous trouverez les sources sur :
http://sourceforge.net/projects/repcached/files/
Parmi ses fonctionnalités :
- multi master replication.
- asynchronous data replication.
- support all memcached command (set, add, delete, incr/decr, flush_all, cas)
Par contre, si l’on peut reprocher quelque chose à ce projet dans l’état actuel des choses, c’est son manque quasi total de documentation
Deux types de sources sont disponibles :
- 1 patch version 2.2 pour Memcached (version 1.2.8 à l’heure où j’écris)
ou
- L’ensemble complet Repcached 2.2 + Memcached 1.2.8
Le seul pré-requis est d’avoir l’API libevent (un apt-get install libevent-dev sous Debian suffira)
L’installation en mode patch est la suivante :
$ wget http://memcached.googlecode.com/files/memcached-1.2.8.tar.gz $ tar zxf memcached-1.2.8.tar.gz $ cd memcached-1.2.8.tar.gz $ wget http://downloads.sourceforge.net/project/repcached/repcached/2.2-1.2.8/repcached-2.2-1.2.8.patch.gz $ gzip -cd repcached-2.2-1.2.8.patch.gz | patch -p1
Pour les deux modes (patch ou full sources) :
$ ./configure --enable-replication $ make $ make install
Désormais, vous avez des options supplémentaires pour le lancement du démon :
Guiguiabloc-a:/opt/memcached/bin$ ./memcached -h memcached 1.2.8 repcached 2.2 ... -x hostname or IP address of peer repcached -X TCP port number for replication (default: 11212)
Le fonctionnement est assez basique.
Vous démarrez le premier serveur en lui passant l’option -x adresse_ou_ip_partenaire
memcached@Guiguiabloc-a:~/bin$ ./memcached -d -x Guiguiabloc-b memcached@Guiguiabloc-a:~/bin$
Le serveur Memcached utilise par défaut le port 11212 pour la réplication, pensez à ouvrir votre firewall.
Maintenant nous allons démarrer le deuxième serveur en lui passant l’option -x
memcached@Guiguiabloc-b:~/bin$ ./memcached -d -x Guiguiabloc-a memcached@Guiguiabloc-b:~/bin$
Ne reste qu’à tester.
Injectons un couple clé/valeur sur le maître directement par telnet.
NB: Vous trouverez sur http://lzone.de/articles/memcached.htm un récapitulatif des commandes existantes (Merci a Fred (le seul geek que je connaisse qui écoute “Oh chéri chéri” de Karen Cheryl” en boucle sur son Ipod) pour le lien)
memcached@Guiguiabloc-a:~/bin$ telnet Guiguiabloc-a 11211 Trying 192.168.50.1... Connected to guiguiabloc-a. Escape character is '^]'. get url END set url 1 0 19 blog.guiguiabloc.fr STORED get url VALUE url 1 19 blog.guiguiabloc.fr END
En détails, je vérifie s’il existe une valeur pour la clé “url” (get url).
La réponse est négative, je stocke donc la clé “url”, 1 signifiant “arbitrary metadata”, 0 “n’expire jamais”, 19 bytes de longueur, et la valeur.
On redemande la clé “url”, c’est bon.
Maintenant sur le deuxième serveur :
memcached@Guiguiabloc-b:~/bin$ telnet guiguiabloc-b 11211 Trying 192.168.50.2... Connected to guiguiabloc-b. Escape character is '^]'. get url VALUE url 1 19 blog.guiguiabloc.fr END
Un succès !
Vous pouvez tester dans l’autre sens, en modifiant la valeur de la clé “url” sur le deuxième serveur, elle sera modifiée sur le premier.
En coupant brutalement l’un des deux et en le relancant, vous verrez que son cache se met a jour automatiquement via la réplication Memcached.
memcached@Guiguiabloc-a:/opt$ telnet guiguiabloc-a 11211 Trying 192.168.50.1... Connected to Guiguiabloc-a. Escape character is '^]'. get url VALUE url 1 19 blog.guiguiabloc.fr END quit Connection closed by foreign host. memcached@Guiguiabloc-a:/opt$ killall memcached memcached@Guiguiabloc-a:/opt$ ps aux | grep memcached 1002 5927 0.0 0.2 4168 1068 pts/0 S 19:26 0:00 su - memcached 1002 5966 0.0 0.1 3344 744 pts/0 S+ 19:39 0:00 grep memcached memcached@Guiguiabloc-a:~/bin$ ./memcached -d -x guiguiabloc-b memcached@Guiguiabloc-a:~/bin$ telnet guiguiabloc-a 11211 Trying 192.168.50.1... Connected to guiguiabloc-a. Escape character is '^]'. get url VALUE url 1 19 blog.guiguiabloc.fr END
Bilan, un excellent outil de haute-disponibilité qui inclut enfin le double sens de réplication (dans les versions antérieures (1.0), il fallait définir le Maître en le démarrant sans paramètres et l’esclave en lui passant l’option -x. En cas de crash du Maître, l’esclave devenait Maître. Le failback se réglait en lancant l’ancien Maître avec l’option -x.
On peut juste regretter l’absence quasi totale de documentation et même si le projet a bientôt 2 ans, il semble particulièrement mature pour de la production. A suivre donc.
Amusez-vous bien ![]()










