La déduplication de données

Profitons de cette journée pluvieuse pour parler d’un peu de stockage. J’ai relativement peu l’occasion de parler de stockage sur ce blog bien que ce soit un sujet particulièrement intéressant, surtout dans le cas des réseaux de stockage. Ce n’est cependant pas de réseaux de stockage dont nous parlerons aujourd’hui mais de déduplication de données.

Notion de duplication

La notion de duplication de données est relativement simple. Prenons un jeu de données, la duplication de ces données donne un second jeu identique de données mais sur un autre espace de stockage. Il est possible de faire de la duplication dans le cas de la copie de disques ou de DVD par exemple. Il est également intéressant de faire de la duplication de données dans le cas de la virtualisation. Lorsque des machines virtuelles sont « provisionnées » ou bien, plus simplement, créées, une technique envisageable est la duplication d’une machine virtuelle « template ».

Dans le cas de la virtualisation, de nombreuses données sont présentes en plusieurs exemplaires. Sur une plateforme de virtualisation, il va être exécuté un certain nombre de systèmes d’exploitation. Un serveur de virtualisation standard aujourd’hui est capable d’exécuter 20 à 30 machines virtuelles. Supposons que ces machines virtuelles disposent de 2-3 systèmes d’exploitation différents, cela implique que 7 à 15 copies du même système d’exploitation vont être stockées.

Définition de la duplication

La déduplication va nous permettre de solutionner en grande partie ce problème. Cette technique a pour objectif de supprimer les doublons/triplons/etc du support de stockage afin de stocker qu’une seule copie des données. Il est possible d’implémenter cette technique à plusieurs endroits et à plusieurs niveaux. Prenons tout d’abord l’exemple de la mémoire vive et ensuite, l’exemple des disques.

Déduplication de la mémoire vive

La mémoire vive est un support de stockage d’information particulièrement couteux. Nous avons donc tout intérêt à en optimiser son utilisation. L’exemple que nous avons proposé plus haut pour illustrer la duplication des données est tout à fait valable pour les informations stockées en mémoire vive.

Le système d’exploitation va calculer une empreinte (« hash » pour les anglophones) pour une certaine unité de stockage pour la totalité de la mémoire vive. Lorsque le système rencontrera deux unités présentant la même empreinte, il en supprimera une copie et fera un lien vers l’unique copie. L’unité de stockage utilisée est, souvent, la page mémoire. Une empreinte est donc calculée pour chaque page mémoire et la déduplication se fait à ce niveau.

A ma connaissance, seuls les systèmes de virtualisation utilisent cette technique pour la mémoire vive. C’est, plus particulièrement, le cas de VMWare et de Xen 4.0.

Déduplication de disques

L’exemple de la mémoire vive est transposable aux supports de disque divers. La déduplication au niveau des disques va permettre les mêmes avantages que la mémoire vive et utilisera le même fonctionnement. La différence se situe principalement au niveau de l’unité de stockage qui sera choisie pour le calcul de l’empreinte. Le bloc sera, le plus souvent, utilisé pour les disques.

Une application réelle pour la déduplication se situe d’une part dans les systèmes de virtualisation mais aussi dans les systèmes de sauvegarde dans lesquels on peut retrouver de (très) nombreuses copies d’une même copie. Les équipements qui effectuent la déduplication sont les SAN mais aussi les systèmes de fichiers (« filesystem » pour les anglophones).

Vous allez me dire « Mais mon Linux il sait pas faire ca ! » et, oui, vous avez raison. Si vous voulez effectuer de la déduplication au niveau d’un système de fichiers, il va falloir utiliser ZFS sous OpenSolaris. J’en parlerais dans un prochain billet. Il serait prévu d’inclure ce type de fonctionnalité dans Btrfs.

Au final, j’espère avoir fait un tour d’horizon assez complet de cette technique relativement récente mais que je trouve particulièrement intéressante.

Installation de Xen 4.0 sur Debian Lenny

Les tutoriels d’installation ne sont pas forcément les plus intéressants à blogger et j’en ai fait très peu pour cette raison. J’avais déjà parlé de l’installation de Xen 3.2.1 sur Debian Lenny. Au moment où j’ai écrit ce billet, cette version commençait à être relativement vieillissante. Je vais donc traiter aujourd’hui de l’installation de Xen 4.0.

Petit historique

Vous savez peut être que Xen a été quelque peu obscurcit par l’introduction de KVM dans le noyau Linux. Cette inclusion de KVM a conduit des distributions telles que Red Hat et Ubuntu à supprimer Xen de leurs distributions ou de ne laisser qu’un support pour le moins minimal. A l’époque de ces faits, Xen n’était compatible qu’avec un ou deux noyaux Linux patchés par l’équipe de Xen. Cette époque est révolue car Xen a évolué vers les noyaux dits « Paravirt Ops » ce qui signifie que la compatibilité d’un noyau Linux avec Xen ne tient plus qu’à un module de ce même noyau.

La version Xen 4.0 est particulièrement intéressante car il s’agit de la première version qui fonctionne par défaut avec les noyaux Paravirt Ops. L’installation de versions antérieures vous assurera la douleur de devoir éventuellement passer vers une version supérieure à la 4.0 lorsque vous voudrez mettre à jour vos noyaux Linux.

Installation

Nous pouvons désormais passer aux choses sérieuses. Nous allons effectuer une installation à partir des sources car il n’existe pas encore de paquets. Et puis de toute façon, une petite compilation ne vous fait pas peur !

Nous allons tout d’abord récupérer l’archive sur le site de Xen et on la dézippe :

wget http://bits.xensource.com/oss-xen/release/4.0.0/xen-4.0.0.tar.gz

tar zxvf xen-4.0.0.tar.gz

Nous allons ensuite installer tous les pré-requis et ils sont nombreux.

apt-get install bcc bin86 gawk bridge-utils iproute libcurl3 libcurl4-openssl-dev bzip2 module-init-tools transfig tgif texinfo texlive-latex-base texlive-latex-recommended texlive-fonts-extra texlive-fonts-recommended pciutils-dev mercurial build-essential make gcc libc6-dev zlib1g-dev python python-dev python-twisted libncurses5-dev patch libvncserver-dev libsdl-dev libjpeg62-dev iasl libbz2-dev e2fslibs-dev git-core uuid-dev gcc-multilib

Passons désormais à la compilation. Si vous avez une machine dotée de plusieurs cœurs / processeurs, n’hésitez surtout pas à utiliser l’option -jX où X est le nombre de cœurs que vous avez. Cette option permet de répartir la compilation sur tous les cœurs et ainsi de la finir plus rapidement. J’avais un BiQuad Core, donc ce sera 8 pour cet exemple.

make -j8 xen

make -j8 tools

make -j8 stubdom

Ensuite, on installe tout ca.

make -j8 install-xen

make -j8 install-tools

make -j8 stubdom

Grâce à toutes ces commandes, nous avons installé Xen ainsi que tous les outils associés. Il nous manque plus que le noyau Linux pour les domaines. A partir de là, vous pouvez soit créer votre propre noyau soit utiliser un noyau proposé par Xen. J’ai choisi de faire cela car c’était plus simple, plus rapide et plus pratique.

On va donc exécuter la commande qui va nous permettre de récupérer et de compiler le noyau qui va bien pour notre installation de Xen.

make -j8 world

Pour installer le noyau que vous avons compilé, il ne manque qu’à exécuter la commande suivante. On crée au passage l’initrd qui va bien.

make install

mkinitramfs -o /boot/initrd-2.6.31.13.img 2.6.31.13

Vous devez ensuite modifier Grub afin qu’il s’adapte à Xen. La configuration suivante fonctionne sur l’hyperviseur que j’ai eu l’occasion d’installer. Il faut adapter le root en fonction de votre serveur. Ici, il s’agissait d’un contrôleur RAID HP.

title           Xen 4.0.0 / Debian GNU/Linux, kernel 2.6.31.13
root            (hd0,1)
kernel          /boot/xen-4.0.0.gz
module          /boot/vmlinuz-2.6.31.13 root=/dev/cciss/c0d0p2 ro console=tty0
module          /boot/initrd-2.6.31.13.img

Vous pouvez ensuite rebooter sur votre nouvelle installation de Xen 4.0 avec votre noyau Paravirt Ops. Si vous souhaitez modifier des options à la compilation du noyau, il faut se placer dans le bon répertoire et activer les bons paramètres dans le menu.

cd build-linux-2.6-pvops_x86_64

make menuconfig

Il faut activer le support TUN/TAP si vous souhaitez exécuter des domaines HVM ainsi que le support du 802.1Q si vous souhaitez placer vos domaines sur différents VLAN. Ces deux options ne sont pas activées par défaut.

Au final, j’espère que ce tutoriel vous sera utile et que j’ai été clair. Le passage vers les noyaux en Paravirt Ops est une évolution majeure dans l’histoire de Xen et permettra une adoption nettement plus large.

Génération de certificats OpenVPN par lots

J’ai déjà eu l’occasion de parler d’OpenVPN plusieurs fois sur ce blog car je pense qu’il s’agit d’une application très intéressante. J’avais déjà traité l’installation d’OpenVPN sur OpenSolaris et le client MacOS Viscosity. Une problématique régulièrement rencontrée est la génération de certificats SSL pour OpenVPN afin de créer des accès utilisateur à un serveur.

La méthode la plus simple consiste à utiliser les outils easy-rsa en ligne de commande. Ces outils simplifient réellement la tâche par rapport à l’utilisation directe d’OpenSSL. Le problème avec l’utilisation de ces outils est la nécessité d’interagir avec le terminal. Cet outil va vous demander bon nombre de renseignements tels que le pays, la ville, l’adresse email, etc. Cette interaction rend compliquée la création par lots de certificats.

Une méthode plus compliquée, mais plus efficace, consiste à adapter les scripts easy-rsa afin de rendre leur utilisation plus linéaire et non interactive afin qu’un script puisse les exécuter. De plus, j’ai souhaité donner la possibilité de spécifier la durée de validité du certificat au cas par cas, ce qui n’est pas possible par défaut.

Le premier script, build-key-batch, permet de créer une clé en spécifiant une durée de validité. Il n’y a qu’une toute petite modification qui permet de récupérer la durée de validité passée en argument.

#!/bin/sh

if test $# -ne 2; then
     echo « usage: build-key-batch <name> <duree> »;
     exit 1
fi

if test $KEY_DIR; then
     cd $KEY_DIR && \
     openssl req -days $2 -nodes -new -keyout $1.key -out $1.csr -batch -config $KEY_CONFIG && \
     openssl ca -days $2 -out $1.crt -in $1.csr -batch -config $KEY_CONFIG && \
     chmod 0600 $1.key
else
     echo you must define KEY_DIR
fi

Par défaut, easy-rsa nécessite d’exécuter le fichier vars dont le rôle est d’exporter un certain nombre de variables d’environnement utilisées par les scripts de génération de clé. Cela ne me convenait pas car je souhaitais exécuter un seul fichier contenant toutes les informations dont je pouvais avoir besoin. J’ai donc créé un script nommé build-batch qui contient toutes les options.

#!/bin/sh
if test $# -ne 2; then
     echo « usage: batch-build <name> <duree> »;
     exit 1
else
     # Definition des variables
     export D=`pwd`
     export KEY_CONFIG=$D/openssl.cnf
     export KEY_DIR=$D/keys
     export KEY_SIZE=1024
     export KEY_COUNTRY=FR
     export KEY_PROVINCE=XX
     export KEY_CITY=Paris
     export KEY_ORG= »Keeyyyy »
     export KEY_EMAIL= »$1″
     export KEY_CNAME=$1
     ./build-key-batch $1 $2
fi

Ce script nécessite une petite modification du fichier openssl.cnf présent dans le dossier easy-rsa qui est la suivante :

commonName = Common Name (eg, your name or your server\’s hostname)
commonName_max = 64
++ commonName_default = $ENV::KEY_CNAME

Le script a exécuter afin de générer un certificat est donc build-batch suivi de deux arguments qui sont le nom du certificat et la durée de validité. Vous pourrez ainsi générer des certificats pour OpenVPN simplement et efficacement sans nécessiter une intervention humaine.

Source : insights

Le futur d’OpenSolaris

Ce billet marque une petite pause dans les billets sur la gestion du réseau d’une LAN Party. Au début de ce blog, j’avais annoncé que je ne souhaitais pas être un blog traitant de l’actualité au jour le jour car il en existe déjà de nombreux. Je vais donc traiter aujourd’hui de l’actualité d’OpenSolaris suite au rachat de Sun par Oracle.

Vous le savez sans aucun doute tous, Oracle a racheté Sun suite à de nombreuses négociations avec les différentes autorités notamment européennes. Sun est un grand groupe informatique relativement peu connu du grand public aujourd’hui mais qui a largement participé à l’expansion de l’informatique tel que nous la connaissons aujourd’hui. Les produits les plus connus de Sun sont la base de données MySQL, le système d’exploitation Solaris et la plateforme Java. Oracle est également un grand groupe dont le cœur de métier est la base de données dans toutes ses formes.

Annonces faites par Oracle

Dès l’annonce du rachat, Oracle a manifesté un fort intérêt pour Solaris contrairement aux intentions que certains ont pu lui prêter. L’annonce d’un investissement massif, supérieur à celui de Sun, dans Solaris a rapidement été évoqué. Le futur de Solaris n’a jamais été mis en doute. La réelle modification apportée par Oracle est la suppression de la gratuité de Solaris.  Ceci se comprend dans la mesure où Solaris est un système d’exploitation réellement orienté vers les infrastructures à très haute disponibilité. Qui dit haute disponibilité, dit coûts. C’est donc une évolution relativement logique pour viabiliser cet OS.

La gestion par Sun de Solaris faisait qu’il était possible pour une société de payer une souscription Solaris pour un seul serveur et ensuite de propager toutes les mises à jour sur tous leurs serveurs. Oracle a voulu, assez logiquement, supprimer cela en introduisant la notion de contrats équivalents sur tous les serveurs. De plus, Oracle a annoncé que toutes les fonctionnalités ne seraient pas incluses dans Solaris ce qui était déjà le cas à l’époque de Sun. Il s’agit cependant de fonctionnalités ultra-spécifiques. Le cheminement naturel est plutôt d’introduire les fonctionnalités OpenSolaris vers Solaris.

La situation d’OpenSolaris

Parlons désormais d’OpenSolaris. De la même manière que GNU n’est pas Linux, OpenSolaris n’est pas Solaris. OpenSolaris est à Solaris ce qu’est Fedora à Red Hat.

OpenSolaris est effectivement un logiciel libre bien que pas sous licence GNU/GPL.  Sur les mailing-list associées à ce projet, il a été fait une étude des éléments qui seraient à recréer si Oracle reniait OpenSolaris. Seul une centaine d’éléments non critiques seraient à revoir dont une bonne partie sont déjà en cours de réécriture.

Enfin une annonce !

L’erreur d’Oracle a surement été leur mutisme par rapport au futur d’OpenSolaris. Ceci est cependant terminé car Oracle sont sortis de leur silence et ont annoncé qu’il continueraient à soutenir ce projet. Je vous laisse consulter la présentation qui a été faite afin que vous puissiez vous faire votre propre idée.

Oracle is investing more in Solaris than Sun did prior to the acquisition, and will continue to contribute innovative technologies to OpenSolaris, as Oracle already does for many other open source projects

Oracle will continue to make OpenSolaris available as open source and Oracle will continue to actively support and participate in the OpenSolaris community

Toutes les annonces de la mort d’OpenSolaris sont fausses et basées sur le simple silence d’Oracle à ce sujet. De plus, ces fausses annonces ont été fortement relayées sur tous les sites d’informatique. Par contre, lorsqu’Oracle annonce le maintien du projet, l’annonce est pratiquement inaudible et invisible.

Architecture réseau d’une LAN Party : Premier bilan

Ce billet servira de premier bilan en ce qui concerne le réseau de l’Utt Arena 2010. Je m’excuse d’avance si ce billet n’est pas des plus clairs mais la fatigue se fait réellement sentir au troisième jour de LAN. Je vais effectuer un bilan technique des solutions que nous avons implémenté.

Phase 1

Tout d’abord, nous n’avions pas la possibilité d’avoir les équipements réseau type Cisco ASA et 2800 avant le Samedi midi car ils n’arrivaient pas avant ce moment là. Nous avons donc du faire avec une solution secondaire par le biais des 3750. Cela était parfaitement prévu depuis quelques semaines mais je n’avais pas souhaité en parler afin d’éviter l’effet placebo lors de la transition vers le réseau définitif.

La mise en place des deux 3750 s’est faite sans aucun soucis particulier. Le premier 3750 nommé Kilimandjaro disposait d’une interface IP dans tous les VLAN et effectuer le routage entre ces derniers. Le second 3750 nommé StHelens avait pour seule fonctionnalité la commutation des paquets associées à ses interfaces. Nous avions également prévu ce second 3750 afin d’avoir une solution de secours en cas de panne du premier 3750.

Transition

Lorsque les ASA sont arrivés, nous avons dû effectuer la transition du réseau initial vers le réseau prévu. Les joueurs n’ont pas été mis au courant de ce changement afin d’éviter un effet placebo qui correspondrait à voir des pannes partout sans réelle raison. Les organisateurs ont cependant été mis au courant ce qui a provoqué une avalanche de remontées de problèmes divers et, en grande partie, sans aucun rapport avec transition. La gestion des remontées de ces problèmes a été plutôt mauvaise car tous les organisateurs remontaient vers l’équipe réseau tous les problèmes, incluant ceux n’ayant aucun rapport de près ou de loin avec le réseau.

Nous avons racké les ASA dans la baie prévue à cet effet. J’évoquerais l’architecture physique ultérieurement. Nous avons ensuite injecté les configurations en port série et nous avons validé que nous avions bien un accès Telnet à ses équipements afin d’éviter de mauvaises surprises. Nous avons ensuite connecté tous les ports de Management et d’interconnexion des ASA afin qu’ils prennent connaissance de la topologie IP. Nous avons ensuite basculé les interfaces IP du 3750 vers les ASA une par une. Nous avons tout de même laissé une interface par VLAN sur les 3750 pour la fonctionnalité DHCP. Pour les routeurs, nous avons appliqué une méthodologie similaire.

Lors de la transition, nous avions donc une partie des VLAN routés par le 3750 et une partie des VLAN routés par les ASA/2800. Cette configuration temporaire a impliqué un routage asymétrique. Autant les routeurs sont peu sensibles aux asymétries de routage, les ASA ne le sont pas car ils effectuent un suivi de la session TCP. Nous avons réussir à contenir en bonne partie l’asymétrie du routage en jouant avec les identifiants de routeur OSPF ou du moins on pense que ce fut le cas. De toute manière, la transition a duré une petite heure.

Une fois la topologie reconstituée, nous avons coupé l’OSPF sur le 3750 afin qu’il soit exclu du processus de routage et nous avons laissé les ASA et les 2800 faire leur travail. Une coupure d’une trentaine de secondes est induite par la réélection OSPF et le recalcul des routes.

Phase 2

Une fois toute l’architecture en place, nous avons pu commencé à débugger nos configurations. Nous avons essentiellement eu des soucis de configuration de VLAN sur les switchs que nous avons mis un peu de temps à corriger. Les remontées de problèmes pertinentes ont mis un peu de temps à nous parvenir réellement car elles étaient noyées dans un volume assez important de demandes.

Nous n’avons pas rencontré de problème particulier lié à notre architecture réseau suite aux reconfigurations initiales. Les joueurs Warcraft III ont rencontré de nombreux problèmes de connexion aux parties alors qu’ils étaient tous dans le même VLAN voire sur le même switch. Nous n’avons pas réussi à déterminer l’origine de ce problème épisodique. La piste d’un applicatif malicieux est privilégiée car de multiples changements de switch et un passage en IP fixe n’ont apporté aucune solution à ce problème. La latence est tout à fait correcte selon nos mesures bien que nous rencontrons quelques problèmes du coté des serveurs CSS qui se montrent quelque peu capricieux. Nous avons mis le LLQ pour le principe mais la différence de latence ne parait pas significative.

Au final, la préparation nous a permis d’effectuer une transition propre et plutôt efficace. La vraie difficulté a été la qualification et la pertinence des problèmes remontés aux administrateurs réseaux. Je referais un point une fois l’évènement passé.

Architecture réseau d’une LAN Party : La latence

Ce billet sera le dernier billet évoquant la préparation de l’Utt Arena. En tant que dernier sujet, j’ai choisi de parler de la mesure de la latence sur une LAN. Avant de commencer, faisons un petit point d’avancement comme à chaque fois.

L’Utt Arena c’est demain. Ca fait toujours un choc de se rendre compte de ca je trouve. Nous avons fait une dernière séance de préparation hier soir afin de régler les derniers aspects de réseau. Nous avons vérifié le fonctionnement des accès Telnet aux équipements afin de pouvoir les administrer le jour J, nous avons validé les configurations des routeurs 2800 et des 3750. Nous avons également testé le fonctionnement de notre sonde de mesure de la latence dont je parlerais plus en détail aujourd’hui. Nous sommes prêts. Nous avons réussi à faire et à tester tout ce que nous souhaitions effectuer avant l’événement. Pour le reste, on donnera le meilleur de nous-même.

Je vais faire le maximum pour essayer de faire au moins un retour d’expérience pendant l’évènement pour ceux que ca pourrait intéresser. Je ne garantis pas que ce sera extraordinaire car la fatigue et la déconcentration devront être de la partie. De toute manière, je ferais un retour d’expérience une fois l’évènement passé et après avoir débriefé avec mon équipe.

La latence est l’intervalle de temps entre l’émission d’un requête et la réception de la réponse. La notion de latence peut s’appliquer à toutes les applications impliquant un ou plusieurs intermédiaires. Il s’agit d’une notion clé lors d’une LAN Party. Les joueurs passent un temps non négligeable les yeux rivés sur l’indicateur de latence.

Les facteurs influant sur la latence sont la congestion réseau, surtout dans le cas d’applications UDP, les temps de calcul des équipements intermédiaires et la qualité du support physique. La congestion réseau est un vrai problème en LAN car des fichiers ont tendance à circuler entre les différents ordinateurs. Nous avons solutionné largement ce problème en appliquant des ACL de filtrage lorsque les tournois ont lieu. La qualité du support phyisque est un problème réduit dans le cas des réseaux câblés mais peut néanmoins intervenir lorsque les câbles sont maltraités.

Le temps de calcul des équipements intermédiaires est une réelle problématique sur laquelle il est relativement difficile d’agir. Dans le cas de commutateur, le temps d’exécution de l’algorithme de commutation est minime mais peut augmenter avec la montée du CPU du commutateur. Dans le cas d’un routeur, les algorithmes sont plus longs. Pour éviter cela, nous avons implémenté un mécanisme de QoS (LLQ).

Habituellement, nous sommes dans le flou concernant les temps de latence. La seule indication que nous avons habituellement est l’affichage du « ping » sur Counter-Strike ce qui fournit une mesure peu représentative de l’état du réseau. Nous avons donc décidé d’implémenter l’outil SmokePing. Cet outil a été conçu afin de mesurer la latence entre un serveur et différents points du réseau. L’installation de cette application est particulièrement simpliste, de même pour la configuration.

La plus-value de Smokeping est l’étude statistique qu’il effectue sur les valeurs de la latence. Les solutions traditionnelles de supervision se contentent d’afficher une unique valeur de latence. Smokeping vous affiche la distribution statistique de vos valeurs afin d’avoir une idée plus claire de la latence mais aussi de la gigue sur votre réseau. Vous trouverez ci-dessous un exemple de graph que j’ai pu trouver sur Internet. Les barres bleues correspondent aux valeurs de perte de paquets. Les valeurs vertes correspondent à la médiane de latence et les valeurs noires la distribution statistique.

Nous allons mesurer la latence entre un serveur placé dans le LAN des Serveurs et une interface IP du 3750 dans le LAN des joueurs. Ce mode de mesure ne prend pas en compte la latence induite par la congestion des uplinks des tables. Hélas, nous n’avions pas la possibilité de faire autrement sans placer des machines sur les tables. Afin d’observer la congestion réseau sur les liens, nous aurons une weathermap Cacti. Nous mesurerons donc le temps de traversée des routeurs et des ASA, ce qui est déjà un bon début.

Au final, la latence est un aspect réellement primordial d’une LAN. Nous avons décidé de mettre en place un système de mesure efficace afin d’avoir de véritables valeurs et de pouvoir différencier les vrais problèmes de l’effet placebo ou d’une imagination débordante. Smokeping est vraiment un outil excellent d’une simplicité exceptionnelle.