{"id":157,"date":"2008-10-17T09:47:46","date_gmt":"2008-10-17T08:47:46","guid":{"rendered":"http:\/\/blog.guiguiabloc.fr\/index.php\/2008\/10\/17\/cluster-haute-disponibilite-chez-ovh-avec-ipfailover-heartbeat-et-drbd-via-ipsec\/"},"modified":"2008-11-25T09:32:26","modified_gmt":"2008-11-25T08:32:26","slug":"cluster-haute-disponibilite-chez-ovh-avec-ipfailover-heartbeat-et-drbd-via-ipsec","status":"publish","type":"post","link":"http:\/\/blog.guiguiabloc.fr\/index.php\/2008\/10\/17\/cluster-haute-disponibilite-chez-ovh-avec-ipfailover-heartbeat-et-drbd-via-ipsec\/","title":{"rendered":"Cluster Haute-Disponibilit\u00e9 chez OVH, avec IpFailover, Heartbeat et DRBD via IPSEC"},"content":{"rendered":"<p>Ayant r\u00e9cemment command\u00e9 2 serveurs d\u00e9di\u00e9s chez OVH (des EG Best-of pour les curieux dont vous trouverez le d\u00e9tail <a href=\"http:\/\/www.ovh.com\/fr\/particulier\/produits\/eg_best_of.xml\" title=\"OVH-EG\" target=\"_blank\">ICI<\/a> ), dans le but d&rsquo;en faire un cluster Haute-disponibilit\u00e9, voici un \u00ab\u00a0petit\u00a0\u00bb tuto et retour d&rsquo;exp\u00e9rience.<\/p>\n<p>&nbsp;<\/p>\n<p>Les configs qui suivent sont sp\u00e9cifiques \u00e0 OVH pour la partie IP FailOver (ip load balanc\u00e9e) et la compilation du noyau pour DRBD mais le reste peut s&rsquo;adapter \u00e0 d&rsquo;autres h\u00e9bergeurs bien s\u00fbr (i.e Dedibox par exemple).<\/p>\n<p>&nbsp;<\/p>\n<p>Je ne rentrerais pas dans le troll de pourquoi OVH et pas D\u00e9dibox, mais j&rsquo;ai un \u00ab\u00a0gros\u00a0\u00bb faible pour OVH qui avec son Directeur G\u00e9n\u00e9ral des plus actifs, pr\u00e9sent sur les forums (Octave Klaba aka Oles, le fils d&rsquo;Henryk, le fondateur d&rsquo;OVH (<a href=\"http:\/\/www.oseo.fr\/a_la_une\/paroles_d_entrepreneurs\/sur_lci\/groupe_ovh\" title=\"OVH-histoire\" target=\"_blank\">un chti lien<\/a>), voila pour la partie People), une communaut\u00e9 de passionn\u00e9s et des services  hallucinant ont naturellement fait que je les pr\u00e9f\u00e8re \u00e0 son \u00ab\u00a0concurrent\u00a0\u00bb direct. Bref, je suis et connais OVH depuis sa \u00ab\u00a0naissance\u00a0\u00bb et ils ont prouv\u00e9s depuis longtemps leur statut. Les agitateurs de l&rsquo;h\u00e9bergement c&rsquo;est eux comme Free pour les FAI, mais cela reste ma propre opinion \ud83d\ude42 ,  et puis tout le monde a ses d\u00e9fauts \ud83d\ude41<\/p>\n<p>&nbsp;<\/p>\n<p>Donc suite a l&rsquo;acquisition de ses 2 serveurs, voici les contraintes que je me suis impos\u00e9es :<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>IP virtuelle basculable d&rsquo;un serveur \u00e0 l&rsquo;autre<\/li>\n<li>Partition synchronis\u00e9e en temps r\u00e9el et utilisable par simple bascule sur un serveur ou sur l&rsquo;autre<\/li>\n<li>Interruption de service &lt; 300 secondes<\/li>\n<li>Automatisation de la bascule<\/li>\n<li>Cryptage des flux r\u00e9seaux entre les 2 serveurs<\/li>\n<li> Alerte par Texto + Mail sur mon t\u00e9l\u00e9phone portable en cas de bascule<\/li>\n<\/ul>\n<p>Bien \u00e9videmment, les surveillances <a href=\"http:\/\/www.nagios.org\" title=\"nagios\" target=\"_blank\">Nagios<\/a> des 2 serveurs ne seront pas \u00e9voqu\u00e9s ici, c&rsquo;est de la routine \ud83d\ude09 (en mode <a href=\"http:\/\/nagios.sourceforge.net\/docs\/3_0\/addons.html#nsca\" title=\"nsca\" target=\"_blank\">nsca<\/a> crypt\u00e9 hein \ud83d\ude00 )<\/p>\n<p>&nbsp;<\/p>\n<p>Je partirai du principe que mes serveurs s&rsquo;appellent ns11111 et ns22222 (nsxxxx.ovh.net \u00e9tant le hostname par d\u00e9faut des serveurs d&rsquo;OVH, a changer bien entendu rapidement et positionner un reverse \u00e9galement).<\/p>\n<p>On va consid\u00e9rer que ns11111 a l&rsquo;ip 192.168..20.20 et ns22222 192.168.20.30 (c&rsquo;est juste pour l&rsquo;exemple hein, je vais pas mettre d&rsquo;ip publiques dans le tuto \ud83d\ude09 vous changer par l&rsquo;ip publique principale de votre serveur = eth0<\/p>\n<p>On est parti, phase 1.<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Configuration d&rsquo;un tunnel VPN IPSEC en mode transport<\/li>\n<\/ul>\n<p>Pour que les \u00e9changes d&rsquo;information r\u00e9seau entre les deux serveurs d\u00e9di\u00e9s soient un minimum s\u00e9curis\u00e9 (comprendre difficilement \u00ab\u00a0sniffable\u00a0\u00bb), j&rsquo;ai d\u00e9cider de monter un tunnel VPN en IPSEC entre les deux.<\/p>\n<p>Les serveurs sont sous Debian Etch. (vous adapter si vous avez un autre OS)<\/p>\n<p>IPSEC autorise 2 modes de communication le mode tunnel (1 serveur\/r\u00e9seau vers 1 r\u00e9seau) et le mode Transport (1 serveur vers 1 serveur) (en r\u00e9sum\u00e9 hein, venez pas me saouler avec mon simplicisme \ud83d\ude09 )<\/p>\n<p>Donc le mode transport.<\/p>\n<p>apt-get install ipsec-tools<\/p>\n<p>&nbsp;<\/p>\n<p>on se configure le \/etc\/ipsec-tools.conf sur les deux serveurs.<\/p>\n<p>ns11111 :<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"code\">#!\/usr\/sbin\/setkey -f \r\n\r\nflush;\r\n\r\nspdflush;\r\n\r\n# AH\r\n\r\nadd 192.168.20.30 192.168.20.20 ah 15700 -A hmac-md5 \"1234567890123456\";\r\n\r\nadd 192.168.20.20 192.168.20.30 ah 24500 -A hmac-md5 \"1234567890123456\";\r\n\r\n# ESP\r\n\r\nadd 192.168.20.30 192.168.20.20 esp 15701 -E 3des-cbc \"123456789012123456789012\";\r\n\r\nadd 192.168.20.20 192.168.20.30 esp 24501 -E 3des-cbc \"123456789012123456789012\";\r\n\r\nspdadd 192.168.20.20 192.168.20.30 any -P out ipsec\r\n\r\n           esp\/transport\/\/require\r\n\r\n           ah\/transport\/\/require;\r\n\r\nspdadd 192.168.20.30 192.168.20.20 any -P in ipsec\r\n\r\n           esp\/transport\/\/require\r\n\r\n           ah\/transport\/\/require;<\/pre>\n<p>ns22222 :<\/p>\n<pre class=\"code\">#!\/usr\/sbin\/setkey -f \r\n\r\nflush;\r\n\r\nspdflush;\r\n\r\n# AH\r\n\r\nadd 192.168.20.30 192.168.20.20 ah 15700 -A hmac-md5 \"1234567890123456\";\r\n\r\nadd 192.168.20.20 192.168.20.30 ah 24500 -A hmac-md5 \"1234567890123456\";\r\n\r\n# ESP\r\n\r\nadd 192.168.20.30 192.168.20.20 esp 15701 -E 3des-cbc \"123456789012123456789012\";\r\n\r\nadd 192.168.20.20 192.168.20.30 esp 24501 -E 3des-cbc \"123456789012123456789012\";\r\n\r\nspdadd 192.168.20.30 192.168.20.20 any -P out ipsec\r\n\r\n        esp\/transport\/\/require\r\n\r\n ah\/transport\/\/require;\r\n\r\nspdadd 192.168.20.20 192.168.20.30 any -P in ipsec\r\n\r\n           esp\/transport\/\/require\r\n\r\n           ah\/transport\/\/require;<\/pre>\n<p>Vous remarquerez que les changements portent sur les sens de trafic.<\/p>\n<p>Bien \u00e9videmment, vous changez les cl\u00e9s (32 octets hexadecimaux, et 48 pour les cl\u00e9s 3des-cbc), g\u00e9n\u00e9rable faisable facilement par un :<\/p>\n<p>&nbsp;<\/p>\n<p>hexdump -e \u20188\/2 \u201c%04x\u201d &lsquo; \/dev\/urandom -n 16; echo (pour les 32 caract\u00e8res)<\/p>\n<p>hexdump -e \u20188\/2 \u201c%04x\u201d &lsquo; \/dev\/urandom -n 24; echo (pour 48)<\/p>\n<p>&nbsp;<\/p>\n<p>Exemple :<\/p>\n<p>hexdump -e &lsquo;8\/2 \u00ab\u00a0%04x\u00a0\u00bb &lsquo; \/dev\/urandom -n 16; echo<br \/>\n6e99170129b4bc1b774161f0c7ecf50f<\/p>\n<p>la cl\u00e9 = 0x6e99170129b4bc1b774161f0c7ecf50f (sans les guillemets).<\/p>\n<p>&nbsp;<\/p>\n<p>Un ping vers l&rsquo;autre serveur et un tcpdump vous d\u00e9montreront le cryptage effectif :<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"code\"># tcpdump -n \"host 192.168.20.30\"\r\n\r\n01:23:27.996891 IP 192.168.20.20 &gt; 192.168.20.30: AH(spi=0x00000302,seq=0x1): ESP(spi=0x00000303,seq=0x1), length 88\r\n\r\n01:23:27.998282 IP 192.168.20.30 &gt; 192.168.20.20: AH(spi=0x00000202,seq=0x277ac2): ESP(spi=0x00000203,seq=0x277ac2), length 88\r\n\r\n01:23:28.999853 IP 192.168.20.20 &gt; 192.168.20.30: AH(spi=0x00000302,seq=0x2): ESP(spi=0x00000303,seq=0x2), length 88\r\n\r\n01:23:29.001726 IP 192.168.20.30 &gt; 192.168.20.20: AH(spi=0x00000202,seq=0x277ac3): ESP(spi=0x00000203,seq=0x277ac3), length 88\r\n\r\n4 packets captured\r\n\r\n15653 packets received by filter\r\n\r\n0 packets dropped by kernel<\/pre>\n<p>&nbsp;<\/p>\n<p>Un petit M\u00e9mo Ipsec <a href=\"http:\/\/www.cameuh.net\/pmwiki.php\/Docs\/MemoIpsec\" title=\"ipsec\" target=\"_blank\">ICI<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<p>Comme nous ne faisons que du 1 pour 1, inutile de se fatiguer \u00e0 installer une gestion des cl\u00e9s (type isakmpd ou Racoon).<\/p>\n<p>&nbsp;<\/p>\n<p><strong>NB : <\/strong>Pour s\u00e9curiser tout cela, vous peaufiner votre Iptables pour n&rsquo;accepter que du trafic Ipsec entre les deux serveurs.<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>DRBD<\/li>\n<\/ul>\n<p>Pour ceux qui ne connaissent pas <a href=\"http:\/\/www.drbd.org\" title=\"DRBD\" target=\"_blank\">DRBD<\/a>, il s&rsquo;agit en r\u00e9sum\u00e9 d&rsquo;un RAID 1 sur IP. Comprendre une synchronisation de deux partitions via le r\u00e9seau en mode bloc.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/drbd.gif\" title=\"drbd\"><img src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/drbd.thumbnail.gif\" alt=\"drbd\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Je vous invite \u00e0 consulter l&rsquo;excellent site www.drbd.org pour en savoir plus.<\/p>\n<p>&nbsp;<\/p>\n<p>Le noyau par d\u00e9faut des serveurs OVH n&rsquo;inclus pas le support des modules. Il faut donc le recompiler et \u00e9galement ajouter le driver Connector.<\/p>\n<p>&nbsp;<\/p>\n<p>&#8211; R\u00e9cup\u00e9rer les sources du Kernel<\/p>\n<p>cd \/usr\/src\/<br \/>\nwget <a href=\"ftp:\/\/ftp.ovh.net\/made-in-ovh\/bzImage\/linux-2.6.24.5-ovh.tar.bz2\" title=\"kernel-ovh\">ftp:\/\/ftp.ovh.net\/made-in-ovh\/bzImage\/linux-2.6.24.5-ovh.tar.bz2<\/a><br \/>\ntar -jxvf linux-2.6.24.5-ovh.tar.bz2<br \/>\nln -s linux-2.6.24.5-ovh linux<\/p>\n<p>&#8211; R\u00e9cuperer le .config standard<\/p>\n<p>wget <a href=\"ftp:\/\/ftp.ovh.net\/made-in-ovh\/bzImage\/2.6-config-xxxx-std-ipv4-32\" title=\"config\">ftp:\/\/ftp.ovh.net\/made-in-ovh\/bzImage\/2.6-config-xxxx-std-ipv4-32<\/a><br \/>\ncp 2.6-config-xxxx-std-ipv4-32 linux\/.config<br \/>\ncd linux<\/p>\n<p>&#8211; Recompiler le noyau<\/p>\n<p>make menuconfig (ou votre m\u00e9thode pr\u00e9f\u00e9r\u00e9e).<\/p>\n<p>Activer le support des modules :<br \/>\n\u00ab\u00a0Enable loadable module support\u00a0\u00bb -&gt; \u00ab\u00a0Module unloading\u00a0\u00bb et \u00ab\u00a0Automatic kernel module loading\u00a0\u00bb<\/p>\n<p>Activer le kernel userspace connector:<\/p>\n<p>Device Drivers  &#8212;&gt; Connector &#8211; unified userspace &lt;-&gt; kernelspace linker<\/p>\n<p>make<br \/>\nmake modules_install<br \/>\ncp arch\/i386\/bzimage \/boot\/vmlinux-2.6.24.5-xxxx-std-ipv4-32<br \/>\ncp Sytem.map \/boot\/System.map-2.6.24.5-xxxx-std-ipv4-32<\/p>\n<p>Editer lilo.conf ou menu.lst de Grub pour pointer sur le bon kernel.<\/p>\n<p>lilo -v -v ou grub-install hd0<\/p>\n<p>Rebooter.<\/p>\n<p>&#8211; DRBD<\/p>\n<p>wget <a href=\"http:\/\/oss.linbit.com\/drbd\/8.0\/drbd-8.0.13.tar.gz\" target=\"_blank\">http:\/\/oss.linbit.com\/drbd\/8.0\/drbd-8.0.13.tar.gz<\/a><br \/>\ntar xzvf drbd-8.0.13.tar.gz<br \/>\ncd drbd-8.0.13<br \/>\ncd drbd<br \/>\nmake<br \/>\ncd ..<br \/>\nmake tools<br \/>\nmake install<br \/>\nmake install-tools<\/p>\n<p>Editer votre \/etc\/drbd.conf<\/p>\n<p>&nbsp;<\/p>\n<p>(A adapter \u00e0 votre configuration bien sur) :<\/p>\n<p>#<br \/>\n# drbd.conf<br \/>\n#<br \/>\nglobal {<br \/>\nusage-count yes;<br \/>\n}<\/p>\n<p>common {<br \/>\nsyncer { rate 20M; }<br \/>\n}<\/p>\n<p>resource r0 {<\/p>\n<p>protocol C;<\/p>\n<p>handlers {<br \/>\npri-on-incon-degr \u00ab\u00a0echo o &gt; \/proc\/sysrq-trigger ; halt -f\u00a0\u00bb;<br \/>\npri-lost-after-sb \u00ab\u00a0echo o &gt; \/proc\/sysrq-trigger ; halt -f\u00a0\u00bb;<br \/>\nlocal-io-error \u00ab\u00a0echo o &gt; \/proc\/sysrq-trigger ; halt -f\u00a0\u00bb;<br \/>\noutdate-peer \u00ab\u00a0\/usr\/lib\/heartbeat\/drbd-peer-outdater -t 5\u00a0\u00bb;<br \/>\n}<\/p>\n<p>startup {<br \/>\ndegr-wfc-timeout 120;    # 2 minutes.<br \/>\n}<\/p>\n<p>disk {<br \/>\non-io-error   detach;<br \/>\n}<\/p>\n<p>net {<br \/>\nafter-sb-1pri disconnect;<br \/>\nafter-sb-2pri disconnect;<br \/>\nrr-conflict disconnect;<br \/>\n}<\/p>\n<p>syncer {<br \/>\nrate 20M;<br \/>\nal-extents 257;<br \/>\n}<\/p>\n<p>on ns11111 {<br \/>\ndevice     \/dev\/drbd0;<br \/>\ndisk       \/dev\/sda10;<br \/>\naddress    192.168.20.20:7788;<br \/>\nmeta-disk  internal;<br \/>\n}<\/p>\n<p>on ns22222 {<br \/>\ndevice    \/dev\/drbd0;<br \/>\ndisk      \/dev\/sda10;<br \/>\naddress   192.168.20.30:7788;<br \/>\nmeta-disk internal;<br \/>\n}<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<p><strong>NB: <\/strong>Vous verrouillez le port 7788 dans Iptables bien s\u00fbr&#8230;<\/p>\n<p>(en cas de soucis avec une partition pr\u00e9lablement cr\u00e9\u00e9e, il suffit de passer un : dd if=\/dev\/zero bs=1M count=1 of=\/dev\/sdaX; sync )<\/p>\n<p>A faire sur chacun des noeuds :<\/p>\n<pre class=\"code\"><\/pre>\n<pre class=\"code\">drbdadm create-md r0\r\nmodprobe drbd\r\ndrbdadm attach r0\r\ndrbdadm connect r0\r\ncat \/proc\/drbd<\/pre>\n<p>\/etc\/init.d\/drbd start<br \/>\nSur le serveur primaire : drbdadm &#8212; &#8211;overwrite-data-of-peer primary r0<br \/>\nPour suivre la synchro initiale :<\/p>\n<p>cat \/proc\/drbd<br \/>\nVous pouvez formater la partition :<\/p>\n<p>mkfs.ext3 \/dev\/drbd0<\/p>\n<p>&nbsp;<\/p>\n<p>Je vous invite \u00e0 consulter Google pour pousser plus en avant votre compr\u00e9hension de DRBD.<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Heartbeat<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Heartbeat est un syst\u00e8me de prise de pouls pour un cluster (d\u00e9finition d\u00e9taill\u00e9e <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Heartbeat_(programme)\" title=\"heartbeat\" target=\"_blank\">ICI<\/a>).<\/p>\n<p>Il se charge de surveiller son \u00ab\u00a0confr\u00e8re\u00a0\u00bb et d&rsquo;executer certains commandes pr\u00e9-d\u00e9finis en cas de perte de l&rsquo;un des noeuds.<\/p>\n<p>Sur les 2 serveurs :<\/p>\n<p>apt-get install heartbeat<\/p>\n<p>&nbsp;<\/p>\n<p>Cr\u00e9er le fichier \/etc\/ha.d\/ha.cf :<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"code\">ucast eth0 192.168.20.30 (pour ns11111, 192.168.20.20 pour ns22222)\r\ndebugfile \/var\/log\/ha-debug\r\nlogfile \/var\/log\/ha-log\r\nlogfacility local0\r\n# D\u00e9lai entre deux battements de pouls\r\nkeepalive 2\r\n# Temps n\u00e9cessaire avant de consid\u00e9rer un noeud comme mort\r\ndeadtime 30\r\n# d\u00e9lai avant d'envoyer un avertissement pour les pouls en retard\r\nwarntime 6\r\n# deadtime sp\u00e9cifique pour les conf ou le reseau met du temps a d\u00e9marrer\r\ninitdead 60\r\n# port a utiliser pour la prise de pouls\r\nudpport 694\r\n# uname -n pour connaitre le nom des serveurs\r\nnode ns11111.ovh.net\r\nnode ns22222.ovh.net\r\n# met la valeur on, pour master auto\r\nauto_failback off<\/pre>\n<p>&nbsp;<\/p>\n<p>Cr\u00e9er le fichier \/etc\/ha.d\/authkeys :<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"code\">auth 1\r\n1 md5 \"supermotdepasse\"\r\n2 crc<\/pre>\n<pre class=\"code\">\r\nchmod 600 \/etc\/ha.d\/authkeys<\/pre>\n<p>&nbsp;<\/p>\n<p>La partie la plus importante maintenant, les scripts \u00e0 lancer :<\/p>\n<p>&nbsp;<\/p>\n<p>\/etc\/ha.d\/haresources  :<\/p>\n<p>ns11111.ovh.net IPaddrFO::10.10.10.10\/32\/eth0 drbddisk::r0 Filesystem::\/dev\/drbd0::\/data::ext3<\/p>\n<p>&nbsp;<\/p>\n<p>Petite explication sur cette ligne :<\/p>\n<p>On sp\u00e9cifie tout d&rsquo;abord le noeud Ma\u00eetre, ici ns11111.<\/p>\n<p>Puis on utilise le script IPaddrFO (on va voir cela apr\u00e8s) pour monter l&rsquo;adresse IP 10.10.10.10 en masque 255.255.255.255 sur eth0<\/p>\n<p>&nbsp;<\/p>\n<p>Puis on d\u00e9finie le DRBD comme Primaire et on monte la partition DRBD dans \/data en type ext3.<\/p>\n<p>&nbsp;<\/p>\n<p>Si le Maitre (ns11111) tombe, alors ns2222 devient le nouveau maitre et r\u00e9cup\u00e8re l&rsquo;adresse IP et la partition.<\/p>\n<p>&nbsp;<\/p>\n<p>IPaddrFO est en fait une copie de \/etc\/ha.d\/ressource.d\/IPaddr que j&rsquo;ai un peu modifier&#8230; (on voit cela plus bas).<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>IPFailOver<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Chez OVH, vous avez la possibilit\u00e9 de disposer d&rsquo;ips \u00ab\u00a0failover\u00a0\u00bb. Explication <a href=\"http:\/\/www.ovh.com\/fr\/particulier\/items\/ip_failover.xml\" title=\"ipfailover\" target=\"_blank\">ICI<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<p>L&rsquo;ipfailover est rout\u00e9e sur l&rsquo;un ou l&rsquo;autre des serveurs selon votre choix dans le \u00ab\u00a0Manager\u00a0\u00bb, l&rsquo;interface d&rsquo;administration de votre compte OVH.<\/p>\n<p>&nbsp;<\/p>\n<p>J&rsquo;ai donc tout d&rsquo;abord demander une IP failover pour mon serveur ns11111.ovh.net. Cette IP est 10.10.10.10 dans mon exemple.<\/p>\n<p>Elle est rout\u00e9e sur 192.168.20.20.<\/p>\n<p>&nbsp;<\/p>\n<p>Et l\u00e0 vous me dites \u00ab\u00a0ahan mais c&rsquo;est nul, t&rsquo;es oblig\u00e9 d&rsquo;aller dans ton interface pour affecter la nouvelle redirection, SAPU !!! Je vais pas faire \u00e7a a la main moi !!!\u00a0\u00bb<\/p>\n<p>&nbsp;<\/p>\n<p>Et ben non, jeune Padawan, on vas automatiser tout cela grace \u00e0&#8230;. SOAP.<\/p>\n<p>&nbsp;<\/p>\n<p>Car OVH propose des API SOAP pour attaquer directement l&rsquo;interface via un script perl, php, C ou python&#8230;  Fort non ?<\/p>\n<p>&nbsp;<\/p>\n<p>Le site est ici : <a href=\"http:\/\/www.ovh.com\/soapi\/fr\/\" title=\"soapi\" target=\"_blank\">http:\/\/www.ovh.com\/soapi\/fr\/<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Perso, j&rsquo;ai choisi Python. Parce que Pyhon, SAYBIEN et pis c&rsquo;est tout.<\/p>\n<p>&nbsp;<\/p>\n<p>On a juste besoin de Python (dingue non ?) et de soappy suur les serveurs.<\/p>\n<p>&nbsp;<\/p>\n<p>apt-get install python-soappy python<\/p>\n<p>&nbsp;<\/p>\n<p>Le script que j&rsquo;utilise :<\/p>\n<p>&nbsp;<\/p>\n<p>ns11111-failoverupdate.py :<\/p>\n<pre class=\"code\">#!\/usr\/bin\/python\r\n\r\nfrom SOAPpy import WSDL\r\n\r\nsoap = WSDL.Proxy('https:\/\/www.ovh.com\/soapi\/ovh.wsdl')\r\n\r\n#login\r\nnic = 'monlogin-ovh'\r\npassword = 'xxxxxxx'\r\n\r\ntry:\r\n session = soap.login( nic, password )\r\n print \"login successfull\"\r\nexcept:\r\n print \"Error login\"\r\n\r\n#dedicatedFailoverUpdate\r\ntry:\r\n result = soap.dedicatedFailoverUpdate( session, 'ns11111.ovh.net', '10.10.10.10', '192.168.20.20' );\r\n print \"dedicatedFailoverUpdate successfull\";\r\n # your code here ...\r\nexcept:\r\n print \"Error dedicatedFailoverUpdate\"\r\n\r\n#logout\r\ntry:\r\n result = soap.logout( session )\r\n print \"logout successfull\"\r\nexcept:\r\n print \"Error logout\"<\/pre>\n<p>&nbsp;<\/p>\n<p>ns22222-failoverupdate.py :<\/p>\n<pre class=\"code\">#!\/usr\/bin\/python\r\n\r\nfrom SOAPpy import WSDL\r\n\r\nsoap = WSDL.Proxy('https:\/\/www.ovh.com\/soapi\/ovh.wsdl')\r\n\r\n#login\r\nnic = 'monlogin-ovh'\r\npassword = 'xxxxx'\r\n\r\ntry:\r\n session = soap.login( nic, password )\r\n print \"login successfull\"\r\nexcept:\r\n print \"Error login\"\r\n\r\n#dedicatedFailoverUpdate\r\ntry:\r\n result = soap.dedicatedFailoverUpdate( session, 'ns11111.ovh.net', '10.10.10.10', '192.168.20.30' );\r\n print \"dedicatedFailoverUpdate successfull\";\r\n # your code here ...\r\nexcept:\r\n print \"Error dedicatedFailoverUpdate\"\r\n\r\n#logout\r\ntry:\r\n result = soap.logout( session )\r\n print \"logout successfull\"\r\nexcept:\r\n print \"Error logout\"<\/pre>\n<p>&nbsp;<\/p>\n<p>Explication sur la ligne \u00ab\u00a0soap.dedicatedFailoverUpdate\u00a0\u00bb :<\/p>\n<p>Le premier champ correspond au hostname OVH sur serveur sur lequel vous avez pris (comprendre commander) votre ip failover. Ici ns11111.ovh.net<\/p>\n<p>Ensuite l&rsquo;ip failover elle m\u00eame.<\/p>\n<p>Puis l&rsquo;ip sur laquelle router la failover .<\/p>\n<p>&nbsp;<\/p>\n<p>Facile non ?<\/p>\n<p>&nbsp;<\/p>\n<p>On se modifie notre script \/etc\/ha.d\/ressource.d\/IPaddrFO (copie de IPaddr) :<\/p>\n<p>A la fin :<\/p>\n<pre class=\"code\">case $2 in\r\n  start)        \/etc\/ha.d\/ns11111-failoverupdate.py\r\n                ip_start $1;;\r\n  stop)         \/etc\/ha.d\/ns22222-failoverupdate.py\r\n                ip_stop $1;;\r\n  status)       ip_status $1;;\r\n  monitor)      ip_monitor $1;;\r\n  *)            usage\r\n                exit 1\r\n                ;;\r\nesac<\/pre>\n<p>&nbsp;<\/p>\n<p>Vous inverser les scripts sur ns2222 bien s\u00fbr&#8230;<\/p>\n<p>&nbsp;<\/p>\n<p>Vous pouvez maintenant lancer heartbeat sur ns1111 puis sur ns2222 et vous devriez voir les annonces d\u00e9filaient dans le syslog et l&rsquo;ipfailover mont\u00e9 sur ns11111 ainsi que le partition \/data en DRBD.<\/p>\n<p>&nbsp;<\/p>\n<p>Un reboot de ns11111 et l&rsquo;ip failover bascule sur ns22222, la partition \/data en DRBD monte et le script python force l&rsquo;update du failover sur l&rsquo;interface OVH.<\/p>\n<p>&nbsp;<\/p>\n<p>Apr\u00e8s de multiples tests, le plus long est cette mise \u00e0 jour dans l&rsquo;interface, dans l&rsquo;ensemble les 2 serveurs mettent quelques secondes \u00e0 basculer mais la mise \u00e0 jour prend entre 60 et 90 secondes.<\/p>\n<p>&nbsp;<\/p>\n<p>Ce qui entraine une indispo maximum d&rsquo;1 minute 30. Ca va encore hein \ud83d\ude00<\/p>\n<p>&nbsp;<\/p>\n<p>Derni\u00e8re chose, l&rsquo;alerte SMS \ud83d\ude42<\/p>\n<p>&nbsp;<\/p>\n<p>Alors l\u00e0, je me suis pas foul\u00e9 \ud83d\ude00 , autant utiliser les services de nos op\u00e9rateurs de t\u00e9l\u00e9phonie mobile.<\/p>\n<p>&nbsp;<\/p>\n<p>Etant chez SFR, je peux me cr\u00e9er une BAL type @sfr.fr consultable sur leur Webmail : http:\/\/sfr-messagerie.fr<\/p>\n<p>&nbsp;<\/p>\n<p>Le petit plus de cette BAL c&rsquo;est que lorsque vous recevez un email sur cette adresse, vous recevez un texto sur votre mobile avec le sujet du mail \ud83d\ude00<\/p>\n<p>&nbsp;<\/p>\n<p>Il n&rsquo;en faut pas plus pour \u00eatre alert\u00e9 par SMS en temps quasi r\u00e9el.<\/p>\n<p>&nbsp;<\/p>\n<p>On ajoute une entr\u00e9e dans le \/etc\/ha.d\/haresources (sur les deux serveurs) :<\/p>\n<p>&nbsp;<\/p>\n<p>ns11111.ovh.net IPaddrFO::10.10.10.10\/32\/eth0 drbddisk::r0 Filesystem::\/dev\/drbd0::\/data::ext3 MailTo::monadresse@sfr.fr::Alerte_Bascule<\/p>\n<p>&nbsp;<\/p>\n<p>De plus, OVH vous envoie un email quand vous forcer l&rsquo;update de l&rsquo;ipfailover, si avec tout ca, vous n&rsquo;etes pas inform\u00e9 que votre cluster \u00e0 basculer&#8230;<\/p>\n<p>&nbsp;<\/p>\n<p>Petite pr\u00e9cision, dans ma configuration, j&#8217;empeche le serveur ns11111 de redevenir Ma\u00eetre automatiquement quand il revient (en cas de soucis \u00e9lectrique ou reboot en boucle par exemple), c&rsquo;est a vous de v\u00e9rifier que tout va bien sur ns1111 et de lancer un simple \u00ab\u00a0\/etc\/init.d\/heartbeat restart\u00a0\u00bb sur ns22222 pour que les noeuds repassent en mode master\/slave comme \u00e0 l&rsquo;origine.<\/p>\n<p>&nbsp;<\/p>\n<p>Voila, une petite architecture poilue comme je l&rsquo;aime \ud83d\ude42<\/p>\n<p>&nbsp;<\/p>\n<p>En esp\u00e9rant vous avoir apporter des id\u00e9es et vous donner envie de d\u00e9couvrir Heartbeat et DRBD, car bien sur, dans mon exemple, je ne parle pas des relances de services type Mysql ou Apache en mode \u00ab\u00a0cluster\u00a0\u00bb \ud83d\ude09<\/p>\n<p>&nbsp;<\/p>\n<p><strong>EDIT : <\/strong>Suite aux diff\u00e9rents tests via Ipsec, je vous conseille fortement d&rsquo;utiliser l&rsquo;algo AES plutot que 3DES pour l&rsquo;ESP. Donc profiter la recompilation de votre noyau pour inclure le support crypto AES (d\u00e9sactiv\u00e9 par d\u00e9faut dans la config OVH) et modifier vos conf ipsec-tools.conf ainsi :<\/p>\n<pre class=\"code\">add 192.168.20.30 192.168.20.20 esp 15701 -E rijndael-cbc \"123456789012123456789012\";<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ayant r\u00e9cemment command\u00e9 2 serveurs d\u00e9di\u00e9s chez OVH (des EG Best-of pour les curieux dont vous trouverez le d\u00e9tail ICI ), dans le but d&rsquo;en faire un cluster Haute-disponibilit\u00e9, voici un \u00ab\u00a0petit\u00a0\u00bb tuto et retour d&rsquo;exp\u00e9rience. &nbsp; Les configs qui &hellip; <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2008\/10\/17\/cluster-haute-disponibilite-chez-ovh-avec-ipfailover-heartbeat-et-drbd-via-ipsec\/\">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":[66,61,62,67,63,60,64,69,68,65,55],"_links":{"self":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/157"}],"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=157"}],"version-history":[{"count":1,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/157\/revisions"}],"predecessor-version":[{"id":229,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/157\/revisions\/229"}],"wp:attachment":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/categories?post=157"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/tags?post=157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}