<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>cluster on binbash.fr</title>
    <link>https://binbash.fr/tags/cluster/</link>
    <description>Recent content in cluster on binbash.fr</description>
    <image>
      <url>https://binbash.fr/img/logo-large-binbash-black-nobackground.png</url>
      <link>https://binbash.fr/img/logo-large-binbash-black-nobackground.png</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>fr-fr</language>
    <lastBuildDate>Tue, 21 Aug 2012 00:00:00 +0000</lastBuildDate><atom:link href="https://binbash.fr/tags/cluster/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Pacemaker 1.1</title>
      <link>https://binbash.fr/posts/pacemaker-1-1/</link>
      <pubDate>Tue, 21 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>https://binbash.fr/posts/pacemaker-1-1/</guid>
      <description>&lt;p&gt;Il existe aujourd&amp;rsquo;hui plusieurs séries de Pacemaker : la version 1.0 sur laquelle sont basés les précédents tutoriels (la version stable actuelle), la version 1.2 qui sera la future version stable et la version 1.1 qui contient les nouvelles fonctionnalités en provenance de la version de dev et les corrections de bugs. C&amp;rsquo;est sur cette version que sera basé Pacemaker 1.2 qui devrait sortir en fin d&amp;rsquo;année. Pour pouvoir utiliser la version 1.1 en production, les développeurs ont rajoutés 2 nouveaux schémas de configuration. Avec cette nouvelle version, vous pouvez utiliser Corosync 2.0, utiliser de nouvelles fonctionnalités (déplacer les ressources en fonction de l&amp;rsquo;utilisation de votre serveur, gestion des ACLs&amp;hellip;).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Il existe aujourd&rsquo;hui plusieurs séries de Pacemaker : la version 1.0 sur laquelle sont basés les précédents tutoriels (la version stable actuelle), la version 1.2 qui sera la future version stable et la version 1.1 qui contient les nouvelles fonctionnalités en provenance de la version de dev et les corrections de bugs. C&rsquo;est sur cette version que sera basé Pacemaker 1.2 qui devrait sortir en fin d&rsquo;année. Pour pouvoir utiliser la version 1.1 en production, les développeurs ont rajoutés 2 nouveaux schémas de configuration. Avec cette nouvelle version, vous pouvez utiliser Corosync 2.0, utiliser de nouvelles fonctionnalités (déplacer les ressources en fonction de l&rsquo;utilisation de votre serveur, gestion des ACLs&hellip;).</p>
<p><img loading="lazy" src="/img/pacemaker/versions_pacemaker.jpg" type="" alt="Les versions de Pacemaker"  /></p>
<h1 id="choix-du-schéma">Choix du schéma</h1>
<p>A ce jour, vous avez le choix entre les schémas suivants :</p>
<ul>
<li><strong>pacemaker-1.0</strong> qui correspond d&rsquo;un point de vue fonctionnalité à la version actuelle (et restera identique).</li>
<li><strong>pacemaker-1.1</strong> qui sert de tests pour les nouvelles fonctionnalités.</li>
<li><strong>pacemaker-1.2</strong> qui apporte les nouvelles fonctionnalités testées dans la version 1.1. Quand une nouvelle fonctionnalité apparaît dans cette version, sa syntaxe ne changera plus, ni dans la version 1.1, ni dans la version 1.2.</li>
</ul>
<blockquote>
<p>Vous pouvez donc utiliser sans risque en production la <strong>version 1.1 de Pacemaker</strong> avec le <strong>schéma 1.0</strong> (pour conserver la syntaxe actuelle) ou le <strong>schéma 1.2</strong> (pour utiliser de nouvelles fonctionnalités stables). Le schéma 1.1 servira a tester uniquement des fonctionnalités expérimentales : son usage est à proscrire en production !</p>
</blockquote>
<h1 id="installation">Installation</h1>
<p>Pacemaker 1.1 est disponible sur les backports Debian. Pour l&rsquo;installer, à partir d&rsquo;une Debian Squeeze fraîchement installée :</p>
<ul>
<li>Activez les backports Squeeze : rajoutez la ligne suivante dans votre <em>sources.list</em> (ou créez le fichier <em>/etc/apt/sources.list.d/backports.list</em> avec ce contenu) :</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">deb http://backports.debian.org/debian-backports squeeze-backports main
</span></span></code></pre></div><ul>
<li>Après une mise à jour de la liste des paquets, installez Pacemaker 1.1 :</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt-get update <span class="o">&amp;&amp;</span> apt-get install -t squeeze-backports pacemaker
</span></span></code></pre></div><h1 id="configuration">Configuration</h1>
<h2 id="corosyncconf">corosync.conf</h2>
<p>J&rsquo;utilise une configuration similaire à celle détaillée dans l&rsquo;article <a href="/posts/des-clusters-avec-pacemaker/">&ldquo;Des clusters avec Pacemaker&rdquo;</a>. Avec Corosync &lt; 2.0, seule la partie sur le &ldquo;plugin&rdquo; Pacemaker change (le <em>ver</em> passe de 0 à 1). Depuis la version 1.1.3 de Pacemaker, il est possible d&rsquo;utiliser le master control process (MCP) et un script d&rsquo;init dédié pour gérer le service Pacemaker. Pacemaker devient indépendant de la couche de message Corosync. Cela évite des problèmes de démarrage ou d&rsquo;arrêt des process Pacemaker (vécu inside). Au niveau de la configuration, on obtient :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl">totem {
</span></span><span class="line"><span class="cl">    version: 2
</span></span><span class="line"><span class="cl">    secauth: on
</span></span><span class="line"><span class="cl">    threads: 0
</span></span><span class="line"><span class="cl">    rrp_mode: active
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    interface {
</span></span><span class="line"><span class="cl">        ringnumber: 0
</span></span><span class="line"><span class="cl">        bindnetaddr: 10.0.0.0
</span></span><span class="line"><span class="cl">        mcastaddr: 226.94.1.1
</span></span><span class="line"><span class="cl">        mcastport: 5405
</span></span><span class="line"><span class="cl">        }
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    interface {
</span></span><span class="line"><span class="cl">        ringnumber: 1
</span></span><span class="line"><span class="cl">        bindnetaddr: 192.168.0.0
</span></span><span class="line"><span class="cl">        mcastaddr: 226.94.2.1
</span></span><span class="line"><span class="cl">        mcastport: 5405
</span></span><span class="line"><span class="cl">        }
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    }
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">logging {
</span></span><span class="line"><span class="cl">    fileline: off
</span></span><span class="line"><span class="cl">    to_stderr: no
</span></span><span class="line"><span class="cl">    to_logfile: no
</span></span><span class="line"><span class="cl">    to_syslog: yes
</span></span><span class="line"><span class="cl">    debug: on
</span></span><span class="line"><span class="cl">    timestamp: on
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">amf {
</span></span><span class="line"><span class="cl">    mode: disabled
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">service {
</span></span><span class="line"><span class="cl">    # Load the Pacemaker Cluster Resource Manager
</span></span><span class="line"><span class="cl">    ver: 1
</span></span><span class="line"><span class="cl">    name: pacemaker
</span></span><span class="line"><span class="cl">}
</span></span></code></pre></div><!-- raw HTML omitted -->
<p>Avant de démarrer Corosync, il faudra générer une clé pour la communication de vos noeuds avec <code>corosync-keygen</code> sur l&rsquo;un des noeuds. Copiez ensuite le fichier <em>/etc/corosync/authkey</em> sur l&rsquo;autre noeud. Plus de détails <a href="/posts/des-clusters-avec-pacemaker/#corosync-et-pacemaker">ici</a>.</p>
<p>Activez ensuite le démarrage de Corosync au boot en modifiant le fichier <em>/etc/default/corosync</em> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># start corosync at boot [yes|no]</span>
</span></span><span class="line"><span class="cl"><span class="nv">START</span><span class="o">=</span>yes
</span></span></code></pre></div><p>Vous pouvez démarrer Corosync via <code>/etc/init.d/corosync start</code> sur chaque noeud et vérifier que la communication entre les noeuds fonctionne :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@ha1:~# corosync-cfgtool -s
</span></span><span class="line"><span class="cl">Printing ring status.
</span></span><span class="line"><span class="cl">Local node ID <span class="m">1097041162</span>
</span></span><span class="line"><span class="cl">RING ID <span class="m">0</span>
</span></span><span class="line"><span class="cl">	<span class="nv">id</span>	<span class="o">=</span> 10.0.0.0
</span></span><span class="line"><span class="cl">	<span class="nv">status</span>	<span class="o">=</span> ring <span class="m">0</span> active with no faults
</span></span></code></pre></div><p>Démarrez ensuite Pacemaker avec <code>/etc/init.d/pacemaker start</code>. Votre cluster est prêt pour recevoir sa configuration.</p>
<p><strong>Attention :</strong> à ce jour, le script d&rsquo;init de Pacemaker ne contient pas les informations nécessaires pour un démarrage de Pacemaker au boot de votre serveur. Il faudra le modifier pour rajouter les runlevels de démarrage et d&rsquo;arrêt :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">### BEGIN INIT INFO</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Provides: pacemaker</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Required-Start: $network corosync</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Should-Start: $syslog</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Required-Stop: $network</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Default-Start: 2 3 4 5</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Default-Stop: 0 1 6</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Short-Description: Starts and stops Pacemaker Cluster Manager.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Description: Starts and stops Pacemaker Cluster Manager.</span>
</span></span><span class="line"><span class="cl"><span class="c1">### END INIT INFO</span>
</span></span></code></pre></div><p>Activez ensuite ce script d&rsquo;init avec <code>insserv -v  /etc/init.d/pacemaker</code>.</p>
<blockquote>
<p>A savoir : il existe une alternative à cette configuration en utilisant le plugin Corosync CMAN. J&rsquo;y reviendrais dans un autre article&hellip;</p>
</blockquote>
<h2 id="choix-du-schéma-1">Choix du schéma</h2>
<p>Après avoir démarré Corosync et Pacemaker, vous pouvez choisir le schéma de configuration à utiliser :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cibadmin -modify -xml-text <span class="s1">&#39;&lt;cib validate-with=&#34;pacemaker-1.2&#34;/&gt;&#39;</span>
</span></span></code></pre></div><blockquote>
<p>C&rsquo;est terminé. Vous pouvez utiliser les configurations proposées dans les tutoriels précédents : rien ne change. A suivre : gestion des ACLs, déplacement des ressources en fonction de l&rsquo;utilisation des noeuds&hellip;
Source : <a href="http://theclusterguy.clusterlabs.org">http://theclusterguy.clusterlabs.org</a></p>
</blockquote>]]></content:encoded>
    </item>
    
    <item>
      <title>Cluster Pacemaker : group/colocation/order</title>
      <link>https://binbash.fr/posts/cluster-pacemaker-groupcolocationorder/</link>
      <pubDate>Mon, 23 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>https://binbash.fr/posts/cluster-pacemaker-groupcolocationorder/</guid>
      <description>&lt;p&gt;Dans les &lt;a href=&#34;https://binbash.fr/tags/pacemaker/&#34;&gt;précédents articles&lt;/a&gt; sur le thème clusters/Pacemaker, nous avons aperçu rapidement une solution qui permet de regrouper les ressources sur un seul et même nœud (une VIP et son service par exemple) : l&amp;rsquo;utilisation de la commande &lt;em&gt;group&lt;/em&gt;. J&amp;rsquo;avais alors évoqué la problématique liée à son utilisation et le fait qu&amp;rsquo;il était parfois préférable d&amp;rsquo;utiliser une solution à base de &lt;em&gt;colocation/order&lt;/em&gt;. Le but étant d&amp;rsquo;éviter l&amp;rsquo;arrêt en cascade des ressources groupées. Je vais essayer ici de détailler la problématique et d&amp;rsquo;y apporter une solution.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dans les <a href="/tags/pacemaker/">précédents articles</a> sur le thème clusters/Pacemaker, nous avons aperçu rapidement une solution qui permet de regrouper les ressources sur un seul et même nœud (une VIP et son service par exemple) : l&rsquo;utilisation de la commande <em>group</em>. J&rsquo;avais alors évoqué la problématique liée à son utilisation et le fait qu&rsquo;il était parfois préférable d&rsquo;utiliser une solution à base de <em>colocation/order</em>. Le but étant d&rsquo;éviter l&rsquo;arrêt en cascade des ressources groupées. Je vais essayer ici de détailler la problématique et d&rsquo;y apporter une solution.</p>
<h1 id="pourquoi-grouper-les-ressources">Pourquoi grouper les ressources</h1>
<p>Si vous ne groupez pas vos ressources, elles vont être lancées sur des nœuds différents (c&rsquo;est le fonctionnement par défaut de Pacemaker qui va chercher à optimiser votre cluster). Si je reprends l&rsquo;exemple de la VIP et de son service et que je ne groupe pas les ressources, il y a de fortes chances pour que la VIP se retrouve sur un nœud et le service sur l&rsquo;autre. C&rsquo;est ce qu&rsquo;il se passe avec cet exemple : je déclare deux ressources VIP et SERVICE (deux ressources qui ne font rien, c&rsquo;est juste pour tester le comportement du cluster).</p>
<p><strong>La configuration :</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">property no-quorum-policy<span class="o">=</span><span class="s2">&#34;ignore&#34;</span>
</span></span><span class="line"><span class="cl">property stonith-enabled<span class="o">=</span><span class="s2">&#34;false&#34;</span>
</span></span><span class="line"><span class="cl">primitive VIP ocf:heartbeat:Dummy
</span></span><span class="line"><span class="cl">primitive SERVICE ocf:heartbeat:Dummy
</span></span></code></pre></div><p><strong>On obtient ce résultat visible via <em>crm_mon</em> :</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Wed Apr <span class="m">17</span> 11:15:25 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">2</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">VIP       <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>: Started test-ha1
</span></span><span class="line"><span class="cl">SERVICE   <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>: Started test-ha2
</span></span></code></pre></div><!-- raw HTML omitted -->
<p>La VIP et le SERVICE sont sur deux nœuds différents. Pour corriger ce comportement, on peut :</p>
<ul>
<li>Utiliser la commande <em>group</em> : les ressources doivent fonctionner ensemble.</li>
<li>Utiliser des contraintes sur les ressources avec <em>colocation</em> et <em>order</em> : on lie une ressource à une autre.</li>
</ul>
<h1 id="grouper-les-ressources">Grouper les ressources</h1>
<p>Une première solution est de grouper les ressources avec la commande <em>group</em> (attention l&rsquo;ordre des ressources est important) :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">group NOM_DU_GROUPE VIP SERVICE
</span></span></code></pre></div><p>Quand je groupe des ressources, ici la VIP et le SERVICE, je signifie que :</p>
<ul>
<li>La VIP et le SERVICE doivent fonctionner ensemble sur le même nœud.</li>
<li>Dans cet exemple la VIP doit démarrer avant le SERVICE.</li>
<li>Le SERVICE à besoin de la VIP pour fonctionner.</li>
<li>Si la VIP est arrêtée (volontairement ou pas), le SERVICE s&rsquo;arrête.</li>
<li>L&rsquo;inverse n&rsquo;est pas vrai : la VIP peut fonctionner sans le SERVICE.</li>
</ul>
<p>Je groupe ma VIP et mon SERVICE :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# group MON_SERVICE_HA VIP SERVICE
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# commit
</span></span></code></pre></div><p>Et j&rsquo;obtiens dans mon <!-- raw HTML omitted -->crm_mon<!-- raw HTML omitted --> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Wed Apr <span class="m">17</span> 12:52:28 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">1</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Resource Group: MON_SERVICE_HA
</span></span><span class="line"><span class="cl">     VIP        <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>: Started test-ha1
</span></span><span class="line"><span class="cl">     SERVICE    <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>: Started test-ha1
</span></span></code></pre></div><p>J&rsquo;ai le comportement recherché. Les deux ressources fonctionnent sur le même noeud. On va tester l&rsquo;arrêt du SERVICE, la VIP ne doit pas s&rsquo;arrêter :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# crm resource stop SERVICE
</span></span><span class="line"><span class="cl">root@test-ha1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Wed Apr <span class="m">17</span> 12:56:47 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">1</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Resource Group: MON_SERVICE_HA
</span></span><span class="line"><span class="cl">     VIP	<span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>:	Started test-ha1
</span></span><span class="line"><span class="cl">     SERVICE	<span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>:	Stopped
</span></span></code></pre></div><p>La VIP fonctionne toujours&hellip; Je redémarre le SERVICE et je coupe cette fois la VIP :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# crm resource stop VIP
</span></span><span class="line"><span class="cl">root@test-ha1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Wed Apr <span class="m">17</span> 12:57:54 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">1</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span></code></pre></div><p>Tout a été arrêté. En effet, le SERVICE a besoin de la VIP pour fonctionner.</p>
<!-- raw HTML omitted -->
<p>Pour illustrer ce problème, je reprends ma configuration précédente et je rajoute une VIP :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# property no-quorum-policy<span class="o">=</span><span class="s2">&#34;ignore&#34;</span>
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# property stonith-enabled<span class="o">=</span><span class="s2">&#34;false&#34;</span>
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# primitive VIP1 ocf:heartbeat:Dummy
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# primitive VIP2 ocf:heartbeat:Dummy
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# primitive SERVICE ocf:heartbeat:Dummy
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# group MON_SERVICE_HA VIP1 VIP2 SERVICE
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# commit
</span></span></code></pre></div><p>La sortie du <em>crm_mon</em> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Wed Apr <span class="m">17</span> 13:10:55 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">1</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Resource Group: MON_SERVICE_HA
</span></span><span class="line"><span class="cl">     VIP1       <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>: Started test-ha1
</span></span><span class="line"><span class="cl">     VIP2       <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>: Started test-ha1
</span></span><span class="line"><span class="cl">     SERVICE    <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>: Started test-ha1
</span></span></code></pre></div><p>J&rsquo;ai une intervention à faire sur la VIP2. Je souhaite l&rsquo;arrêter et dans l&rsquo;idéal ne pas impacter mon SERVICE qui utilise aussi la VIP1 :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# crm resource stop VIP2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">root@test-ha1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Wed Apr <span class="m">17</span> 13:12:49 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">1</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Resource Group: MON_SERVICE_HA
</span></span><span class="line"><span class="cl">     VIP1	<span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>:	Started test-ha1
</span></span><span class="line"><span class="cl">     VIP2	<span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>:	Stopped
</span></span><span class="line"><span class="cl">     SERVICE	<span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>:	Stopped
</span></span></code></pre></div><blockquote>
<p><strong>Conclusion :</strong> ce n&rsquo;est pas possible avec cette configuration. Elle est à privilégier dans le cas d&rsquo;un cluster qui utilise des relations simples entre ses ressources. Dans le cas contraire, ici dans mon exemple, il est préférable d&rsquo;utiliser des contraintes sur les ressources avec <em>colocation</em>.</p>
</blockquote>
<h1 id="lier-les-ressources-avec-colocation">Lier les ressources avec colocation</h1>
<p>L&rsquo;alternative à la commande <em>group</em> est la contrainte <em>colocation</em> : le principe est le même, on va lier des ressources entre elles. A la différence que nous allons pouvoir ici utiliser la notion de &ldquo;score&rdquo; pour décrire plus précisément l&rsquo;emplacement des ressources entre elles. La syntaxe de la commande :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# <span class="nb">help</span> colocation
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">This constraint expresses the placement relation between two
</span></span><span class="line"><span class="cl">or more resources. If there are more than two resources, <span class="k">then</span> the
</span></span><span class="line"><span class="cl">constraint is called a resource set. Collocation resource sets have
</span></span><span class="line"><span class="cl">an extra attribute to allow <span class="k">for</span> sets of resources which don<span class="err">&#39;</span>t depend
</span></span><span class="line"><span class="cl">on each other in terms of state. The shell syntax <span class="k">for</span> such sets is
</span></span><span class="line"><span class="cl">to put resources in parentheses.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Usage:
</span></span><span class="line"><span class="cl">...............
</span></span><span class="line"><span class="cl">        colocation &lt;id&gt; &lt;score&gt;: &lt;rsc&gt;<span class="o">[</span>:&lt;role&gt;<span class="o">]</span> &lt;rsc&gt;<span class="o">[</span>:&lt;role&gt;<span class="o">]</span> ...
</span></span><span class="line"><span class="cl">...............
</span></span><span class="line"><span class="cl">Example:
</span></span><span class="line"><span class="cl">...............
</span></span><span class="line"><span class="cl">        colocation dummy_and_apache -inf: apache dummy
</span></span><span class="line"><span class="cl">        colocation c1 inf: A <span class="o">(</span> B C <span class="o">)</span>
</span></span><span class="line"><span class="cl">...............
</span></span></code></pre></div><p>Si je reprends mon exemple de configuration avec mes deux VIPs, la configuration devient :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# property no-quorum-policy<span class="o">=</span><span class="s2">&#34;ignore&#34;</span>
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# property stonith-enabled<span class="o">=</span><span class="s2">&#34;false&#34;</span>
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# primitive VIP1 ocf:heartbeat:Dummy
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# primitive VIP2 ocf:heartbeat:Dummy
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# primitive SERVICE ocf:heartbeat:Dummy
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# colocation SERVICE-avec-VIP inf: VIP1 VIP2 SERVICE
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# commit
</span></span></code></pre></div><p>Quelques explications sur la syntaxe de <em>colocation</em> et sur la gestion du score :</p>
<ul>
<li><strong>SERVICE-avec-VIP</strong> est l&rsquo;id de ma contrainte.</li>
<li>Le score <strong>mandatory</strong> va décrire le fonctionnement de notre contrainte : mandatory est équivalent à INFINITY (traduit par inf si vous faites un <em>crm configure show</em>). Cela signifie que vos ressources fonctionneront <strong>toujours</strong> ensemble. A l&rsquo;inverse, si j&rsquo;utilise le mot clé -INFINITY, les ressources ne seront <strong>jamais</strong> ensemble. Le mot clé <strong>advisory</strong> est lui équivalent à un score de <strong>0</strong> et peut se traduire par les ressources <strong>devraient</strong> fonctionner ensemble. Ce cas-là sera moins utilisé en tout cas pas seul et fera intervenir d&rsquo;autres contraintes ou éléments de la configuration.</li>
<li>Enfin la liste des ressources à lier&hellip; Encore une fois l&rsquo;ordre est important. Dans cet exemple, je me retrouve avec le même fonctionnement que précédemment à savoir :</li>
<li>Si je coupe VIP1, tout s&rsquo;arrête.</li>
<li>Si je coupe VIP2, SERVICE s&rsquo;arrête et VIP1 fonctionne toujours.</li>
<li>Si je coupe SERVICE, VIP1 et VIP2 fonctionnent toujours.</li>
</ul>
<h2 id="arrêt-vip1">Arrêt VIP1</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# crm resource stop VIP1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">root@test-ha1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Thu Apr <span class="m">18</span> 15:23:35 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">3</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span></code></pre></div><h2 id="arrêt-vip2">Arrêt VIP2</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# crm resource stop VIP2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">root@test-ha1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Thu Apr <span class="m">18</span> 15:24:55 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">3</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> VIP1	<span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>:	Started test-ha1
</span></span></code></pre></div><h2 id="arrêt-service">Arrêt SERVICE</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# crm resource stop SERVICE
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">root@test-ha1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Thu Apr <span class="m">18</span> 15:25:22 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">3</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> VIP1	<span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>:	Started test-ha1
</span></span><span class="line"><span class="cl"> VIP2	<span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>:	Started test-ha1
</span></span></code></pre></div><!-- raw HTML omitted -->
<p>Pour y parvenir nous utilisons les parenthèses pour indiquer les ressources qui n&rsquo;ont pas de dépendances entre elles. Exemple :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">colocation SERVICE-avec-VIP inf: <span class="o">(</span> VIP1 VIP2 <span class="o">)</span> SERVICE
</span></span></code></pre></div><p>Je précise donc que :</p>
<ul>
<li>Je peux couper indépendamment la VIP1 et/ou la VIP2 sans impacter le SERVICE</li>
<li>Si je coupe le SERVICE, les deux VIPs s&rsquo;arrêtent.</li>
</ul>
<h2 id="arrêt-vip1-1">Arrêt VIP1</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# crm resource stop  VIP1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">root@test-ha1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Thu Apr <span class="m">18</span> 15:36:14 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">3</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">VIP2    <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>: Started test-ha1
</span></span><span class="line"><span class="cl">SERVICE <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>: Started test-ha1
</span></span></code></pre></div><h2 id="arrêt-vip2-1">Arrêt VIP2</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# crm resource stop  VIP2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">root@test-ha1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Thu Apr <span class="m">18</span> 15:36:45 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">3</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">VIP1    <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>: Started test-ha1
</span></span><span class="line"><span class="cl">SERVICE <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>: Started test-ha1
</span></span></code></pre></div><h2 id="arrêt-service-1">Arrêt SERVICE</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# crm resource stop  SERVICE
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">root@test-ha1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Thu Apr <span class="m">18</span> 15:37:36 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">3</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span></code></pre></div><!-- raw HTML omitted -->
<h1 id="donner-un-ordre-de-démarrage-aux-ressources">Donner un ordre de démarrage aux ressources</h1>
<p>Pour s&rsquo;assurer qu&rsquo;un service démarre avant un autre, il faut utiliser la contrainte <em>order</em>. Comme nous l&rsquo;avons vu précédemment, contrairement à la commande <em>group</em>, la contrainte <em>colocation</em> ne définit par d&rsquo;ordre de démarrage (et d&rsquo;arrêt) de vos ressources. Je reprends l&rsquo;exemple précédent du SERVICE qui a besoin de ses deux VIPs pour fonctionner et je rajoute qu&rsquo;il faut <strong>si possible</strong> (la nuance est importante) démarrer les VIPs avant le SERVICE :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">order SERVICE-apres-VIPs advisory: <span class="o">(</span> VIP1 VIP2 <span class="o">)</span> SERVICE
</span></span></code></pre></div><p>La syntaxe est semblable à celle de <em>colocation</em> modulo l&rsquo;interprétation des parenthèses : dans cet exemple, on indique que VIP1 et VIP2 peuvent démarrer en parallèle. En résumé :</p>
<ul>
<li>Je rajoute une contrainte <em>order</em> avec &ldquo;SERVICE-apres-VIPs&rdquo; comme id.</li>
<li>Le SERVICE démarrera, <strong>de préférence</strong>, après les VIP1 et VIP2.</li>
<li>Les VIP1 et VIP2 peuvent démarrer en parallèle.</li>
</ul>
<!-- raw HTML omitted -->
<p>Avec un score infini, on indique que la VIP doit absolument démarrer avant le SERVICE : très bien c&rsquo;est ce qu&rsquo;on cherche. Mais cela implique que le SERVICE devra être arrêté avant de couper la VIP. On retombe sur un des problèmes précédents que l&rsquo;on cherche à éviter.</p>
<p>Avec un score <!-- raw HTML omitted -->mandatory (0)<!-- raw HTML omitted -->, Pacemaker essaye de démarrer la VIP avant le SERVICE et de stopper la VIP après le SERVICE à condition de ne pas impacter la ressource suivante dans la contrainte définie. Clairement, en cas d&rsquo;arrêt d&rsquo;une des VIPs, il ne coupera pas le SERVICE.</p>
<!-- raw HTML omitted -->
<h2 id="pour-finir-la-configuration-finale-de-ce-cluster-">Pour finir, la configuration finale de ce cluster :</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# property no-quorum-policy<span class="o">=</span><span class="s2">&#34;ignore&#34;</span>
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# property stonith-enabled<span class="o">=</span><span class="s2">&#34;false&#34;</span>
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# primitive VIP1 ocf:heartbeat:Dummy
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# primitive VIP2 ocf:heartbeat:Dummy
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# primitive SERVICE ocf:heartbeat:Dummy
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# colocation SERVICE-avec-VIP inf: <span class="o">(</span> VIP1 VIP2 <span class="o">)</span> SERVICE
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# order SERVICE-apres-VIP 0: <span class="o">(</span> VIP1 VIP2 <span class="o">)</span> SERVICE
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# commit
</span></span></code></pre></div><h2 id="je-vérifie-lordre-effectif-de-démarrage-des-mes-ressources-">Je vérifie l&rsquo;ordre effectif de démarrage des mes ressources :</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# grep <span class="s2">&#34;Initiating action&#34;</span> /var/log/daemon.log
</span></span><span class="line"><span class="cl">Apr <span class="m">19</span> 14:01:55 test-ha1 crmd: <span class="o">[</span>789<span class="o">]</span>: info: te_rsc_command: Initiating action 13: start VIP1_start_0 on test-ha1 <span class="o">(</span><span class="nb">local</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">Apr <span class="m">19</span> 14:01:55 test-ha1 crmd: <span class="o">[</span>789<span class="o">]</span>: info: te_rsc_command: Initiating action 14: start VIP2_start_0 on test-ha1 <span class="o">(</span><span class="nb">local</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">Apr <span class="m">19</span> 14:01:55 test-ha1 crmd: <span class="o">[</span>789<span class="o">]</span>: info: te_rsc_command: Initiating action 15: start SERVICE_start_0 on test-ha1 <span class="o">(</span><span class="nb">local</span><span class="o">)</span>
</span></span></code></pre></div><h2 id="si-je-coupe-la-vip2-par-exemple-je-ne-dois-pas-impacter-mon-service-">Si je coupe la VIP2 par exemple, je ne dois pas impacter mon SERVICE :</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# crm resource stop VIP2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">root@test-ha1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Mon Apr <span class="m">19</span> 14:08:57 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">3</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> VIP1	  <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>:	Started test-ha1
</span></span><span class="line"><span class="cl"> SERVICE  <span class="o">(</span>ocf::heartbeat:Dummy<span class="o">)</span>:	Started test-ha1
</span></span></code></pre></div><p>Quand je relance la VIP2, rien n&rsquo;est impacté&hellip;</p>
<h2 id="si-je-coupe-le-service-dans-ce-cas-là-tout-sarrête-">Si je coupe le SERVICE, dans ce cas là, tout s&rsquo;arrête :</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@test-ha1:~# crm resource stop SERVICE
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">root@test-ha1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Mon Apr <span class="m">19</span> 14:11:42 <span class="m">2012</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: test-ha1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">3</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> test-ha1 test-ha2 <span class="o">]</span>
</span></span></code></pre></div><h1 id="conclusion">Conclusion</h1>
<p>J&rsquo;espère avoir éclairci un peu ces notions&hellip; On peut essayer de résumer en se disant qu&rsquo;il est préférable d&rsquo;utiliser le couple <em>colocation/order</em> à la place de la commande <em>group</em>. Une utilisation généraliste dans le cas d&rsquo;un SERVICE et de ses n VIPs serait :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">colocation SERVICE-avec-VIP inf: <span class="o">(</span> VIP1 VIP2 VIPn<span class="o">)</span> SERVICE
</span></span><span class="line"><span class="cl">order SERVICE-apres-VIP 0: <span class="o">(</span> VIP1 VIP2 VIPn<span class="o">)</span> SERVICE
</span></span></code></pre></div><p>Il faudra se poser la question de qui doit démarrer avant qui mais également l&rsquo;impact que peut avoir l&rsquo;arrêt puis la relance d&rsquo;une ressource sur la ressource qui suit dans la contrainte de <em>colocation/order</em>. Dans l&rsquo;exemple de cet article, il faudrait se demander comment se comportera le SERVICE qui a été démarré avec n VIPs si on en coupe une ? Le SERVICE devient HS (il a perdu une VIP sur laquelle il est en écoute) ? Et quand la VIP est redémarrée, le SERVICE se remet en écoute sur cette adresse ?</p>
<p>Bons tests !</p>]]></content:encoded>
    </item>
    
    <item>
      <title>Cluster Pacemaker Apache actif/actif avec partage de charge simple</title>
      <link>https://binbash.fr/posts/cluster-pacemaker-apache-actifactif-avec-partage-de-charge-simple/</link>
      <pubDate>Fri, 18 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>https://binbash.fr/posts/cluster-pacemaker-apache-actifactif-avec-partage-de-charge-simple/</guid>
      <description>&lt;p&gt;Dans un &lt;a href=&#34;https://binbash.fr/posts/cluster-pacemaker-apache-actif-passif/&#34;&gt;article précédent&lt;/a&gt;, je vous ai présenté un cluster Apache en actif/passif. Nous allons voir ici comment le transformer rapidement en actif/actif avec un partage de charge simple. Je ne vais pas refaire tous les rappels de l&amp;rsquo;article précédent : si vous arrivez directement sur cet article et que vous souhaitez en savoir plus sur la configuration qui sera présentée dans cet article (ou sur le &lt;strong&gt;stonith&lt;/strong&gt;, le &lt;strong&gt;quorum&lt;/strong&gt;&amp;hellip;), jetez un oeil à l&amp;rsquo;article &lt;a href=&#34;https://binbash.fr/posts/cluster-pacemaker-apache-actif-passif/&#34;&gt;Cluster Pacemaker Apache actif/passif&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dans un <a href="/posts/cluster-pacemaker-apache-actif-passif/">article précédent</a>, je vous ai présenté un cluster Apache en actif/passif. Nous allons voir ici comment le transformer rapidement en actif/actif avec un partage de charge simple. Je ne vais pas refaire tous les rappels de l&rsquo;article précédent : si vous arrivez directement sur cet article et que vous souhaitez en savoir plus sur la configuration qui sera présentée dans cet article (ou sur le <strong>stonith</strong>, le <strong>quorum</strong>&hellip;), jetez un oeil à l&rsquo;article <a href="/posts/cluster-pacemaker-apache-actif-passif/">Cluster Pacemaker Apache actif/passif</a>.</p>
<h1 id="la-configuration-de-base">La configuration de base</h1>
<p>Je reprends pour les besoins de cet article cette configuration :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">property no-quorum-policy<span class="o">=</span><span class="s2">&#34;ignore&#34;</span>
</span></span><span class="line"><span class="cl">property stonith-enabled<span class="o">=</span><span class="s2">&#34;false&#34;</span>
</span></span><span class="line"><span class="cl">property default-resource-stickiness<span class="o">=</span><span class="s2">&#34;10&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">primitive VIP1 ocf:heartbeat:IPaddr2 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    params <span class="nv">ip</span><span class="o">=</span><span class="s2">&#34;192.168.0.10&#34;</span> <span class="nv">broadcast</span><span class="o">=</span><span class="s2">&#34;192.168.0.255&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="nv">nic</span><span class="o">=</span><span class="s2">&#34;eth1&#34;</span> <span class="nv">cidr_netmask</span><span class="o">=</span><span class="s2">&#34;24&#34;</span> <span class="nv">iflabel</span><span class="o">=</span><span class="s2">&#34;VIP1&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    op monitor <span class="nv">interval</span><span class="o">=</span><span class="s2">&#34;30s&#34;</span> <span class="nv">timeout</span><span class="o">=</span><span class="s2">&#34;20s&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">primitive APACHE ocf:heartbeat:apache <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    params <span class="nv">configfile</span><span class="o">=</span><span class="s2">&#34;/etc/apache2/apache2.conf&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    op monitor <span class="nv">interval</span><span class="o">=</span><span class="s2">&#34;30s&#34;</span> <span class="nv">timeout</span><span class="o">=</span><span class="s2">&#34;20s&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    op start <span class="nv">interval</span><span class="o">=</span><span class="s2">&#34;0&#34;</span> <span class="nv">timeout</span><span class="o">=</span><span class="s2">&#34;40s&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    op stop <span class="nv">interval</span><span class="o">=</span><span class="s2">&#34;0&#34;</span> <span class="nv">timeout</span><span class="o">=</span><span class="s2">&#34;60s&#34;</span>
</span></span></code></pre></div><p>On obtient quelque chose comme :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Thu Nov <span class="m">17</span> 20:28:22 <span class="m">2011</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: ha-test1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">2</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> ha-test2 ha-test1 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">VIP1    <span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>:       Started ha-test2
</span></span><span class="line"><span class="cl">APACHE  <span class="o">(</span>ocf::heartbeat:apache<span class="o">)</span>:        Started ha-test1
</span></span></code></pre></div><h1 id="apache-en-mode-actifactif">Apache en mode actif/actif</h1>
<p>On va maintenant passer Apache en mode actif/actif : Apache sera démarré, supervisé sur tous les noeuds qui composent le clusteur. Pour passer une ressource en mode actif/actif, c&rsquo;est très simple : il faut utiliser la fonction &ldquo;clone&rdquo;. Il y a 3 types de clones :</p>
<ul>
<li>Le clone &ldquo;<strong>Anonymous</strong>&rdquo; : des ressources identiques sur chaque noeud, c&rsquo;est le clone classique que je vais utiliser ici. La ressource fonctionnera de façon identique sur chaque noeud. Si un noeud est indisponible, il n&rsquo;y a pas de bascule de cette ressource puisqu&rsquo;elle est déjà fonctionnelle et identique sur l&rsquo;autre noeud. Dans ce fonctionnement, il n&rsquo;y aura donc qu&rsquo;un clone &ldquo;actif&rdquo; par noeud.</li>
<li>Le clone avec l&rsquo;option &ldquo;<strong>globally-unique=true</strong>&rdquo; : contrairement au cas précédent, les ressources ne sont pas identiques d&rsquo;un noeud à l&rsquo;autre. Elles peuvent par exemple, avoir des données différentes. Dans ce cas, on peut avoir plus d&rsquo;un clone par noeud : s&rsquo;il y a une bascule, la ressource clonée sera alors reprise par un autre noeud.</li>
<li>Le &ldquo;<strong>multi-state</strong>&rdquo; : c&rsquo;est une ressource qui peut être dans 2 états différents : &ldquo;master&rdquo; ou &ldquo;slave&rdquo;. J&rsquo;y reviendrais dans un prochain article.</li>
</ul>
<p>Pour transformer notre Apache actif/passif en actif/actif, on clone la ressource <em>APACHE</em> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">clone cAPACHE APACHE
</span></span></code></pre></div><p>La syntaxe est : <em>clone identifiant ressource</em>. On obtient :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Thu Nov <span class="m">17</span> 20:36:31 <span class="m">2011</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: ha-test1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">2</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> ha-test2 ha-test1 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">VIP1    <span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>:       Started ha-test2
</span></span><span class="line"><span class="cl"> Clone Set: cAPACHE
</span></span><span class="line"><span class="cl">     Started: <span class="o">[</span> ha-test1 ha-test2 <span class="o">]</span>
</span></span></code></pre></div><p>On voit que la ressource Apache est démarrée sur les deux noeuds : <strong>ha-test1</strong> et <strong>ha-test2</strong>. Clone peut avoir les options suivantes (options par défaut entre [ ] pour la version 1.0.9):</p>
<table>
<thead>
<tr>
<th>options</th>
<th>valeur</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>clone-max</strong></td>
<td>le nombre de copies de votre ressource. Par défaut, il y a autant de copies que de noeuds dans votre cluster. Dans mon exemple, clone-max est à 2.</td>
</tr>
<tr>
<td><strong>clone-node-max</strong></td>
<td>le nombre de copies qui peuvent être démarrées sur un seul noeud. Dans le cas d&rsquo;un clone &ldquo;Anonymous&rdquo;, cette valeur vaut automatiquement 1. Si vous utilisez un clone avec &ldquo;globally-unique=true&rdquo;, vous pouvez avoir une valeur supérieure à 1.</td>
</tr>
<tr>
<td><strong>notify</strong></td>
<td>prévenir les autres noeuds des actions en cours sur le clone de la ressource. Cela permet d&rsquo;interagir avec des scripts OCF en fonction de l&rsquo;état du clone. [true]/false.</td>
</tr>
<tr>
<td><strong>globally-unique</strong></td>
<td>est-ce que les clones ont un fonctionnement différent ? true/[false]</td>
</tr>
<tr>
<td><strong>ordered</strong></td>
<td>est-ce qu&rsquo;il faut démarrer les clones en série (true) ou en parallèle [false].</td>
</tr>
<tr>
<td><strong>interleave</strong></td>
<td>permet de changer le comportement de l&rsquo;ordre de démarrage des ressources. Si vous demandez à une ressource A de démarrer après votre clone B, la ressource A démarrera sur votre noeud quand tous les clones seront lancés avec [false] ou sans attendre les autres clones avec true.</td>
</tr>
</tbody>
</table>
<h1 id="la-vip">La VIP</h1>
<p>Il est également possible de cloner la VIP grâce à <em>iptables</em> et à la cible <em>CLUSTERIP</em>. Cela permet de créer un ensemble de serveurs qui vont répondre à la même adresse IP/MAC : chaque serveur recevra alors le paquet mais seul l&rsquo;un d&rsquo;entre eux y répondra. C&rsquo;est une solution très simple et rapide pour faire un partage de charge basique. Ce partage de charge à trois algorithmes différents :</p>
<ul>
<li><strong>sourceip</strong> : les clients ayant la même IP source seront toujours envoyés sur le même serveur. C&rsquo;est utile quand il est important de garder une session.</li>
<li><strong>sourceip-sourceport</strong> : le partage sur les noeuds se fait en fonction du couple IP source, port source. Le partage est donc un peu plus équitable. Les sessions ne sont plus conservées.</li>
<li><strong>sourceip-sourceport-destport</strong> : rajoute à l&rsquo;algorithme précédent le port destination. Cela permet un partage de charge différent en fonction du service utilisé.</li>
</ul>
<!-- raw HTML omitted -->
<p>Pour cloner la VIP : (l&rsquo;algorithme par défaut est <em>sourceip-sourceport</em> si vous ne spécifiez rien) :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">clone cVIP VIP1
</span></span></code></pre></div><p>Pour changer l&rsquo;algorithme :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">clone cVIP VIP1 meta <span class="nv">clusterip_hash</span><span class="o">=</span><span class="s2">&#34;sourceip&#34;</span>
</span></span></code></pre></div><p>On obtient :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Thu Nov <span class="m">17</span> 20:45:03 <span class="m">2011</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: ha-test1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">2</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> ha-test2 ha-test1 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Clone Set: cAPACHE
</span></span><span class="line"><span class="cl">     Started: <span class="o">[</span> ha-test1 ha-test2 <span class="o">]</span>
</span></span><span class="line"><span class="cl"> Clone Set: cVIP
</span></span><span class="line"><span class="cl">     Started: <span class="o">[</span> ha-test2 ha-test1 <span class="o">]</span>
</span></span></code></pre></div><p>Chaque Apache sert une page basique sur laquelle il affiche son hostname. On vérifie que le partage de charge fonctionne correctement :
<img loading="lazy" src="/img/pacemaker/curl.gif" type="" alt="curl -s"  /></p>
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    
    <item>
      <title>Cluster Pacemaker Apache actif/passif</title>
      <link>https://binbash.fr/posts/cluster-pacemaker-apache-actif-passif/</link>
      <pubDate>Thu, 27 Oct 2011 00:00:00 +0000</pubDate>
      
      <guid>https://binbash.fr/posts/cluster-pacemaker-apache-actif-passif/</guid>
      <description>&lt;p&gt;Suite de l&amp;rsquo;article &lt;a href=&#34;https://binbash.fr/posts/des-clusters-avec-pacemaker/&#34;&gt;des clusters avec pacemaker&lt;/a&gt; : nous allons voir ici comment mettre en place un cluster de deux noeuds, en actif / passif avec deux ressources : une VIP et Apache. Le besoin est le suivant : apporter de la haute disponibilité au serveur http Apache. La VIP (adresse IP virtuelle) et Apache devront fonctionner sur le même noeud, basculer sur l&amp;rsquo;autre noeud en cas de panne du noeud actif ou si une ressource est en erreur au-delà de la valeur définie.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Suite de l&rsquo;article <a href="/posts/des-clusters-avec-pacemaker/">des clusters avec pacemaker</a> : nous allons voir ici comment mettre en place un cluster de deux noeuds, en actif / passif avec deux ressources : une VIP et Apache. Le besoin est le suivant : apporter de la haute disponibilité au serveur http Apache. La VIP (adresse IP virtuelle) et Apache devront fonctionner sur le même noeud, basculer sur l&rsquo;autre noeud en cas de panne du noeud actif ou si une ressource est en erreur au-delà de la valeur définie.</p>
<p><img loading="lazy" src="/img/pacemaker/pcmk-active-passive.png" type="" alt="Pacemaker actif/passif"  /></p>
<h1 id="rappels-et-définitions">Rappels et définitions</h1>
<ul>
<li>Un cluster <strong>actif/passif</strong> fonctionne de cette façon : les ressources sont démarrées et supervisées par Pacemaker sur un seul noeud : le noeud actif (appelé également master ou maître). Si ce noeud rencontre une panne, les ressources sont basculées sur l&rsquo;autre noeud, le noeud passif (ou le slave, l&rsquo;esclave), qui devient alors le noeud actif. Quand l&rsquo;autre noeud est de nouveau fonctionnel, deux possibilités :</li>
<li><strong>Rien ne change :</strong> le cluster reste dans cette configuration. Le noeud réparé devient le noeud passif du cluster. Cela évite une nouvelle bascule et une nouvelle interruption du service. On parle alors de &ldquo;manual failback&rdquo; ou &ldquo;d&rsquo;auto_failback à off&rdquo;.</li>
<li><strong>On retourne dans l&rsquo;état précédent :</strong> il y a une nouvelle bascule. Le noeud réparé redevient le noeud actif du cluster. Il y a une nouvelle interruption du service. Cela correspond à activer &ldquo;l&rsquo;auto_failback&rdquo;.</li>
<li>Votre service, Apache ici, est démarré et supervisé par Pacemaker. Il est donc inutile (voir problématique dans certains cas) de démarrer le service au boot de votre serveur. C&rsquo;est uniquement à Pacemaker de gérer maintenant ce service. Pour désactiver le démarrage du service sur une Debian :</li>
<li>Sur une debian Squeeze si vous utilisez les dépendances entre les scripts d&rsquo;init :</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">insserv  -r -v apache2
</span></span></code></pre></div><ul>
<li>Sur une version inférieure à la 6.0 (Squeeze) :</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">update-rc.d -f apache2 remove
</span></span></code></pre></div><ul>
<li>Le service, Apache ici, doit être installé et configuré de façon identique sur les deux noeuds. Il ne faudra jamais oublier de reporter toute modification de la configuration sur l&rsquo;ensemble des noeuds sous peine d&rsquo;avoir, le jour d&rsquo;une bascule, un service potentiellement dégradé.</li>
<li>Pour les problématiques liées au <strong>stonith</strong> et au <strong>quorum</strong> que j&rsquo;ai détaillé <a href="/posts/des-clusters-avec-pacemaker/#probl%C3%A8mes-rencontr%C3%A9s--rappels">ici</a>, nous allons ignorer le quorum et désactiver le stonith. C&rsquo;est la base de toutes les configurations que je vais vous présenter.</li>
<li>Au sujet des exemples de configuration qui vont suivre : tout doit se faire sur une seule ligne. Vous pouvez couper les lignes longues via &ldquo;&quot; suivi d&rsquo;un retour à la ligne (comme dans les exemples) ou tout saisir sur une ligne. Par exemple plus bas, la syntaxe primitive commence avec &ldquo;primitive&rdquo; et se termine après la définition du &ldquo;timeout&rdquo;, le tout, sur une ligne.</li>
</ul>
<h1 id="la-configuration-de-base">La configuration de base</h1>
<p>Vous avez donc configuré Corosync, Apache sur vos deux noeuds. Corosync est démarré et la commande <code>crm_mon -1</code> renvoie quelque chose de semblable à :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@ha-test1:~# crm_mon -1
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Mon Oct <span class="m">24</span> 23:50:20 <span class="m">2011</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: ha-test1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">0</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> ha-test1 ha-test2 <span class="o">]</span>
</span></span></code></pre></div><p>On a donc 2 noeuds en ligne, pas de ressources configurées. On va commencer par configurer <strong>stonith</strong> et le <strong>quorum</strong> de ce cluster comme expliqué dans le paragraphe précédent. On injecte la configuration suivante via <code>crm configure</code> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# property no-quorum-policy<span class="o">=</span><span class="s2">&#34;ignore&#34;</span>
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# property stonith-enabled<span class="o">=</span><span class="s2">&#34;false&#34;</span>
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# commit
</span></span></code></pre></div><p>On vérifie la configuration via la commande <em>show</em> du mode <em>configure</em> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# show
</span></span><span class="line"><span class="cl">node ha-test1
</span></span><span class="line"><span class="cl">node ha-test2
</span></span><span class="line"><span class="cl">property <span class="nv">$id</span><span class="o">=</span><span class="s2">&#34;cib-bootstrap-options&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	dc-version<span class="o">=</span><span class="s2">&#34;1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	cluster-infrastructure<span class="o">=</span><span class="s2">&#34;openais&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	expected-quorum-votes<span class="o">=</span><span class="s2">&#34;2&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	no-quorum-policy<span class="o">=</span><span class="s2">&#34;ignore&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	stonith-enabled<span class="o">=</span><span class="s2">&#34;false&#34;</span>
</span></span></code></pre></div><p>crm configure en image :
<img loading="lazy" src="/img/pacemaker/crm_configure.gif" type="" alt="Fonctionnement de crm configure"  /></p>
<p>Le cluster est prêt pour recevoir la définition des ressources&hellip;</p>
<h1 id="la-vip">La VIP</h1>
<p>La VIP est l&rsquo;adresse de service de votre cluster. C&rsquo;est l&rsquo;adresse virtuelle à utiliser pour accéder à votre service en haute disponibilité. Cette adresse IP sera ajoutée comme adresse secondaire sur l&rsquo;interface réseau de votre choix. Pour configurer ce service, toujours dans <code>crm configure</code>, injectez la configuration suivante puis validez via la commande <code>commit</code> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">primitive VIP1 ocf:heartbeat:IPaddr2 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	  params <span class="nv">ip</span><span class="o">=</span><span class="s2">&#34;192.168.0.10&#34;</span> <span class="nv">broadcast</span><span class="o">=</span><span class="s2">&#34;192.168.0.255&#34;</span> <span class="nv">nic</span><span class="o">=</span><span class="s2">&#34;eth1&#34;</span> <span class="nv">cidr_netmask</span><span class="o">=</span><span class="s2">&#34;24&#34;</span> <span class="nv">iflabel</span><span class="o">=</span><span class="s2">&#34;VIP1&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	  op monitor <span class="nv">interval</span><span class="o">=</span><span class="s2">&#34;30s&#34;</span> <span class="nv">timeout</span><span class="o">=</span><span class="s2">&#34;20s&#34;</span>
</span></span></code></pre></div><p>Le détail de cette syntaxe :</p>
<ul>
<li>On commence avec <strong>primitive</strong> qui sert à déclarer une ressource. <strong>VIP1</strong> est le nom de votre ressource. <strong>ocf:heartbeat:IPaddr2</strong> est le script utilisé pour gérer cette ressource. Dans cette syntaxe on retrouve <strong>ocf</strong> pour le type de script : c&rsquo;est un script qui sait gérer le start/stop d&rsquo;une ressource comme avec un script <strong>lsb</strong>, mais il permet en plus et c&rsquo;est très utile, la supervision de la ressource via <strong>monitor</strong> (ou encore la promotion d&rsquo;une ressource dans le cadre d&rsquo;un cluster actif/actif&hellip;). Suit ensuite heartbeat le &ldquo;fournisseur&rdquo; du script puis le nom du script <em>IPaddr2</em>. Pour information, il existe également un script <em>IPaddr</em>. Je vous encourage à utiliser <em>IPaddr2</em> qui permet d&rsquo;utiliser des interfaces cachées ou encore, par exemple, de cloner une VIP (article à venir).</li>
<li>Toujours sur la même ligne, on a une liste de paramètres avec <strong>params</strong> qui définit l&rsquo;adresse IP de cette VIP. Déclarez votre VIP avec son adresse, son broadcast, son masque et l&rsquo;interface réseau sur laquelle sera rajoutée cette VIP. Le paramètre <strong>iflabel</strong> permet de donner un label à votre VIP. Sans ce label, la VIP n&rsquo;est pas visible avec la commande &ldquo;ifconfig&rdquo; mais seulement avec &ldquo;ip addr show&rdquo;.</li>
<li>Pour finir, <strong>op monitor</strong> défini un moniteur pour cette ressource : toutes les 30 secondes, Pacemaker va appeler le script ocf avec comme paramètre <em>monitor</em>. Avant le timeout de 20 secondes, on devra avoir un code retour à 0 pour que Pacemaker considère la ressource comme fonctionnelle. Dans le cas contraire, il arrêtera/relancera la ressource ou effectuera une bascule (idem si la fonction <em>monitor</em> n&rsquo;a pas répondu avant le timeout).</li>
</ul>
<p>Voici la sortie de <code>crm_mon -1</code> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Mon Oct <span class="m">24</span> 23:51:33 <span class="m">2011</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: ha-test1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">1</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> ha-test1 ha-test2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> VIP1	<span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>:	Started ha-test1
</span></span></code></pre></div><p>Une ressource configurée dans mon cluster qui fonctionne sur le noeud ha-test1. Je contrôle via <code>ifconfig</code> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">eth1:VIP1 Link encap:Ethernet  HWaddr 00:01:02:03:04:05
</span></span><span class="line"><span class="cl">          inet addr:192.168.0.10  Bcast:192.168.0.255  Mask:255.255.255.0
</span></span><span class="line"><span class="cl">          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
</span></span></code></pre></div><h1 id="apache">Apache</h1>
<p>Nous avons vu précédemment comment rajouter une adresse IP virtuelle pour accéder au service en haute disponibilité. Reste maintenant le service en question : Apache. De la même manière que nous avons défini la VIP, nous allons rajouter Apache :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">primitive APACHE ocf:heartbeat:apache <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	params <span class="nv">configfile</span><span class="o">=</span><span class="s2">&#34;/etc/apache2/apache2.conf&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	op monitor <span class="nv">interval</span><span class="o">=</span><span class="s2">&#34;30s&#34;</span> <span class="nv">timeout</span><span class="o">=</span><span class="s2">&#34;20s&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	op start <span class="nv">interval</span><span class="o">=</span><span class="s2">&#34;0&#34;</span> <span class="nv">timeout</span><span class="o">=</span><span class="s2">&#34;40s&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	op stop <span class="nv">interval</span><span class="o">=</span><span class="s2">&#34;0&#34;</span> <span class="nv">timeout</span><span class="o">=</span><span class="s2">&#34;60s&#34;</span>
</span></span></code></pre></div><p>Je ne reviens pas sur le détail complet de cette configuration. Comme pour la VIP, on définit la primitive APACHE avec pour paramètre le fichier de configuration d&rsquo;apache de la Debian. Pour information, pour connaître la liste complète des paramètres d&rsquo;une primitive, utilisez la commande <code>crm ra list ocf:heartbeat:apache</code>. Vous obtenez la liste des timeout par défaut, des paramètres et de leurs valeurs par défaut, les paramètres obligatoires et facultatifs&hellip; Par rapport à la configuration de la VIP, nous avons :</p>
<ul>
<li><strong>op start</strong> qui va définir le timeout par défaut pour la fonction start du script ocf.</li>
<li><strong>op stop</strong> pour la fonction stop du script ocf.</li>
</ul>
<!-- raw HTML omitted -->
<p>Vérifions l&rsquo;état du cluster suite à l&rsquo;ajout de cette nouvelle ressource :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Mon Oct <span class="m">24</span> 23:52:42 <span class="m">2011</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: ha-test1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">2</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> ha-test1 ha-test2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">VIP1    <span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>:       Started ha-test1
</span></span><span class="line"><span class="cl">APACHE  <span class="o">(</span>ocf::heartbeat:apache<span class="o">)</span>:        Started ha-test2
</span></span></code></pre></div><!-- raw HTML omitted -->
<h1 id="ajustements">Ajustements</h1>
<p>Quelques ajustements s&rsquo;imposent : il faut que l&rsquo;ensemble des ressources fonctionnent ensemble, sur le même noeud et en cas d&rsquo;échec sur l&rsquo;une des ressources (au 3ème échec), il faudra basculer sur l&rsquo;autre noeud. Il y a donc deux cas de bascule :</p>
<ul>
<li>Le noeud actif à une panne : les ressources sont basculées sur le noeud passif.</li>
<li>Une ressource échoue au delà de la valeur configurée, les ressources basculent. Si un problème est rencontré au moment du démarrage d&rsquo;une ressource, la bascule sur l&rsquo;autre noeud est immédiate.</li>
</ul>
<p>La configuration se passe toujours via <code>crm configure</code> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# group APACHE-HA VIP1 APACHE meta migration-threshold<span class="o">=</span><span class="s2">&#34;3&#34;</span>
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# commit
</span></span></code></pre></div><p>On utilise la syntaxe <strong>group</strong> pour grouper nos ressources VIP1 et APACHE sous le nom de groupe APACHE-HA. Au troisième échec d&rsquo;une des ressource de ce groupe, il y aura une bascule du cluster. Dans le cas contraire, la ressource en échec est relancée.</p>
<blockquote>
<p><strong>Attention à l&rsquo;ordre de vos ressources (primitives) dans le groupe !</strong>
Quand vous groupez vos ressources, vous indiquez que vous souhaitez les faire fonctionner ensemble, ce qui se traduit dans notre exemple par :</p>
<ul>
<li>APACHE doit fonctionner sur le même noeud que la VIP1.</li>
<li>APACHE a alors une <em>dépendance</em> à la ressource qui le précède : la VIP VIP1.</li>
<li>Si la VIP1 bascule, APACHE bascule. C&rsquo;est le fonctionnement recherché. Mais si la VIP1 ne fonctionne plus, elle sera arrêtée puis relancée impliquant l&rsquo;arrêt relance d&rsquo;APACHE qui dépend de cette VIP ! Idem si vous coupez volontairement cette ressource, APACHE ser&gt;a coupé.</li>
<li>On a le schéma de démarrage/relance des ressources suivant : START VIP -&gt; START APACHE et si problème sur la VIP : STOP APACHE -&gt; STOP VIP -&gt; START VIP -&gt; START APACHE. Si la ressource APACHE est relancée, pas d&rsquo;impact : APACHE n&rsquo;a pas de dépendance dans cette dé&gt;claration du groupe.</li>
<li>C&rsquo;est peu contraignant dans notre exemple à une seule VIP puisque APACHE écoute sur celle-ci : si la VIP ne fonctionne pas, inutile qu&rsquo;Apache fonctionne. Mais dès qu&rsquo;il y aura plusieurs VIPs, ce fonctionnement peut être problématique. En effet, dans le cas où nou&gt;s aurions le groupe suivant : group APACHE-HA VIP1 VIP2 APACHE, si on souhaite changer/couper/faire une intervention sur la VIP1, l&rsquo;arrêt de celle-ci engendrera l&rsquo;arrêt des ressources au-dessus : VIP2 et APACHE. Pour éviter ce comportement, il existe une autre solu&gt;tion à base de <!-- raw HTML omitted -->colocation/order<!-- raw HTML omitted --> (que nous verrons dans un prochain article). C&rsquo;est un détail du <em>group</em> à garder en tête !</li>
</ul>
</blockquote>
<p>On vérifie que le groupe est bien en place et que les ressources sont maintenant sur le même noeud :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Mon Oct <span class="m">24</span> 23:53:04 <span class="m">2011</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: ha-test1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">1</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> ha-test1 ha-test2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Resource Group: APACHE-HA
</span></span><span class="line"><span class="cl">     VIP1       <span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>:       Started ha-test2
</span></span><span class="line"><span class="cl">     APACHE     <span class="o">(</span>ocf::heartbeat:apache<span class="o">)</span>:        Started ha-test2
</span></span></code></pre></div><p>Pour désactiver l&rsquo;<strong>auto_failback</strong>, je donne un poids par défaut à mon noeud actif avec <em>default-resource-stickiness</em>. Le positionnement des ressources sur un noeud se fait en fonction du poids calculé pour chacun d&rsquo;entre eux. Vous pouvez par exemple privilégier un noeud en lui donnant un poids plus important qu&rsquo;un autre. Ainsi, les ressources auront pour &ldquo;préférence&rdquo; ce noeud. Dans cet exemple, il n&rsquo;y a pas de préférence sur un noeud, juste un poids de +10 attribué à l&rsquo;actif. Via <em>crm configure</em> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">property default-resource-stickiness<span class="o">=</span><span class="s2">&#34;10&#34;</span>
</span></span><span class="line"><span class="cl">commit
</span></span></code></pre></div><p>C&rsquo;est prêt. Il reste maintenant à valider par des tests, des tests, des tests&hellip;</p>
<h1 id="les-tests">Les tests</h1>
<h2 id="arrêt-dun-noeud">Arrêt d&rsquo;un noeud</h2>
<p>Le premier test que je réalise est l&rsquo;arrêt du noeud actif. Rien de tel qu&rsquo;un arrêt électrique pour vérifier le comportement du cluster. Avant la coupure, tout va bien comme le confirme la commande <code>crm_mon -1</code> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Tue Oct <span class="m">25</span> 22:29:29 <span class="m">2011</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: ha-test1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">1</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> ha-test1 ha-test2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Resource Group: APACHE-HA
</span></span><span class="line"><span class="cl">     VIP1       <span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>:       Started ha-test2
</span></span><span class="line"><span class="cl">     APACHE     <span class="o">(</span>ocf::heartbeat:apache<span class="o">)</span>:        Started ha-test2
</span></span></code></pre></div><p>Mes deux noeuds sont &ldquo;online&rdquo; et mes ressources fonctionnent sur ha-test2. Je coupe ha-test2 électriquement :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Wed Oct <span class="m">26</span> 22:58:59 <span class="m">2011</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: ha-test1 - partition WITHOUT quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">1</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> ha-test1 <span class="o">]</span>
</span></span><span class="line"><span class="cl">OFFLINE: <span class="o">[</span> ha-test2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Resource Group: APACHE-HA
</span></span><span class="line"><span class="cl">     VIP1       <span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>:       Started ha-test1
</span></span><span class="line"><span class="cl">     APACHE     <span class="o">(</span>ocf::heartbeat:apache<span class="o">)</span>:        Started ha-test1
</span></span></code></pre></div><p>On remarquera au passage le <strong>partition WITHOUT quorum</strong>. Si le quorum n&rsquo;était pas ignoré, le cluster n&rsquo;aurait pas basculé ! Quand le serveur est rallumé, il réintègre le cluster automatiquement. Comme l&rsquo;auto_failback est désactivé, il n&rsquo;y a pas de bascule, on reste dans cet état :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Wed Oct <span class="m">26</span> 23:00:20 <span class="m">2011</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: ha-test1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">1</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> ha-test1 ha-test2 <span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Resource Group: APACHE-HA
</span></span><span class="line"><span class="cl">     VIP1       <span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>:       Started ha-test1
</span></span><span class="line"><span class="cl">     APACHE     <span class="o">(</span>ocf::heartbeat:apache<span class="o">)</span>:        Started ha-test1
</span></span></code></pre></div><h2 id="arrêt-dune-ressource">Arrêt d&rsquo;une ressource</h2>
<p>Dans l&rsquo;exemple qui suit, j&rsquo;arrête apache. Le fonctionnement demandé est de relancer la ressource 2 fois et de basculer sur l&rsquo;autre noeud au 3ème échec. Pour suivre le comportement de Pacemaker, j&rsquo;ai fait la capture suivante. Pour ce test, j&rsquo;ai volontairement réduit l’intervalle du moniteur d&rsquo;Apache à 5 secondes. J&rsquo;envoie ensuite 3 <code>killall apache2</code> sur le noeud actif pour vérifier que le cluster fonctionne correctement. On pourra observer par exemple la ligne <em>APACHE: migration-threshold=3 fail-count=3</em> avec la valeur de <em>fail-count</em> qui sera incrémenté à chaque relance de la ressource par Pacemaker.
<img loading="lazy" src="/img/pacemaker/killall_apache2.gif" type="" alt="killall_apache2"  /></p>
<!-- raw HTML omitted -->
<p><strong>Résultat d&rsquo;un crm resource cleanup APACHE-HA :</strong></p>
<p><img loading="lazy" src="/img/pacemaker/crm_resource_cleanup.gif" type="" alt="crm_resource_cleanup"  /></p>
<h2 id="mettre-un-noeud-en-standby">Mettre un noeud en standby</h2>
<p>Il peut être utile, pour de la maintenance par exemple, de mettre un noeud en standby. Sur l&rsquo;exemple qui suit, je fais un <code>crm node standby ha-test2</code>, le noeud actif de mon cluster. Dans ce cas, le cluster bascule sur l&rsquo;autre noeud.</p>
<p><strong>Résultat d&rsquo;un crm node standby ha-test2 :</strong></p>
<p><img loading="lazy" src="/img/pacemaker/crm_node_standby.gif" type="" alt="crm_node_standby"  /></p>
<h1 id="conclusion--liens">Conclusion / Liens</h1>
<blockquote>
<p>Nous avons vu le cas d&rsquo;un cluster simple actif/passif. Il est possible de monter des clusters plus compliqués à plus de 2 noeuds, en mode actif/actif, avec des conditions sur les ressources (ma ressource doit fonctionner, par exemple, que les jours ouvrés). Idem pour les fonctions de <em>crm</em>. Il existe d&rsquo;autres possibilités pour migrer les ressources, gérer le <em>fail-count</em> et le cluster en lui-même. A suivre&hellip;</p>
</blockquote>
<p><strong>Pour la documentation sur Pacemaker :</strong></p>
<ul>
<li><a href="http://www.clusterlabs.org">Le site de Pacemaker</a></li>
<li><a href="http://www.clusterlabs.org/doc/">La documentation</a></li>
<li><a href="http://theclusterguy.clusterlabs.org/">Le blog</a></li>
</ul>]]></content:encoded>
    </item>
    
    <item>
      <title>Des clusters avec Pacemaker</title>
      <link>https://binbash.fr/posts/des-clusters-avec-pacemaker/</link>
      <pubDate>Mon, 19 Sep 2011 00:00:00 +0000</pubDate>
      
      <guid>https://binbash.fr/posts/des-clusters-avec-pacemaker/</guid>
      <description>&lt;p&gt;Pacemaker est un outil de gestion de ressources (une VIP, un service) pour vos clusters. Il va gérer la haute disponibilité en s&amp;rsquo;occupant de leur démarrage, redémarrage, arrêt. La communication entre vos nœuds et la gestion du cluster en lui-même seront assurées par une brique dédiée comme par exemple Corosync (ou une technologie plus ancienne mais dont le nom est plus connu : heartbeat). Grâce à ce couple, il est possible de monter rapidement des clusters à n nœuds et de gérer n&amp;rsquo;importe lequel de vos services. La seule &amp;ldquo;contrainte&amp;rdquo; est d&amp;rsquo;avoir un script pour lancer votre service qui doit répondre à une commande start, stop et status. Une autre possibilité sympathique : le mode actif/actif. Mais aussi la gestion des quorums, le stonith&amp;hellip;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Pacemaker est un outil de gestion de ressources (une VIP, un service) pour vos clusters. Il va gérer la haute disponibilité en s&rsquo;occupant de leur démarrage, redémarrage, arrêt. La communication entre vos nœuds et la gestion du cluster en lui-même seront assurées par une brique dédiée comme par exemple Corosync (ou une technologie plus ancienne mais dont le nom est plus connu : heartbeat). Grâce à ce couple, il est possible de monter rapidement des clusters à n nœuds et de gérer n&rsquo;importe lequel de vos services. La seule &ldquo;contrainte&rdquo; est d&rsquo;avoir un script pour lancer votre service qui doit répondre à une commande start, stop et status. Une autre possibilité sympathique : le mode actif/actif. Mais aussi la gestion des quorums, le stonith&hellip;</p>
<p><img loading="lazy" src="/img/pacemaker/Pacemaker-active-passive.png" type="" alt=""  /></p>
<p><img loading="lazy" src="/img/pacemaker/Pacemaker-n-plus-1.png" type="" alt=""  /></p>
<p><img loading="lazy" src="/img/pacemaker/Pacemaker-n-to-n.png" type="" alt=""  /></p>
<h1 id="problèmes-rencontrés--rappels">Problèmes rencontrés : rappels</h1>
<p>Il faut bien garder en tête que ce n&rsquo;est pas parce que le service A ou B est dans un cluster qu&rsquo;il n&rsquo;y aura plus jamais de problème. Un cluster, de par son concept, peut se retrouver confronté à un problème de taille : le &ldquo;split-brain&rdquo;. C&rsquo;est le principal problème qu&rsquo;il faut absolument éviter.</p>
<ul>
<li><strong>Le &ldquo;split-brain&rdquo;</strong> peut intervenir quand chaque nœud de votre cluster croit son voisin hors service. Il va alors prendre la main : chaque nœud est donc maître et fournit le service. Les effets de bords peuvent être gênants dès lors qu&rsquo;on utilise une ressource partagée.
Pour se protéger un maximum de ce problème, il est fortement recommandé d&rsquo;utiliser deux liens réseau différents pour la communication entre les nœuds (ou de faire du bonding).</li>
<li>Un autre problème possible : quand votre nœud maître rencontre un problème, le cluster &ldquo;bascule&rdquo; . Un autre nœud prend la main et devient maître à son tour : il fournit le service. Mais dans quel état est l&rsquo;autre nœud ? Comment s&rsquo;assurer qu&rsquo;il ne fournit pas encore le service au risque de bloquer/corrompre des ressources partagées ? Il n&rsquo;y a pas vraiment de réponse à ce problème mais une solution, pas forcement évidente à mettre en place : <strong>Stonith</strong>.
<strong>Stonith</strong> ou &ldquo;Shoot The Other Node In The Head&rdquo; ou encore &ldquo;Shoot The Offending Node In The Head&rdquo;. C&rsquo;est une méthode d&rsquo;isolation d&rsquo;un nœud (fencing) qui pour une raison ou une autre ne répond plus. L&rsquo;idée est d&rsquo;éviter à tout prix le fameux split-brain qui peut amener tous vos nœuds à fournir le même service (ou à ne plus le fournir du tout). Le nœud jugé hors service sera donc, en général, redémarré ou arrêté électriquement (via IPMI par exemple). Voir l&rsquo;article suivant pour plus d&rsquo;informations : <a href="http://ourobengr.com/ha">STONITH Deathmatch Explained</a>.</li>
<li>Pour finir, un autre point bloquant peut être <strong>le quorum :</strong> c&rsquo;est le nombre minimum de nœuds en ligne pour être capable de valider une décision. Dans le cas d&rsquo;un cluster avec Pacemaker, il faut que plus de la moitié des nœuds soit en ligne. Avec un cluster à deux nœuds, il n&rsquo;y a plus de quorum dès qu&rsquo;un nœud est perdu. Il va donc falloir demander à Pacemaker d&rsquo;ignorer le quorum dans cette situation. Le fonctionnement par défaut quand le quorum n&rsquo;est pas atteint est de couper toutes les ressources !</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>Si vous utilisez des ressources partagées, utilisez Stonith. Si vous le pouvez, utilisez systématiquement Stonith.</p>
</li>
<li>
<p>Ignorez la perte du quorum si vous n&rsquo;en avez pas besoin.</p>
</li>
</ul>
<!-- raw HTML omitted -->
<h1 id="corosync-et-pacemaker">Corosync et Pacemaker</h1>
<h2 id="installation">Installation</h2>
<p>Nous allons voir ici l&rsquo;installation et la configuration de Corosync. Corosync va s&rsquo;occuper de la mise en cluster de vos serveurs. Corosync est disponible dans de nombreuses distributions. Sur une Debian Squeeze, il s&rsquo;installe via :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt-get install corosync
</span></span></code></pre></div><p>Maintenant que la couche de communication entre les nœuds est installée, passons à l&rsquo;installation de la couche de gestion des ressources. Pacemaker a été intégré dans le projet Debian depuis la Squeeze. Le paquet est également disponible sur d&rsquo;autres distributions. Pour l&rsquo;installer sur une Debian Squeeze :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt-get install pacemaker
</span></span></code></pre></div><h2 id="configuration-de-corosync">Configuration de Corosync</h2>
<p>Editer le fichier de configuration de Corosync : <em>/etc/corosync/corosync.conf</em> (<strong>ce fichier doit être le même sur l&rsquo;ensemble de vos noeuds</strong>). L&rsquo;idée est d&rsquo;augmenter un peu certains timers qui sont un petit peu bas (risque de déclarer un nœud hors service à tort par exemple) :</p>
<table>
<thead>
<tr>
<th>paramètre</th>
<th>valeur</th>
</tr>
</thead>
<tbody>
<tr>
<td>token</td>
<td>5000</td>
</tr>
<tr>
<td>token_retransmits_before_loss_const</td>
<td>20</td>
</tr>
<tr>
<td>join</td>
<td>1000</td>
</tr>
<tr>
<td>consensus</td>
<td>7500</td>
</tr>
<tr>
<td>max_messages</td>
<td>20</td>
</tr>
<tr>
<td>secauth</td>
<td>on # On utilise une clé pour autoriser un nœud à se connecter au cluster.</td>
</tr>
</tbody>
</table>
<p>Il faut maintenant déclarer une interface réseau qui servira à la communication entre vos nœuds. Si vous ne faites pas de bonding, il faudra en déclarer une seconde pour éviter un &ldquo;split-brain&rdquo;.</p>
<p><strong>Pour déclarer une interface réseau :</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">interface <span class="o">{</span>
</span></span><span class="line"><span class="cl">ringnumber: <span class="m">0</span>
</span></span><span class="line"><span class="cl">bindnetaddr: 10.0.0.0
</span></span><span class="line"><span class="cl">mcastaddr: 226.94.1.1
</span></span><span class="line"><span class="cl">mcastport: <span class="m">5405</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><p><strong>Il vous faudra remplacer/rajouter :</strong></p>
<ul>
<li>Votre adresse de réseau au niveau de <em>bindnetaddr</em>. Si par exemple, votre eth0 porte l&rsquo;adresse IP 192.168.1.10 avec un netmask de 24, renseignez 192.168.1.0.</li>
<li>Votre adresse de diffusion multicast et son port (ou utiliser celle là).</li>
<li>Pour rajouter une deuxième interface, rajoutez un deuxième bloc &ldquo;interface&rdquo;, incrémentez le &ldquo;ringnumber&rdquo; et renseignez l&rsquo;adresse de votre deuxième réseau ainsi qu&rsquo;une nouvelle adresse de multicast. Il faudra changer le &ldquo;rrp_mode&rdquo; à <em>active</em> : vos deux interfaces réseau fonctionneront en même temps. Si vous mettez le &ldquo;rrp_mode&rdquo; à <em>passive</em>, la deuxième interface réseau ne s&rsquo;activera que si la première est en échec.</li>
</ul>
<p><strong>Exemple :</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">rrp_mode: active
</span></span><span class="line"><span class="cl">interface <span class="o">{</span>
</span></span><span class="line"><span class="cl">  ringnumber: <span class="m">0</span>
</span></span><span class="line"><span class="cl">  bindnetaddr: 10.0.0.0
</span></span><span class="line"><span class="cl">  mcastaddr: 226.94.1.1
</span></span><span class="line"><span class="cl">  mcastport: <span class="m">5405</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">interface <span class="o">{</span>
</span></span><span class="line"><span class="cl">  ringnumber: <span class="m">1</span>
</span></span><span class="line"><span class="cl">  bindnetaddr: 192.168.0.0
</span></span><span class="line"><span class="cl">  mcastaddr: 226.94.2.1
</span></span><span class="line"><span class="cl">  mcastport: <span class="m">5405</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><p>A savoir : si une de ces interfaces est en erreur, on a un message d&rsquo;erreur dans les logs :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">[</span>TOTEM <span class="o">]</span> Marking seqid <span class="m">3608</span> ringid <span class="m">1</span> interface 192.168.0.2 FAULTY
</span></span><span class="line"><span class="cl">administrative intervention required.
</span></span></code></pre></div><p>Il peut arriver de devoir remonter l&rsquo;interface manuellement quand le problème est résolu via <em>corosync-cfgtool -r</em> (c&rsquo;est le cas si on a désactivé manuellement l&rsquo;interface). <em>corosync-cfgtool -s</em> vous donne l&rsquo;état de vos interfaces.</p>
<!-- raw HTML omitted -->
<h2 id="intégration-de-pacemaker">Intégration de Pacemaker</h2>
<p>Il faut maintenant rajouter le service Pacemaker dans votre cluster Corosync. Rajoutez le bloc suivant dans votre fichier de configuration Corosync s&rsquo;il n&rsquo;a pas été rajouté à l&rsquo;installation de Pacemaker :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">service <span class="o">{</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Load the Pacemaker Cluster Resource Manager</span>
</span></span><span class="line"><span class="cl">ver: <span class="m">0</span>
</span></span><span class="line"><span class="cl">name: pacemaker
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><h2 id="authentification">Authentification</h2>
<ul>
<li>A l&rsquo;installation du paquet, une clé a été générée pour authentifier votre nœud sur le cluster. Si vous souhaitez la recréer :</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">corosync-keygen
</span></span></code></pre></div><ul>
<li>Il faut ensuite envoyer la clé sur les nœuds qui composent votre cluster :</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">scp /etc/corosync/authkey root@mon_autre_nœud:/etc/corosync
</span></span></code></pre></div><p>La configuration du cluster est terminée. Activez le démarrage de corosync dans le fichier <em>/etc/default/corosync</em>. Il se démarre ensuite via <code>/etc/init.d/corosync start</code>. Nous verrons plus bas pour la configuration de Pacemaker.</p>
<h1 id="crm_mon">crm_mon</h1>
<p>Votre cluster est démarré : vous pouvez vous connecter au moniteur de Pacemaker via la commande <code>crm_mon -1</code>. Vous obtiendrez quelque chose de semblable :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">Last updated: Fri Sep  <span class="m">9</span> 23:38:26 <span class="m">2011</span>
</span></span><span class="line"><span class="cl">Stack: openais
</span></span><span class="line"><span class="cl">Current DC: ha-test1 - partition with quorum
</span></span><span class="line"><span class="cl">Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
</span></span><span class="line"><span class="cl"><span class="m">2</span> Nodes configured, <span class="m">2</span> expected votes
</span></span><span class="line"><span class="cl"><span class="m">0</span> Resources configured.
</span></span><span class="line"><span class="cl"><span class="o">============</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Online: <span class="o">[</span> ha-test1 ha-test2 <span class="o">]</span>
</span></span></code></pre></div><p>Cet utilitaire remonte un certain nombre d&rsquo;informations sur l&rsquo;état général de votre cluster (nœuds ok, hs, offline ou en standby) mais aussi sur l&rsquo;état de vos ressources (quel nœud gère quelle ressource, les éventuels problèmes rencontrés lors du lancement ou du monitoring de vos ressources&hellip;). Dans cet exemple, on peut lire :</p>
<ul>
<li><strong>Last updated et stack :</strong> la dernière mise à jour des informations du moniteur et la couche de message utilisée. Openais car Corosync est dérivé d&rsquo;Openais.</li>
<li><strong>Current DC :</strong> c&rsquo;est le nœud qui va coordonner les actions sur le cluster. Les autres nœuds remonteront leurs informations au nœud DC. Ce nœud n&rsquo;est pas nécessairement le nœud &ldquo;maître&rdquo; de votre cluster.</li>
<li><strong>Nodes &amp; votes :</strong> le nombre de nœuds et le nombre de votes disponibles pour le quorum.</li>
<li><strong>Resources configured :</strong> le nombre de ressources configurées dans votre cluster.</li>
<li><strong>Online :</strong> la liste des nœuds online. On pourra trouver ici, la liste des nœuds offline ou en stand-by.</li>
</ul>
<h1 id="configuration-de-pacemaker">Configuration de Pacemaker</h1>
<p>Avant de déclarer vos ressources, il faut configurer Pacemaker pour décrire le fonctionnement attendu de votre cluster : action en cas de perte du quorum, utilisation de stonith&hellip; Ce sont les deux points que nous allons voir dans l&rsquo;exemple qui suit.</p>
<p>Pour configurer votre cluster, nous allons nous connecter au cli Pacemaker (sur le nœud de votre choix) via la commande <code>crm</code> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">root@ha-test2:~# crm
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span><span class="c1"># help</span>
</span></span><span class="line"><span class="cl">This is the CRM <span class="nb">command</span> line interface program.
</span></span><span class="line"><span class="cl">Available commands:
</span></span><span class="line"><span class="cl">	cib              manage shadow CIBs
</span></span><span class="line"><span class="cl">	resource         resources management
</span></span><span class="line"><span class="cl">	node             nodes management
</span></span><span class="line"><span class="cl">	options          user preferences
</span></span><span class="line"><span class="cl">	configure        CRM cluster configuration
</span></span><span class="line"><span class="cl">	ra               resource agents information center
</span></span><span class="line"><span class="cl">	status           show cluster status
</span></span><span class="line"><span class="cl">	quit,bye,exit    <span class="nb">exit</span> the program
</span></span><span class="line"><span class="cl">	<span class="nb">help</span>             show <span class="nb">help</span>
</span></span><span class="line"><span class="cl">	end,cd,up        go back one level
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span><span class="c1">#</span>
</span></span></code></pre></div><p>L&rsquo;aide via <em>help</em> est disponible pour chaque commande. Passez dans le menu <em>configure</em> et tapez <em>show</em>. C&rsquo;est votre configuration par défaut.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# show
</span></span><span class="line"><span class="cl">node ha-test1
</span></span><span class="line"><span class="cl">node ha-test2
</span></span></code></pre></div><p>La liste de vos nœuds est affichée. Une commande <em>edit</em> permet d&rsquo;éditer ce fichier. On peut aussi utiliser un certain nombre de commandes (voir <em>help</em>) pour modifier le comportement du cluster. On va ici désactiver le stonith et ignorer la perte du quorum : dans votre cli <em>crm</em>, en mode <em>configure</em>, tapez la commande suivante :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">property stonith-enabled<span class="o">=</span><span class="s2">&#34;false&#34;</span> no-quorum-policy<span class="o">=</span><span class="s2">&#34;ignore&#34;</span>
</span></span></code></pre></div><ul>
<li>Vérifiez avec <em>show</em> que la configuration est ok.</li>
<li>Il faut ensuite pousser les modifications sur l&rsquo;ensemble des nœuds via la commande <em>commit</em>.</li>
</ul>
<p><strong>Pour résumer :</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# property stonith-enabled<span class="o">=</span><span class="s2">&#34;false&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	 no-quorum-policy<span class="o">=</span><span class="s2">&#34;ignore&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# show
</span></span><span class="line"><span class="cl">node ha-test1
</span></span><span class="line"><span class="cl">node ha-test2
</span></span><span class="line"><span class="cl">property <span class="nv">$id</span><span class="o">=</span><span class="s2">&#34;cib-bootstrap-options&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	stonith-enabled<span class="o">=</span><span class="s2">&#34;false&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>	no-quorum-policy<span class="o">=</span><span class="s2">&#34;ignore&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">crm<span class="o">(</span>live<span class="o">)</span>configure# commit
</span></span><span class="line"><span class="cl">WARNING: CIB changed in the meantime: won<span class="err">&#39;</span>t touch it!
</span></span><span class="line"><span class="cl">Do you still want to commit? y
</span></span></code></pre></div><p>Vous pouvez ignorer le WARNING au moment du commit. Votre cluster est maintenant prêt à recevoir les ressources : Apache, MySQL, DRBD, des VIPs&hellip; A suivre dans une série d&rsquo;articles autour de Pacemaker.</p>
<p>Plus d&rsquo;informations sur <a href="http://www.clusterlabs.org/">ClusterLabs</a></p>]]></content:encoded>
    </item>
    
  </channel>
</rss>
