{"id":311,"date":"2009-02-16T15:56:16","date_gmt":"2009-02-16T14:56:16","guid":{"rendered":"http:\/\/blog.guiguiabloc.fr\/?p=311"},"modified":"2009-05-10T15:17:09","modified_gmt":"2009-05-10T14:17:09","slug":"mise-en-oeuvre-dun-systeme-de-fichier-distribue-et-acces-concurrents-en-san-avec-drbd-iscsi-ocfs2-et-dm-multipath","status":"publish","type":"post","link":"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/02\/16\/mise-en-oeuvre-dun-systeme-de-fichier-distribue-et-acces-concurrents-en-san-avec-drbd-iscsi-ocfs2-et-dm-multipath\/","title":{"rendered":"Mise en oeuvre d&rsquo;un syst\u00e8me de fichier distribu\u00e9 et acc\u00e8s concurrents en SAN avec DRBD, ISCSI ,OCFS2 et DM-Multipath"},"content":{"rendered":"<p>Difficile de faire plus court en titre&#8230;<\/p>\n<p>Je vous pr\u00e9viens tout de suite, ce billet risque d&rsquo;\u00eatre un peu long car apr\u00e8s tout, j&rsquo;ai pass\u00e9 du temps dessus, autant que vous en passiez, vous aussi, a me lire \ud83d\ude42<\/p>\n<p>Tous ceux qui ont d\u00e9j\u00e0 eu \u00e0 mettre en oeuvre une quelconque solution de Haute-Disponibilit\u00e9, se sont retrouv\u00e9s un jour devant une probl\u00e9matique assez angoissante :<\/p>\n<p>L&rsquo;acc\u00e8s simultan\u00e9 (ou concurrent) \u00e0 une ressource de donn\u00e9es.<\/p>\n<p>Si en lecture cela pose rarement des probl\u00e8mes, en \u00e9criture, cela comment \u00e0 devenir \u00ab\u00a0l\u00e9g\u00e8rement\u00a0\u00bb complexe.<\/p>\n<p>Petit exemple.<\/p>\n<p>Vous avez deux serveurs load-balanc\u00e9s (web ou autre), si vous \u00e9crivez une information sur le premier serveur, comment \u00eatre sur qu&rsquo;elle soit disponible sur le deuxi\u00e8me, et vice-versa.<\/p>\n<p>Apr\u00e8s tout, je peux aussi bien \u00e9crire sur le serveur A que sur le serveur B.<\/p>\n<p>Retour en arri\u00e8re donc pour vous expliquer la progression de mon raisonnement et la solution que j&rsquo;ai mise en oeuvre.<\/p>\n<p>Lorsque l&rsquo;on d\u00e9sire avoir une synchronisation parfaite des donn\u00e9es entre deux serveurs, la premi\u00e8re m\u00e9thode est d&rsquo;utiliser un mode Actif\/Passif (ou ma\u00eetre\/esclave).<br \/>\nLe moyen le plus simple est de se baser sur <a title=\"DRBD\" href=\"http:\/\/www.drbd.org\/\" target=\"_blank\">DRBD<\/a> dont j&rsquo;avais d\u00e9j\u00e0 abord\u00e9 le sujet <a title=\"DRBD\" href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2008\/10\/17\/cluster-haute-disponibilite-chez-ovh-avec-ipfailover-heartbeat-et-drbd-via-ipsec\/\" target=\"_blank\">ICI<\/a> qui est une sorte de RAID Over IP.<\/p>\n<p>La mise en place de drbd vous donne un nouveau p\u00e9riph\u00e9rique de stockage (ou nouveau disque pour simplifier) de type \/dev\/drbdX.<\/p>\n<div id=\"attachment_327\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/02\/drbd1.png\"><img aria-describedby=\"caption-attachment-327\" loading=\"lazy\" class=\"size-medium wp-image-327\" title=\"drbd1\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/02\/drbd1-300x279.png\" alt=\"\" width=\"300\" height=\"279\" \/><\/a><p id=\"caption-attachment-327\" class=\"wp-caption-text\">Exemple DRBD<\/p><\/div>\n<p>En cas de panne du Ma\u00eetre, le service est bascul\u00e9 sur l&rsquo;Esclave et les donn\u00e9es accessibles par celui ci.<\/p>\n<div id=\"attachment_328\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/02\/drbd2.png\"><img aria-describedby=\"caption-attachment-328\" loading=\"lazy\" class=\"size-medium wp-image-328\" title=\"drbd2\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/02\/drbd2-300x221.png\" alt=\"Bascule DRBD\" width=\"300\" height=\"221\" \/><\/a><p id=\"caption-attachment-328\" class=\"wp-caption-text\">Bascule DRBD<\/p><\/div>\n<p>Le volume DRBD, appel\u00e9 par exemple \/dev\/drbd0 est alors \u00ab\u00a0mont\u00e9\u00a0\u00bb en syst\u00e8me de fichier sur la machine passive qui devient alors, active.<\/p>\n<p>Je parle bien entendu de synchronisation en mode \u00ab\u00a0bloc\u00a0\u00bb, pas d&rsquo;une synchronisation de fichiers comme le fait rsync ou autre.<\/p>\n<p>Dans cet exemple, le syst\u00e8me de fichier reste standard (ext2, ext3, reiser etc&#8230;).<\/p>\n<p>Si maintenant vous avez d\u00e9cid\u00e9 de mettre en oeuvre un loadbalancing suite \u00e0 la lecture de cet <a title=\"Billet Alteon\" href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/01\/14\/switch-applicatif-avec-openbsd-un-alteon-a-la-maison\/\" target=\"_blank\">excellent billet<\/a> \ud83d\ude09 , les choses se compliquent.<\/p>\n<p>En effet, nous nous trouvons dans un cas de figure  o\u00f9 les deux serveurs sont Ma\u00eetres, donc Actif.<\/p>\n<p>Heureusement, depuis la version 0.8 de DRBD, les deux noeuds peuvent \u00eatre \u00ab\u00a0Primary\u00a0\u00bb.<\/p>\n<p>(nb. : la version 0.9 devrait apporter le support de plus de 2 noeuds)<\/p>\n<p>Par contre, pour pouvoir utiliser ses deux noeuds en mode Primaire, il faut un syst\u00e8me de fichier \u00ab\u00a0distribu\u00e9\u00a0\u00bb (vous trouverez souvent le terme \u00ab\u00a0shared disk file system\u00a0\u00bb).<\/p>\n<p>Il en existe peu et les principaux sont <a title=\"GFS\" href=\"http:\/\/www.redhat.com\/gfs\/\" target=\"_blank\">GFS<\/a> et<a title=\"ocfs2\" href=\"http:\/\/oss.oracle.com\/projects\/ocfs2\/\" target=\"_blank\"> OCFS2<\/a>.<\/p>\n<p>Le premier est issu de RedHat et le second d&rsquo;Oracle. Sachez que le support de ses deux syst\u00e8mes de fichiers est inclus dans les noyaux Linux r\u00e9cents.<\/p>\n<p>J&rsquo;ai test\u00e9 les deux quelques temps et suite \u00e0 mon retour personnel d&rsquo;exp\u00e9rience et les discussions avec d&rsquo;autres \u00ab\u00a0geeks\u00a0\u00bb ayant jou\u00e9 avec les deux, j&rsquo;ai une nette pr\u00e9f\u00e9rence pour OCFS2. La suite de ce billet se basera donc sur ce syst\u00e8me de fichier.<\/p>\n<p>(je vous laisse bien s\u00fbr \u00e0 vos propres exp\u00e9riences et recherches, si vous pr\u00e9f\u00e9rez GFS ou <a title=\"Lustre\" href=\"http:\/\/www.sun.com\/software\/products\/lustre\/\" target=\"_blank\">Lustre<\/a>, je ne vous jetterai pas de pierres \ud83d\ude00 )<\/p>\n<p>Une fois mise en place, nous nous retrouvons donc avec ce type d&rsquo;architecture :<\/p>\n<div id=\"attachment_332\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/02\/ocfs2.png\"><img aria-describedby=\"caption-attachment-332\" loading=\"lazy\" class=\"size-medium wp-image-332\" title=\"ocfs2\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/02\/ocfs2-300x279.png\" alt=\"OCFS2\" width=\"300\" height=\"279\" \/><\/a><p id=\"caption-attachment-332\" class=\"wp-caption-text\">OCFS2<\/p><\/div>\n<p>La, on commence \u00e0 \u00eatre \u00ab\u00a0poilu\u00a0\u00bb non ?<\/p>\n<p>Oui, MAIS, cette architecture est valable uniquement si on utilise les ressources locales des 2 serveurs (i.e. leurs disques durs).<\/p>\n<p>Si je ne veux pas utiliser les disques durs de mes serveurs mais les disques d&rsquo;un autre groupe de serveurs d\u00e9di\u00e9s a cela ? Comment je fais ? HEIN ! Comment ???<\/p>\n<p>Du calme, jeune Padawan, tu sais bien que Guiguiabloc est&#8230; \u00e0 bloc&#8230;<\/p>\n<p>Nous allons utiliser un SAN pour connecter nos disques distants \u00e0 nos serveurs.<\/p>\n<p>Un SAN !?! Mais j&rsquo;ai pas de sous moi !!!<\/p>\n<p>Allons, jeune Youngling, tu n&rsquo;auras nul besoin de casser ton petit cochon qui te sert de tirelire, nous allons utiliser le protocole <a title=\"iscsi\" href=\"http:\/\/fr.wikipedia.org\/wiki\/ISCSI\" target=\"_blank\">Iscsi<\/a>.<\/p>\n<p>L&rsquo;ISCSI est du SCSI sur TCP\/IP, nous allons connecter via ce protocole nos disques distants sur nos serveurs qui les verront comme s&rsquo;il s&rsquo;agissait de disques locaux.<\/p>\n<p>(j&rsquo;avais d\u00e9j\u00e0 abord\u00e9 le sujet dans <a title=\"SAN guiguiabloc\" href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2008\/03\/05\/montage-d%e2%80%99un-sannas-3\/\" target=\"_blank\">ce billet<\/a>)<\/p>\n<p>De plus en plus \u00ab\u00a0poilu\u00a0\u00bb&#8230; Mais pas encore assez. Poussons le bouchon un peu plus loin (<a title=\"Maurice\" href=\"http:\/\/www.youtube.com\/watch?v=WtvUJURQDlU\" target=\"_blank\">hein Maurice ?<\/a>) , je veux bien s\u00fbr de la redondance sur mes connexions Iscsi.<\/p>\n<p>Et comment je fais de la haute disponibilit\u00e9 sur des iniatiators Iscsi ???<\/p>\n<p>En utilisant un <a title=\"multipath\" href=\"http:\/\/www.redhat.com\/docs\/manuals\/csgfs\/browse\/4.6\/DM_Multipath\/index.html\" target=\"_blank\">Device Mapper Multipath<\/a>.<\/p>\n<p>Bien s\u00fbr l\u00e0 vous vous dites : Guiguiabloc est fou\/malade\/a bloc\/allum\u00e9 (rayez les mentions inutiles) , et je vous r\u00e9pondrais&#8230; oui.<\/p>\n<p>Sch\u00e9matisons le bouzin :<\/p>\n<div id=\"attachment_338\" style=\"width: 295px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/02\/schemafs-ha.png\"><img aria-describedby=\"caption-attachment-338\" loading=\"lazy\" class=\"size-medium wp-image-338\" title=\"schemafs-ha\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/02\/schemafs-ha-285x300.png\" alt=\"Sch\u00e9ma FS distribu\u00e9\" width=\"285\" height=\"300\" \/><\/a><p id=\"caption-attachment-338\" class=\"wp-caption-text\">Sch\u00e9ma FS distribu\u00e9<\/p><\/div>\n<p>C&rsquo;est beau hein ? \ud83d\ude42<\/p>\n<p>Apr\u00e8s la th\u00e9orie, passons \u00e0 la phase la plus dure, la pratique.<\/p>\n<ul>\n<li><strong>DRBD<\/strong><\/li>\n<\/ul>\n<p>R\u00e9cuperer les souces :<\/p>\n<p><a title=\"src drbd\" href=\"http:\/\/oss.linbit.com\/drbd\/8.3\/drbd-8.3.0.tar.gz\" target=\"_blank\">http:\/\/oss.linbit.com\/drbd\/8.3\/drbd-8.3.0.tar.gz<\/a><\/p>\n<pre lang=\"text\">tar xzvf drbd-8.3.0.tar.gz\r\ncd drbd-8.3.0\r\ncd drbd\r\nmake\r\ncd ..\r\nmake tools\r\nmake install\r\nmake install-tools<\/pre>\n<p>Edition du fichier \/etc\/drbd.conf (bien sur, remplacer les valeurs par les votres)<\/p>\n<pre lang=\"text\">#\/etc\/drbd.conf\r\n\r\nglobal {\r\nusage-count yes;\r\n}\r\n\r\nresource r0 {\r\nprotocol C;\r\nstartup {\r\nbecome-primary-on both;\r\n}\r\ndisk {\r\non-io-error   detach;\r\n}\r\n\r\nnet {\r\nallow-two-primaries;\r\nafter-sb-0pri discard-least-changes;\r\nafter-sb-1pri violently-as0p;\r\nafter-sb-2pri violently-as0p;\r\nrr-conflict violently;\r\n}\r\nsyncer {\r\nrate 44M;\r\n}\r\n\r\non DISK-GUIGUIABLOC-A { # nom du serveur 1\r\ndevice     \/dev\/drbd0;\r\ndisk       \/dev\/sda4; # partition a prendre en compte\r\naddress    192.168.30.1:7788; # adresse ip et port d'\u00e9coute\r\nmeta-disk  internal;\r\n}\r\non DISK-GUIGUIABLOC-B { # nom du serveur 2\r\ndevice    \/dev\/drbd0;\r\ndisk      \/dev\/sda3; # partition a prendre en compte\r\naddress   192.168.30.2:7788; # adresse ip et port d'\u00e9coute\r\nmeta-disk internal;\r\n}\r\n}<\/pre>\n<p>Sur chacun des noeuds :<\/p>\n<pre lang=\"text\">drbdadm create-md r0\r\nmodprobe drbd\r\ndrbdadm attach r0\r\ndrbdadm connect r0\r\n\r\nPuis sur le noeud1 par exemple\r\ndrbdadm -- --overwrite-data-of-peer primary r0\r\n\r\n\/etc\/init.d\/drbd start<\/pre>\n<p>Vous suivez la synchro via un cat \/proc\/drbd<\/p>\n<p>Je ne m&rsquo;\u00e9tends pas la dessus, j&rsquo;en avais d\u00e9j\u00e0 parl\u00e9 dans un <a title=\"ovh-guigui\" href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2008\/10\/17\/cluster-haute-disponibilite-chez-ovh-avec-ipfailover-heartbeat-et-drbd-via-ipsec\/\" target=\"_blank\">autre billet<\/a>.<\/p>\n<ul>\n<li><strong>ISCSI Target Entreprise<\/strong><\/li>\n<\/ul>\n<p>Sur les deux \u00ab\u00a0serveurs disques\u00a0\u00bb, on va installer un Target ISCSI.<\/p>\n<p>(en terminologie ISCSI, on parle de Target pour la cible (soit la machine qui \u00ab\u00a0offre\u00a0\u00bb son disque) et d&rsquo;Initiator pour la machine qui va se connecter au Target).<\/p>\n<p>Je vous invite cet excellent article :<\/p>\n<p><a title=\"UnixGarden Iscsi\" href=\"http:\/\/www.unixgarden.com\/index.php\/administration-reseau\/le-support-du-protocole-iscsi-dans-linux\" target=\"_blank\">http:\/\/www.unixgarden.com\/index.php\/administration-reseau\/le-support-du-protocole-iscsi-dans-linux<\/a><\/p>\n<p>Nous allons utiliser les sources du projet<a title=\"iscsi target entreprise\" href=\"http:\/\/sourceforge.net\/projects\/iscsitarget\/\" target=\"_blank\"> iSCSI Entreprise Target<\/a> , ici en version 0.4.17.<\/p>\n<pre lang=\"text\">wget http:\/\/kent.dl.sourceforge.net\/sourceforge\/iscsitarget\/iscsitarget-0.4.17.tar.gz\r\ntar xzvf iscsitarget-0.4.17.tar.gz\r\ncd iscsitarget-0.4.17\r\nmake\r\nmake install<\/pre>\n<p>On pr\u00e9pare son \/etc\/ietd.conf (volontairement simplifi\u00e9 a l&rsquo;extr\u00e8me).<\/p>\n<p>Vous remarquerez que j&rsquo;exporte via ISCSI le volume DRBD0.<\/p>\n<pre lang=\"text\">Target iqn.2009-02.fr.guiguiabloc:disk-a.disk\r\n        Lun 0 Path=\/dev\/drbd0,Type=blockio\r\n        Alias disk<\/pre>\n<p>On configure le fichier d&rsquo;autorisation d&rsquo;acc\u00e8s (comme les hosts.allow des wrappers tcp)<\/p>\n<pre lang=\"text\">DISK-GUIGUIABLOC-a# cat \/etc\/initiators.allow\r\n\r\niqn.2009-02.fr.guiguiabloc:disk-a.disk ALL<\/pre>\n<p>M\u00eame chose sur le deuxi\u00e8me serveur (changer juste le nom du target).<\/p>\n<p>on d\u00e9marre \/etc\/init.d\/iscsi-target start, et on v\u00e9rifie<\/p>\n<pre lang=\"text\">DISK-GUIGUIABLOC-a:\/etc\/iscsi\/ifaces# \/etc\/init.d\/iscsi-target status\r\niSCSI enterprise target is running at pid 7715\r\nDISK-GUIGUIABLOC-a:\/etc\/iscsi\/ifaces# cat \/proc\/net\/iet\/volume\r\ntid:2 name:iqn.2009-02.fr.guiguiabloc:disk-a.disk\r\n        lun:0 state:0 iotype:blockio iomode:wt path:\/dev\/drbd0<\/pre>\n<ul>\n<li><strong>Open-ISCSI<\/strong><\/li>\n<\/ul>\n<p>Sur nos deux serveurs srv-guiguiabloc-a et srv-guiguiabloc-b, nous allons installer l&rsquo;Initiator (le client ISCSI si vous pr\u00e9f\u00e9rez).<\/p>\n<p>R\u00e9cup\u00e9rons des sources sur le site <a title=\"http:\/\/www.open-iscsi.org\/\" href=\"http:\/\/www.open-iscsi.org\/\" target=\"_blank\">http:\/\/www.open-iscsi.org\/<\/a><\/p>\n<pre lang=\"text\">wget http:\/\/www.open-iscsi.org\/bits\/open-iscsi-2.0-870.2.tar.gz\r\n\r\ntar xzvf open-iscsi-2.0-870.2.tar.gz\r\n\r\nmake\r\n\r\nmake install<\/pre>\n<p>On donne un nom explicite \u00e0 notre Initiator, puis on d\u00e9marre le service.<\/p>\n<pre lang=\"text\">srv-guiguiabloc-a:\/etc\/iscsi# cat initiatorname.iscsi\r\nInitiatorName=iqn.2009-02.fr.guiguiabloc:srvA\r\n\r\nsrv-guiguiabloc-a:\/etc\/iscsi# \/etc\/init.d\/open-iscsi start\r\nStarting iSCSI initiator service: iscsid.\r\nSetting up iSCSI targets:iscsiadm: No records found!<\/pre>\n<p>Lan\u00e7ons une d\u00e9couverte du service<\/p>\n<pre lang=\"text\">srv-guiguiabloc-a:\/etc\/iscsi# iscsiadm -m discovery -t sendtargets -p 192.168.30.1:3260\r\n192.168.30.1:3260,1 iqn.2009-02.fr.guiguiabloc:disk-a.disk\r\n\r\nsrv-guiguiabloc-a:\/etc\/iscsi# iscsiadm -m discovery -t sendtargets -p 192.168.30.2:3260\r\n192.168.30.2:3260,1 iqn.2009-02.fr.guiguiabloc:disk-b.disk<\/pre>\n<p>Un succ\u00e8s \ud83d\ude00<\/p>\n<p>(Bien s\u00fbr vous reproduisez tout cela sur srv-guiguiabloc-b)<\/p>\n<p>Maintenant, montons les sessions ISCSI sur nos deux Targets, sur nos deux serveurs<\/p>\n<pre lang=\"text\">srv-guiguiabloc-a:~# iscsiadm -m node -T iqn.2009-02.fr.guiguiabloc:disk-a.disk -p 192.168.30.1 -l\r\nLogin session [iface: default, target: iqn.2009-02.fr.guiguiabloc:disk-a.disk, portal: 192.168.30.1,3260]\r\nsrv-guiguiabloc-a:~# iscsiadm -m node -T iqn.2009-02.fr.guiguiabloc:disk-b.disk -p 192.168.30.2 -l\r\nLogin session [iface: default, target: iqn.2009-02.fr.guiguiabloc:disk-b.disk, portal: 192.168.30.2,3260]\r\n\r\nsrv-guiguiabloc-b:~# iscsiadm -m node -T iqn.2009-02.fr.guiguiabloc:disk-a.disk -p 192.168.30.1 -l\r\nLogin session [iface: default, target: iqn.2009-02.fr.guiguiabloc:disk-a.disk, portal: 192.168.30.1,3260]\r\nsrv-guiguiabloc-b:~# iscsiadm -m node -T iiqn.2009-02.fr.guiguiabloc:disk-b.disk -p 192.168.30.2 -l\r\nLogin session [iface: default, target: iiqn.2009-02.fr.guiguiabloc:disk-b.disk, portal: 192.168.30.2,3260]\r\n\r\nVous devriez voir vos disques en local d\u00e9sormais :\r\n\r\nsrv-guiguiabloc-a:~# cat \/proc\/scsi\/scsi\r\nAttached devices:\r\nHost: scsi1 Channel: 00 Id: 00 Lun: 00\r\n  Vendor: IET      Model: VIRTUAL-DISK     Rev: 0\r\n  Type:   Direct-Access                    ANSI SCSI revision: 04\r\nHost: scsi2 Channel: 00 Id: 00 Lun: 00\r\n  Vendor: IET      Model: VIRTUAL-DISK     Rev: 0\r\n  Type:   Direct-Access                    ANSI SCSI revision: 04<\/pre>\n<p>Pour l&rsquo;inclure en d\u00e9marrage automatique :<\/p>\n<p>iscsiadm -m node -T iqn.2009-02.fr.guiguiabloc:disk-a.disk -p 192.168.30.1 -o update -n \u00ab\u00a0node.conn[0].startup\u00a0\u00bb -v automatic<\/p>\n<p>(je vous laisse lire la documentation et\/ou l&rsquo;article sur Unix Garden.)<\/p>\n<ul>\n<li><strong>Device Mapper MULTIPATH I\/O<\/strong><\/li>\n<\/ul>\n<p>Nous allons utiliser une des couches du syst\u00e8me Linux, le Device Mapper.<\/p>\n<p>Son r\u00f4le est tout simplement de mapper un ou plusieurs p\u00e9riph\u00e9riques de blocs sur un autre p\u00e9riph\u00e9rique.<br \/>\nEn fait, vous l&rsquo;utilisez souvent sans peut-\u00eatre le savoir avec LVM.<\/p>\n<p>Vous trouverez un excellent billet la dessus sur : <a title=\"http:\/\/linux-attitude.fr\/post\/La-carte-du-peripherique\" href=\"http:\/\/linux-attitude.fr\/post\/La-carte-du-peripherique\" target=\"_blank\">http:\/\/linux-attitude.fr\/post\/La-carte-du-peripherique<\/a><\/p>\n<p>Et l&rsquo;une des fonctions offertes par DM et le ISCSI, c&rsquo;est le Multipath.<\/p>\n<p>C&rsquo;est \u00e0 dire acc\u00e9der \u00e0 un p\u00e9riph\u00e9rique par plusieurs chemins diff\u00e9rents \ud83d\ude42<\/p>\n<p>Vous voyez ou je veux en venir ?&#8230;.<\/p>\n<p>Si notre Target A tombe, pas de soucis, srv-guiguiabloc-x passera par l&rsquo;autre chemin, en l&rsquo;occurrence le Target B, tout cela gr\u00e2ce au Multipath (<a title=\"Leeloo Multipass\" href=\"http:\/\/www.youtube.com\/watch?v=eV_eGm1qgGs&amp;\" target=\"_blank\">pas celui LA hein<\/a> \ud83d\ude09 )<\/p>\n<p>(hi hi hi, d\u00e9sol\u00e9, il fallait que je la fasse)<\/p>\n<p>Sur Debian : apt-get install multipath-tools<\/p>\n<p>Editer votre fichier \/etc\/multipath.conf<\/p>\n<pre lang=\"text\">blacklist {\r\ndevnode \"sda\"   # ici le disque local que j'exclue\r\n}\r\ndefaults {\r\nuser_friendly_names yes\r\n}\r\n\r\nsrv-guiguiabloc-a:# \/etc\/init.d\/multipath-tools restart\r\n\r\nsrv-guiguiabloc-a:\/dev\/mapper# ll\r\ntotal 0\r\ncrw-rw---- 1 root root  10, 63 2009-02-14 19:57 control\r\nbrw-rw---- 1 root disk 254,  0 2009-02-16 15:16 mpath0\r\nbrw-rw---- 1 root disk 254,  1 2009-02-16 15:16 mpath1<\/pre>\n<p>Vous voyez vos p\u00e9riph\u00e9riques de blocs que vous pouvez utiliser comme n&rsquo;importe quel autre.<br \/>\nEn cas de d\u00e9connexion d&rsquo;un Target, Multipath retirera le p\u00e9riph\u00e9rique de la liste automatiquement.<\/p>\n<p>(bien s\u00fbr, m\u00eame punition pour srv-guiguiabloc-b).<\/p>\n<ul>\n<li><strong>OCFS2<\/strong><\/li>\n<\/ul>\n<p>On arrive \u00ab\u00a0enfin\u00a0\u00bb au syst\u00e8me de fichier proprement dit.<\/p>\n<p>Sur les 2 srv-guiguiabloc :<\/p>\n<p>apt-get install ocfs2-tools<\/p>\n<p>On cr\u00e9er le r\u00e9pertoire \/etc\/ocfs2<\/p>\n<p>On \u00e9dite un fichier cluster.conf (identique sur les deux noeuds)<\/p>\n<pre lang=\"text\">node:\r\n        ip_port = 7777\r\n        ip_address = 192.168.30.1\r\n        number = 0\r\n        name = srv-guiguiabloc-a\r\n        cluster = ocfs2\r\n\r\nnode:\r\n        ip_port = 7777\r\n        ip_address = 192.168.30.2\r\n        number = 1\r\n        name = srv-guiguiabloc-b\r\n        cluster = ocfs2\r\n\r\ncluster:\r\n        node_count = 2\r\n        name = ocfs2<\/pre>\n<p>Changer la valeur \u00ab\u00a0O2CB_ENABLED=false\u00a0\u00bb en \u00ab\u00a0O2CB_ENABLED=true\u00a0\u00bb dans \/etc\/default\/o2cb<\/p>\n<p>D\u00e9marrer le cluster :<\/p>\n<pre lang=\"text\">srv-guiguiabloc-a:\/etc\/ocfs2# \/etc\/init.d\/o2cb start\r\nLoading module \"configfs\": OK\r\nMounting configfs filesystem at \/sys\/kernel\/config: OK\r\nLoading module \"ocfs2_nodemanager\": OK\r\nLoading module \"ocfs2_dlm\": OK\r\nLoading module \"ocfs2_dlmfs\": OK\r\nCreating directory '\/dlm': OK\r\nMounting ocfs2_dlmfs filesystem at \/dlm: OK\r\nStarting Oracle cluster ocfs2: OK<\/pre>\n<p>Et on formate \ud83d\ude00<\/p>\n<pre lang=\"text\">srv-guiguiabloc-a:\/etc\/ocfs2# mkdir \/data\r\nsrv-guiguiabloc-a:\/etc\/ocfs2# mkfs -t  ocfs2 -L GUIGUIABLOCFS \/dev\/mapper\/mpath0\r\nmkfs.ocfs2 1.2.1\r\nFilesystem label=GUIGUIABLOCFS\r\nBlock size=4096 (bits=12)\r\nCluster size=4096 (bits=12)\r\nVolume size=1439338496 (351401 clusters) (351401 blocks)\r\n11 cluster groups (tail covers 28841 clusters, rest cover 32256 clusters)\r\nJournal size=67108864\r\nInitial number of node slots: 4\r\nCreating bitmaps: done\r\nInitializing superblock: done\r\nWriting system files: done\r\nWriting superblock: done\r\nFormatting Journals: done\r\nWriting lost+found: done\r\nmkfs.ocfs2 successful<\/pre>\n<p>Et c&rsquo;est tout !<\/p>\n<p>N&rsquo;essayer pas de formater \/dev\/mapper\/mpath1, ou \/dev\/mapper\/mpath0 sur srv-guiguiabloc-b, vous aurez ce message :<\/p>\n<pre lang=\"text\">srv-guiguiabloc-a:\/etc\/ocfs2#  mkfs -t  ocfs2 -L GUIGUIABLOCFS \/dev\/mapper\/mpath1\r\nmkfs.ocfs2 1.2.1\r\nOverwriting existing ocfs2 partition.\r\nProceed (y\/N): n\r\nAborting operation.\r\n\r\nsrv-guiguiabloc-b:\/etc\/ocfs2#  mkfs -t  ocfs2 -L GUIGUIABLOCFS \/dev\/mapper\/mpath0\r\nmkfs.ocfs2 1.2.1\r\nOverwriting existing ocfs2 partition.\r\nProceed (y\/N): n\r\nAborting operation.<\/pre>\n<p>Ce qui prouve bien que notre volume est bien vu de srv-guiguiabloc-b, par le chemin \/dev\/mapper\/mpath0 ou \/dev\/mapper\/mpath1 \ud83d\ude00<\/p>\n<p>C&rsquo;est pas magnifique tout cela ?<\/p>\n<p>Et maintenant, le test final :<\/p>\n<pre lang=\"text\">srv-guiguiabloc-a:\/etc\/ocfs2# mount \/dev\/mapper\/mpath1 \/data\r\nsrv-guiguiabloc-a:\/etc\/ocfs2# mount\r\n\/dev\/sda1 on \/ type ext3 (rw,errors=remount-ro)\r\ntmpfs on \/lib\/init\/rw type tmpfs (rw,nosuid,mode=0755)\r\nproc on \/proc type proc (rw,noexec,nosuid,nodev)\r\nsysfs on \/sys type sysfs (rw,noexec,nosuid,nodev)\r\nudev on \/dev type tmpfs (rw,mode=0755)\r\ntmpfs on \/dev\/shm type tmpfs (rw,nosuid,nodev)\r\ndevpts on \/dev\/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)\r\nconfigfs on \/sys\/kernel\/config type configfs (rw)\r\nocfs2_dlmfs on \/dlm type ocfs2_dlmfs (rw)\r\n\/dev\/mapper\/mpath1 on \/data type ocfs2 (rw,_netdev,heartbeat=local)\r\n\r\nsrv-guiguiabloc-b:\/etc\/ocfs2# mount \/dev\/mapper\/mpath0 \/data\r\nsrv-guiguiabloc-b:\/etc\/ocfs2# mount\r\n\/dev\/sda1 on \/ type ext3 (rw,errors=remount-ro)\r\ntmpfs on \/lib\/init\/rw type tmpfs (rw,nosuid,mode=0755)\r\nproc on \/proc type proc (rw,noexec,nosuid,nodev)\r\nsysfs on \/sys type sysfs (rw,noexec,nosuid,nodev)\r\nudev on \/dev type tmpfs (rw,mode=0755)\r\ntmpfs on \/dev\/shm type tmpfs (rw,nosuid,nodev)\r\ndevpts on \/dev\/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)\r\nconfigfs on \/sys\/kernel\/config type configfs (rw)\r\nocfs2_dlmfs on \/dlm type ocfs2_dlmfs (rw)\r\n\/dev\/mapper\/mpath0 on \/data type ocfs2 (rw,_netdev,heartbeat=local)\r\n\r\nsrv-guiguiabloc-a:\/data# touch test\r\n\r\nsrv-guiguiabloc-b:\/data# ls\r\ntest  lost+found<\/pre>\n<p>Vous pouvez vous amuser \u00e0 \u00e9crire des deux c\u00f4t\u00e9s, couper un Target, vautrer un disque etc&#8230;<\/p>\n<p>Apr\u00e8s plusieurs essais intensifs, je vous avoue que j&rsquo;ai \u00e9t\u00e9 bluff\u00e9 par le fonctionnement, que, je l&rsquo;avoue, j&rsquo;ai pouss\u00e9 \u00e0 l&rsquo;extr\u00eame.<\/p>\n<p>Ne reste qu&rsquo;\u00e0 le greffer sur votre architecture \u00ab\u00a0Alt\u00e9onis\u00e9e\u00a0\u00bb que vous avez mont\u00e9e apr\u00e8s la lecture de :<\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"Yw4pPxSw8y\"><p><a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/01\/14\/switch-applicatif-avec-openbsd-un-alteon-a-la-maison\/\">Switch applicatif avec OpenBSD, un Alt\u00e9on \u00e0 la maison ?&#8230;<\/a><\/p><\/blockquote>\n<p><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00ab\u00a0Switch applicatif avec OpenBSD, un Alt\u00e9on \u00e0 la maison ?&#8230;\u00a0\u00bb &#8212; GuiguiAbloc\" src=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/01\/14\/switch-applicatif-avec-openbsd-un-alteon-a-la-maison\/embed\/#?secret=Yw4pPxSw8y\" data-secret=\"Yw4pPxSw8y\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<p>Ce qui nous donne un joli r\u00e9sultat au final :<\/p>\n<div id=\"attachment_348\" style=\"width: 201px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/02\/guiguiablocfullha.png\"><img aria-describedby=\"caption-attachment-348\" loading=\"lazy\" class=\"size-medium wp-image-348\" title=\"guiguiablocfullha\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/02\/guiguiablocfullha-191x300.png\" alt=\"La Haute Dispo vue par Guiguiabloc\" width=\"191\" height=\"300\" \/><\/a><p id=\"caption-attachment-348\" class=\"wp-caption-text\">La Haute Dispo vue par Guiguiabloc<\/p><\/div>\n<p>Tr\u00e8s \u00ab\u00a0poilu\u00a0\u00bb, non ? \ud83d\ude00<\/p>\n<p>Comme dirais mon pote `g0rt :<\/p>\n<p>[17:53] <`g0rt> ca c&rsquo;est de la redondance vindiousse<\/p>\n<p>Bon courage dans le peaufinage de votre cluster \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Difficile de faire plus court en titre&#8230; Je vous pr\u00e9viens tout de suite, ce billet risque d&rsquo;\u00eatre un peu long car apr\u00e8s tout, j&rsquo;ai pass\u00e9 du temps dessus, autant que vous en passiez, vous aussi, a me lire \ud83d\ude42 Tous &hellip; <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/02\/16\/mise-en-oeuvre-dun-systeme-de-fichier-distribue-et-acces-concurrents-en-san-avec-drbd-iscsi-ocfs2-et-dm-multipath\/\">Read More <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[27,7],"tags":[61,100,103,105,101,20,104],"_links":{"self":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/311"}],"collection":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/comments?post=311"}],"version-history":[{"count":26,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/311\/revisions"}],"predecessor-version":[{"id":416,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/311\/revisions\/416"}],"wp:attachment":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/categories?post=311"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/tags?post=311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}