Archives pour l'étiquette OCFS2

Comment voici.fr, gala.fr, geo.fr, femmeactuelle.fr en eZPublish utilisent le StaleCache et une architecture NAS

Second couche

Pierre Jean Duvivier, responsable du département WebFactory de EditPress n’en fini pas de revenir sur sa terrible expérience avec Ez Publish 3.x et les raisons de son abandon par EdiPress. Revenir car déjà le propos à déjà été exposé par ses soins dans un article nommé EzPublish : l’enfer du devoir article que j’ai un peu commenté en exposant ma propre vision des problématiques soulevé par le choix d’eZ.

Je trouvais déjà la première condamnation de eZ sans nuance alors que le respect de quelques préceptes de dev permet de faire des choses bien plus que honorable avec eZ. Mais bon chacun son vécu et pour avoir transpiré à trouver des solutions d’architectures capable de soutenir l’audience je compatissais. Par contre la nouvelle et seconde couche passé par Pierre Jean Duvivier me semble un peu injuste car depuis 18 mois l’eau à couler sous les ponts. Un peu car la conception d’architecture pour eZ reste quelque chose de peu documenté et qui repose sur des connaissance quasi chamanquie.

eZ publish assure que le partage de donnée entre serveur dans une configuration multi-frontaux est prévus. Or dans la pratique on trouve vite des limites à cela. Je me permet de me cité moi même ^_^.

Dans le cas d’un site eZ avec du contenu dynamique la limite technique est de 30000 VU / 24h avec le partage d’information via NFS. Au delà de cette limite différent « bug » apparaisse qui vienne défigurer le contenue du site (bug wilcard, Bug NULLNULL, Perte cache block)

Dans le cas d’un site eZ avec du contenu dynamique la limite technique est de 35000 VU / 24h avec le partage d’information via le mode cluster dans une base de donnée Innodb/Mysql. Au delà de cette limite les demandes d’accès exclusif au information trop nombreux au point de bloqué le fonctionnement de l’application.

Pour dépasser les 35000 VU / 24h la seul solution que nous avons trouvé est de localisé l’intégralité de l’application sur un unique serveur en mode filer. Le matériel ayant évolué, avec un serveur Bi-Cpu quadri-core de 3Ghz avec 8Go de RAM il est parfaitement possible de produire 95000 VU / 24h c.a.d 300K pages vues par 24h. Nous avons testé cette solution sur voici.fr et gala.fr en version eZ 3.10 avec à chaque fois une réussite total, une bonne stabilité et le dépassement des seuil de production précédent. Reste que dépendre d’un unique serveur n’est pas une chose très sécurisante quand à la scalabilité…..

J’ai testé personnellement en suite différente architecture pour arrivé sur cette base à une solution multifrontal. Le NFS pur depuis un serveur lambda étant à oublier j’ai testé les profiles d’architecture suivante en multi-frontal avec l’aide de mon hébergeur hors norme pour son aide en R&D

  • Un serveur lambda partageant en mode bloc un volume via iSCSI. Deux frontaux utilisant ce volument via le système de fichier OCFS2 qui gère les concurrences
  • Un SAN Dell EqualLogic en mode bloc un volume via iSCSI. Deux frontaux utilisant ce volument via le système de fichier OCFS2 qui gère les concurrences
  • Un SAN Dell EqualLogic en mode bloc un volume via iSCSI. Deux frontaux utilisant ce volument via le système de fichier GFS2 qui gère les concurrences

Nous n’avons pas retrouver le rapport stabilité / capacité de production que nous avions connue avec le principe du frontal unique. Nous avons constaté que eZ ouvre et verrouille énormément de fichier par instance rendant le partage d’information entre frontaux problématique. Nous avons même constaté des lock récursif ce qui nous à tous laisser dubitatif. La conclusion était terrible, plus nous ajoutions de frontaux plus les instances entrait en concurrence pour accéder à l’information.

Quand le sujet était évoqué auprès des gens de chez eZ la réponse était par forcement audible. Par contre il était amusant de faire toussé Paul Bogermans de eZ publish en lui posant la question.

Mais depuis les choses on évolué

Suite à un forte pression des utilisateurs des moyen on été investi par eZ Publish pour que soutenir plus facilement une forte audience. Ceci à eu pour résultat le patch StaleCache dont j’ai parlé en signalant qu’il signifiait peut être la fin des combats.

Précédemment la génération d’un fichier cache se faisait à invalidation du précédent fichier, à la demande, et par chaque process qui le requiert; entrainant de nombreuses concurrences d’accès (lock des fichiers dans var/…/ezmutex) et une grande surcharge sur le filesystem. Le nouveau système (StaleCache) se débarrasse intégralement de la gestion de la concurrence par locks. Le mécanisme consiste maintenant à fournir aux frontaux web l’ancienne version du fichier de cache jusqu’à ce que la nouvelle soient re-générée. Ce qui diminue grandement l’empilement des process sur le filesystem en garantissant la génération du fichier par un process unique.

J’ai testé le StaleCache mais malheureusement pas dans une config multi-frontal. Rien à redire, ceci me semble être un direction bien plus pérenne que précédemment. Si quelqu’un pouvait tester ce patch avec une architecture serveur lambda partageant en mode bloc un volume via iSCSI. Deux frontaux utilisant ce volument via le système de fichier OCFS2 qui gère les concurrences, avec une audience forte je serais heureux d’en connaître l’issue. Le StaleCache est arrivé trop tardivement pour nous pour que nous l’appliquions sur ce type d’ architecture , nous avons pris une autre direction.

NAS

Nous avons fait le choix d’utilisé un NAS avec le protocole NFS. Ben et les bug lier à NFS vous allez me dire. Et bien avec la puissance d’un NAS et certainement avec l’implémentation propriétaire du protocole NFS du fabriquant nous n’avons pas ces bugs, par contre l’addition est douloureuse et ceci n’a peu être justifié que par un l’utilisation de cette ressource par plusieurs sites et une audience global des plus forte avec 6,7 Millions de visiteurs unique et 18,7 millions de pages vue par mois (OJD Janvier 2009). Avec une moyenne d’utilisation de seulement 140 opération seconde sur ce NAS nous avons encore de belle perspective devant nous.

Et le  »StaleCache’ ? et bien nous l’utilisons sur nos sites peoples avec succès.

Xen : Relocation de VM avec un partage ATA Over Ethernet et un système de fichier cluster OCFS2

Partage Type SAN avec ATA Over Ethernet

AoE Serveur

Configuration du serveur de fichier faisant office de SAN.
Vérification si le kernel à bien été configuré avec option AoE, vérifier sa présence dans le ficher .config

host:<span style="color: #000000; font-weight: bold;">/</span><span style="color: #808080; font-style: italic;"># grep ATA_OVER /boot/config-`uname -r`</span> <span style="color: #007800;">CONFIG_ATA_OVER_ETH=</span>m

Pour l’activé à la compilation

Device Drivers --<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">|</span>- Block Devices ---<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">|</span>- <span style="color: #000000; font-weight: bold;">&lt;</span>m<span style="color: #000000; font-weight: bold;">&gt;</span> ATA over Ethernet support

Si l’option est présente chargé le module

modprobe aoe

Vérifier dans les logs

<span style="color: #c20cb9; font-weight: bold;">grep</span> aoe <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>syslog Jul <span style="color: #000000;">7</span> <span style="color: #000000;">16</span>:<span style="color: #000000;">31</span>:<span style="color: #000000;">12</span> Nada kernel: aoe: aoe_init: AoE v22 initialised. Jul <span style="color: #000000;">7</span> <span style="color: #000000;">16</span>:<span style="color: #000000;">59</span>:<span style="color: #000000;">57</span> Nada kernel: aoe: aoe_init: AoE v22 initialised.

Installation des outils serveur

apt-get <span style="color: #c20cb9; font-weight: bold;">install</span> vblade

Pour exporter /dev/sdb1

vbladed <span style="color: #000000;">0</span> <span style="color: #000000;">1</span> eth1 <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb1

Chaque périphérique AoE device est identifier par une couple numérique Majeur / Mineur. Le majeur est dans la plage 0-65535 et le mineur dans la plage 0-255. Dans l’exemple du dessus nous avons

* Majeur O * Mineur 1 * Via l'interface eth1 * Le partition physique /dev/sdb1

Vérification

<span style="color: #c20cb9; font-weight: bold;">ps</span> -ax <span style="color: #7a0874; font-weight: bold;">&#91;</span>...<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000;">1316</span> tty1 S <span style="color: #000000;">0</span>:<span style="color: #000000;">00</span> <span style="color: #c20cb9; font-weight: bold;">sh</span> -c <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>vblade <span style="color: #000000;">0</span> <span style="color: #000000;">1</span> eth1 <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb1 <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> logger -t vbladed <span style="color: #000000;">1318</span> tty1 S <span style="color: #000000;">0</span>:<span style="color: #000000;">00</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>vblade <span style="color: #000000;">0</span> <span style="color: #000000;">1</span> eth1 <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb1 <span style="color: #000000;">1319</span> tty1 S <span style="color: #000000;">0</span>:<span style="color: #000000;">00</span> logger -t vbladed <span style="color: #7a0874; font-weight: bold;">&#91;</span>...<span style="color: #7a0874; font-weight: bold;">&#93;</span>

Pour qu’il soit lancer au démarrage du serveur, a défaut de faire une script dans /etc/init.d/ on le colle dans /etc/inittab

<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;e0:1:respawn:/usr/sbin/vblade 0 1 eth1 /dev/sdb1&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>inittab init q

Installer OCFS2

Installer les outils sur les serveurs du node cluster, c.a.d les deux machines hôte xen dom0. Ils ne sont pas nécessaire sur le serveur offrant la ressource disque.

apt-get <span style="color: #c20cb9; font-weight: bold;">install</span> ocfs2-tools

Sur chaque serveur du mode cluster configuré OCFS2 via le fichier /etc/ocfs2/cluster.conf. Dans exemple l’exemple suivant nous avons deux nœuds (Bella et Brutus ) et l’espace disque est nommé oscf2.

node: ip_port = <span style="color: #000000;">7777</span> ip_address = <span style="color: #000000;">192.168</span><span style="color: #000000;">.0</span><span style="color: #000000;">.10</span> number = <span style="color: #000000;">0</span> name = Bella cluster = ocfs2 &nbsp; node: ip_port = <span style="color: #000000;">7777</span> ip_address = <span style="color: #000000;">192.168</span><span style="color: #000000;">.0</span><span style="color: #000000;">.11</span> number = <span style="color: #000000;">1</span> name = Brutus cluster = ocfs2 &nbsp; cluster: node_count = <span style="color: #000000;">2</span> name = ocfs2

Recopie de /etc/ocfs2/cluster.conf vers les autres noeuds et configurer le démarrage de ocfs2 dans le fichier /etc/default/o2cb

vi <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>o2cb <span style="color: #808080; font-style: italic;"># O2CB_ENABLED: 'true' means to load the driver on boot.</span> <span style="color: #007800;">O2CB_ENABLED=</span>true

Lancer de démon ocfs2

<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>o2cb start

Vérifier le fonctionnement du démon

<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>o2cb status &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">!!!!</span>Configuration  de AoE Client &nbsp; Configuration des deux __machines hôtes xen Dom0__ client <span style="color: #c20cb9; font-weight: bold;">du</span> serveur de fichier faisant office de __SAN__. &nbsp; Installation des outils client <span style="color: #000000; font-weight: bold;">///</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>bash<span style="color: #7a0874; font-weight: bold;">&#93;</span> apt-get <span style="color: #c20cb9; font-weight: bold;">install</span> aoetools

Si vous n’utiliser par udev il est possible que les node dans /dev ne soit pas créé automatiquement. Pour forcer cela la commande suivante exite

aoe-mkdevs <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>etherd

Maintenant écoutons le réseau pour découvrir les volumes disponible

client:<span style="color: #000000; font-weight: bold;">/</span><span style="color: #808080; font-style: italic;"># aoe-discover</span>

Affichons ce qui a été découvert

client:<span style="color: #000000; font-weight: bold;">/</span><span style="color: #808080; font-style: italic;"># aoe-stat</span> e0<span style="color: #000000;">.1</span> <span style="color: #000000;">1</span>.048GB eth1 up

Il est maintenant possible d’utiliser ce périphérique

Utiliser le périphérique

Le formater la partition cluster en OCFS2

mkfs -t ocfs2 -L DATA <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>etherd<span style="color: #000000; font-weight: bold;">/</span>e0<span style="color: #000000;">.1</span>

Le monter et l’utiliser

<span style="color: #c20cb9; font-weight: bold;">mount</span> -t ocfs2 <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>etherd<span style="color: #000000; font-weight: bold;">/</span>e0<span style="color: #000000;">.1</span> <span style="color: #000000; font-weight: bold;">/</span>home

Attention, le serveur de fichier faisant office de SAN, donc serveur AoE, ne peux pas être client de lui même.

machines virtuel xen

Il ne vous reste plus qu’a installer et lancer depuis une des machines hôtes des machines virtuel xen sur des disque virtuel dans un fichier image. Disque virtuel eux même stocker sur la partition présenté en AoE et partager en cluster OCFS2.

Xen relocation

Pour faire de la réallocation de machine virtuel du machine hôte (dom0) à une autre il faut monté la même ressource AoE sur chacune des machines hôte sur le même point de montage. Dans mon exemple machine hôte à la partition AoE/OCFS2 monté dans /home. Cette partition n’a été formaté qu’une fois depuis l’une des deux machines hôtes.

xend-config.sxp

Pour activé la possibilité de réallocation entre machine hôte xen voici les différente option activé dans les /etc/xen/xend-config.sxp des deux serveur.

Sur Bella, j’active la réallocation et j’autorise Brutus à envoyé des VM

<span style="color: #7a0874; font-weight: bold;">&#40;</span>xend-relocation-server <span style="color: #c20cb9; font-weight: bold;">yes</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>xend-relocation-port <span style="color: #000000;">8002</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>xend-relocation-address <span style="color: #ff0000;">'192.168.0.10'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>xend-relocation-hosts-allow <span style="color: #ff0000;">''</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>network-script <span style="color: #ff0000;">'bella-network-bridge'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>vif-script vif-bridge<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>dom0-min-mem <span style="color: #000000;">196</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>dom0-cpus <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>vncpasswd <span style="color: #ff0000;">''</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>

Sur Brutus, j’active la réallocation et j’autorise Bella à envoyé des VM

<span style="color: #7a0874; font-weight: bold;">&#40;</span>xend-relocation-server <span style="color: #c20cb9; font-weight: bold;">yes</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>xend-relocation-port <span style="color: #000000;">8002</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>xend-relocation-address <span style="color: #ff0000;">'192.168.0.11'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>xend-relocation-hosts-allow <span style="color: #ff0000;">''</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>network-script <span style="color: #ff0000;">'brutus-network-bridge'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>vif-script vif-bridge<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>dom0-min-mem <span style="color: #000000;">196</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>dom0-cpus <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>vncpasswd <span style="color: #ff0000;">''</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> xm migrate

Depuis la machine hôte (dom0) hébergeant vos machines virtuel xen pour déplacer une VM à chaud il suffit d’utiliser la commande suivante

Depuis Bella

xm migrate --live VM-<span style="color: #7a0874; font-weight: bold;">test</span> Brutus