<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mia mamma usa Linux! &#187; Clustering</title>
	<atom:link href="http://www.miamammausalinux.org/category/clustering/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.miamammausalinux.org</link>
	<description>Perché niente è impossibile da capire... Se lo spieghi bene !</description>
	<lastBuildDate>Mon, 02 Jan 2012 11:31:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Seminario &#8220;Evoluzione dell&#8217;alta affidabilita&#8217; su Linux&#8221;: video tre e quattro di sei &#8211; &#8220;Heartbeat/Corosync&#8221; e &#8220;DRBD&#8221;</title>
		<link>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-tre-e-quattro-di-sei-heartbeatcorosync-e-drbd/</link>
		<comments>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-tre-e-quattro-di-sei-heartbeatcorosync-e-drbd/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 09:34:08 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[DRBD]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Seminari]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[OpenAIS]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1429</guid>
		<description><![CDATA[Ecco presentate le parti centrali del seminario di miamammausalinux.org, intitolato &#8220;Evoluzione dell&#8217;alta affidabilita&#8217; su Linux&#8221; che si è svolto nella giornata del 24 giugno 2011, presso l&#8217;hotel Holiday Inn di Rho. La terza parte introduce Heartbeat e Corosync, mentre nella quarta si approfondisce l&#8217;argomento DRBD. Parte tre di sei &#8211; Heartbeat e Corosync: *Video: evoluzione [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2008/11/miamammausalinux_avatar.png" alt="" title="miamammausalinux" width="124" height="125" class="alignnone size-full wp-image-761" /></p>
<p>Ecco presentate le parti centrali del seminario di <em>miamammausalinux.org</em>, intitolato &#8220;<strong>Evoluzione dell&#8217;alta affidabilita&#8217; su Linux</strong>&#8221; che si è svolto nella giornata del 24 giugno 2011, presso l&#8217;hotel Holiday Inn di Rho.</p>
<p>La terza parte introduce Heartbeat e Corosync, mentre nella quarta si approfondisce l&#8217;argomento DRBD.</p>
<p>Parte tre di sei &#8211; Heartbeat e Corosync:</p>
<p><script type='text/javascript' src='http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/html/flashembed.min.js'></script>
<div >
<div id='hana_flv_flow_1'>*Video:evoluzione dell'alta affidabilita' su linux &#8211; 3 di 6 &#8211; heartbeat e corosync</div>
</div>

<script type='text/javascript'>
    flashembed('hana_flv_flow_1',
      { src:'http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/FlowPlayerDark.swf', wmode: 'transparent', width: 342,  height: 192 },
      { config: { videoFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%203%20di%206%20-%20Heartbeat%20e%20Corosync.flv', autoPlay: false ,loop: false, autoRewind: false, autoBuffering: false,
			splashImageFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%203%20di%206%20-%20Heartbeat%20e%20Corosync.jpg', initialScale: 'scale' 

	    }}
    );
</script></p>
<p>Parte quattro di sei &#8211; DRBD:</p>
<p>
<div >
<div id='hana_flv_flow_2'>*Video:evoluzione dell'alta affidabilita' su linux &#8211; 4 di 6 &#8211; drbd</div>
</div>

<script type='text/javascript'>
    flashembed('hana_flv_flow_2',
      { src:'http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/FlowPlayerDark.swf', wmode: 'transparent', width: 342,  height: 192 },
      { config: { videoFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%204%20di%206%20-%20DRBD.flv', autoPlay: false ,loop: false, autoRewind: false, autoBuffering: false,
			splashImageFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%204%20di%206%20-%20DRBD.jpg', initialScale: 'scale' 

	    }}
    );
</script></p>
<p>Serie completa:</p>
<ul>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-uno-e-due-di-sei-introduzione-e-cluster/" title="Prima parte">video uno e due di sei – “Introduzione” e “Cluster”</a>
</li>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-tre-e-quattro-di-sei-heartbeatcorosync-e-drbd/" title="Seconda parte">video tre e quattro di sei – “Heartbeat/Corosync” e “DRBD”</a>
</li>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/08/seminario-evoluzione-dellalta-affidabilita-su-linux-video-cinque-e-sei-di-sei-il-progetto/" title="Terza parte">video cinque e sei di sei – “Il Progetto”</a>
</li>
</ul>
<p><em>Un ringraziamento particolare a <strong>Lorenzo</strong>, per il preziosissimo supporto video che ci ha permesso di condividere l&#8217;evento con quanti non sono riusciti a partecipare.</em></p>
<p><strong>Buona visione!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-tre-e-quattro-di-sei-heartbeatcorosync-e-drbd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%203%20di%206%20-%20Heartbeat%20e%20Corosync.flv" length="286582745" type="video/x-flv" />
<enclosure url="http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%204%20di%206%20-%20DRBD.flv" length="220475208" type="video/x-flv" />
		</item>
		<item>
		<title>Seminario &#8220;Evoluzione dell&#8217;alta affidabilita&#8217; su Linux&#8221;: video uno e due di sei &#8211; &#8220;Introduzione&#8221; e &#8220;Cluster&#8221;</title>
		<link>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-uno-e-due-di-sei-introduzione-e-cluster/</link>
		<comments>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-uno-e-due-di-sei-introduzione-e-cluster/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 09:58:33 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[DRBD]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Seminari]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[OpenAIS]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1400</guid>
		<description><![CDATA[Nella giornata del 24 giugno 2011, presso l&#8217;hotel Holiday Inn di Rho si è svolto il primo seminario di miamammausalinux.org, intitolato &#8220;Evoluzione dell&#8217;alta affidabilita&#8217; su Linux&#8220;. Viste le numerose richieste ricevute e rispettando sempre la filosofia alla base del progetto miamammausalinux.org, il video del seminario viene proposto integralmente nelle sue sei parti, insieme alla documentazione [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2008/11/miamammausalinux_avatar.png" alt="" title="miamammausalinux" width="124" height="125" class="alignnone size-full wp-image-761" /></p>
<p>Nella giornata del 24 giugno 2011, presso l&#8217;hotel Holiday Inn di Rho si è svolto il primo seminario di <em>miamammausalinux.org</em>, intitolato &#8220;<strong>Evoluzione dell&#8217;alta affidabilita&#8217; su Linux</strong>&#8220;.</p>
<p>Viste le numerose richieste ricevute e rispettando sempre la filosofia alla base del progetto <strong>miamammausalinux.org</strong>, il video del seminario viene proposto integralmente nelle sue sei parti, insieme alla documentazione fornita ai partecipanti.</p>
<p>Ecco le prime due parti.</p>
<p>Parte uno di sei &#8211; Introduzione:</p>
<p>
<div >
<div id='hana_flv_flow_3'>*Video:evoluzione dell'alta affidabilita' su linux &#8211; 1 di 6 &#8211; introduzione</div>
</div>

<script type='text/javascript'>
    flashembed('hana_flv_flow_3',
      { src:'http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/FlowPlayerDark.swf', wmode: 'transparent', width: 342,  height: 192 },
      { config: { videoFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%201%20di%206%20-%20Introduzione.flv', autoPlay: false ,loop: false, autoRewind: false, autoBuffering: false,
			splashImageFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%201%20di%206%20-%20Introduzione.jpg', initialScale: 'scale' 

	    }}
    );
</script></p>
<p>Parte due di sei &#8211; Cluster:</p>
<p>
<div >
<div id='hana_flv_flow_4'>*Video:evoluzione dell'alta affidabilita' su linux &#8211; 1 di 6 &#8211; cluster</div>
</div>

<script type='text/javascript'>
    flashembed('hana_flv_flow_4',
      { src:'http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/FlowPlayerDark.swf', wmode: 'transparent', width: 342,  height: 192 },
      { config: { videoFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%202%20di%206%20-%20Cluster.flv', autoPlay: false ,loop: false, autoRewind: false, autoBuffering: false,
			splashImageFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%202%20di%206%20-%20Cluster.jpg', initialScale: 'scale' 

	    }}
    );
</script></p>
<p>Ed ecco il link alla documentazione:</p>
<div id="attachment_1420" class="wp-caption alignnone" style="width: 210px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2011/07/Evoluzione-dellalta-affidabilita-su-Linux-Libretti.pdf"><img src="http://www.miamammausalinux.org/wp-content/uploads/2011/07/Evoluzione-dellalta-affidabilita-su-Linux-Copertina.png" alt="Evoluzione dell&#039;alta affidabilita&#039; su Linux - Documentazione" title="Evoluzione dell&#039;alta affidabilita&#039; su Linux - Documentazione" width="200" height="150" class="size-full wp-image-1420" /></a><p class="wp-caption-text">Evoluzione dell&#039;alta affidabilita&#039; su Linux - Documentazione</p></div>
<p>Serie completa:</p>
<ul>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-uno-e-due-di-sei-introduzione-e-cluster/" title="Prima parte">video uno e due di sei – “Introduzione” e “Cluster”</a>
</li>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-tre-e-quattro-di-sei-heartbeatcorosync-e-drbd/" title="Seconda parte">video tre e quattro di sei – “Heartbeat/Corosync” e “DRBD”</a>
</li>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/08/seminario-evoluzione-dellalta-affidabilita-su-linux-video-cinque-e-sei-di-sei-il-progetto/" title="Terza parte">video cinque e sei di sei – “Il Progetto”</a>
</li>
</ul>
<p><em>Un ringraziamento particolare a <strong>Lorenzo</strong>, per il preziosissimo supporto video che ci ha permesso di condividere l&#8217;evento con quanti non sono riusciti a partecipare.</em></p>
<p><strong>Buona visione!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-uno-e-due-di-sei-introduzione-e-cluster/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
<enclosure url="http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%201%20di%206%20-%20Introduzione.flv" length="49884991" type="video/x-flv" />
<enclosure url="http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%202%20di%206%20-%20Cluster.flv" length="124588471" type="video/x-flv" />
		</item>
		<item>
		<title>I seminari di Mia Mamma Usa Linux: evoluzione dell&#8217;alta affidabilità su Linux</title>
		<link>http://www.miamammausalinux.org/2011/05/i-seminari-di-mia-mamma-usa-linux-evoluzione-dellalta-affidabilita-su-linux/</link>
		<comments>http://www.miamammausalinux.org/2011/05/i-seminari-di-mia-mamma-usa-linux-evoluzione-dellalta-affidabilita-su-linux/#comments</comments>
		<pubDate>Mon, 16 May 2011 10:36:50 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[DRBD]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Seminari]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[OpenAIS]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1341</guid>
		<description><![CDATA[MMUL e Linbit, nell&#8217;ambito del progetto &#8220;I seminari di Mia Mamma Usa Linux&#8220;, sono liete di invitarvi all&#8217;evento gratuito: Evoluzione dell&#8217;alta affidabilità su Linux Venerdì 24 Giugno 2011 9:00 &#8211; 17:30 HOLIDAY INN MILAN RHO FAIR Via Alessandro Volta, snc 20017 Rho Milano &#8211; Italy Evoluzione dell&#039;alta affidabilita&#039; su Linux Un seminario gratuito, che nel [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mmul.it">MMUL</a> e <a href="http://www.linbit.com">Linbit</a>, nell&#8217;ambito del progetto &#8220;<em>I seminari di Mia Mamma Usa Linux</em>&#8220;, sono liete di invitarvi all&#8217;evento gratuito:</p>
<p><strong>Evoluzione dell&#8217;alta affidabilità su Linux</strong><br />
<strong><em>Venerdì 24 Giugno 2011</em></strong><br />
<strong><em>9:00 &#8211; 17:30</em></strong><br />
<em>HOLIDAY INN MILAN RHO FAIR<br />
Via Alessandro Volta, snc<br />
20017 Rho Milano &#8211; Italy</em></p>
<div id="attachment_1355" class="wp-caption alignnone" style="width: 590px"><a href="http://www.miamammausalinux.org/2011/05/i-seminari-di-mia-mamma-usa-linux-evoluzione-dellalta-affidabilita-su-linux/"><img src="http://www.miamammausalinux.org/wp-content/uploads/2011/05/MMUL-Evoluzione-dellalta-affidabilita-su-Linux-Locandina.png" alt="Evoluzione dell&#039;alta affidabilita&#039; su Linux" title="MMUL - Evoluzione dell&#039;alta affidabilita&#039; su Linux - Locandina" width="580" height="823" class="size-full wp-image-1355" /></a><p class="wp-caption-text">Evoluzione dell&#039;alta affidabilita&#039; su Linux</p></div>
<p>Un seminario gratuito, che nel corso di una giornata tratterà di <em>Linux</em>, <em>Opensource</em> ed <em>alta affidabilità</em>, affrontando nel dettaglio argomenti quali <em>Heartbeat</em>, <em>Corosync</em> e <em>DRBD</em> per arrivare ad implementare nel laboratorio una soluzione <em>NFS active-active</em> completamente operativa.</p>
<p><strong>L&#8217;evento è <strong>completamente gratuito</strong> e comprende il pranzo offerto da MMUL. I posti sono limitati a venti.</strong></p>
<p>Per iscriversi, compilare il seguente form:</p>
The event have ended - no more registrations are allowed.
<p>Per qualsiasi informazione, chiarimento o problema tecnico, scrivete una mail a <a href="mailto:info@miamammausalinux.org">info@miamammausalinux.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/05/i-seminari-di-mia-mamma-usa-linux-evoluzione-dellalta-affidabilita-su-linux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Evoluzione dell&#8217;alta affidabilità su Linux: creare un cluster Tomcat utilizzando la soluzione nativa, Heartbeat e Pacemaker</title>
		<link>http://www.miamammausalinux.org/2011/01/evoluzione-dellalta-affidabilita-su-linux-creare-un-cluster-tomcat-utilizzando-la-soluzione-nativa-heartbeat-e-pacemaker/</link>
		<comments>http://www.miamammausalinux.org/2011/01/evoluzione-dellalta-affidabilita-su-linux-creare-un-cluster-tomcat-utilizzando-la-soluzione-nativa-heartbeat-e-pacemaker/#comments</comments>
		<pubDate>Mon, 24 Jan 2011 11:31:36 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1241</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Tomcat è un Application Server: un contenitore di applicazioni sviluppate attraverso il linguaggio di programmazione Java. Tomcat viene impiegato generalmente per l&#8217;esposizione di web service e questa sua attitudine, in caso di applicazioni critiche per importanza, deve essere obbligatoriamente associata all&#8217;alta affidabilità. Esso nativamente supporta un modello di cluster, che consente a diverse istanze [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2011/01/tomcat.png" alt="" title="tomcat" width="100" height="63" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux-ha.png" alt="" title="linux-ha" width="100" height="100" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2009/11/pacemaker.png" alt="" title="pacemaker" width="100" height="100" /></p>
<p>Tomcat è un Application Server: un contenitore di applicazioni sviluppate attraverso il linguaggio di programmazione Java. Tomcat viene impiegato generalmente per l&#8217;esposizione di web service e questa sua attitudine, in caso di applicazioni critiche per importanza, deve essere obbligatoriamente associata all&#8217;alta affidabilità. Esso nativamente supporta un modello di cluster, che consente a diverse istanze di condividere le sessioni, in modo da garantire la sopravvivenza del servizio: se quindi un&#8217;istanza smette di funzionare, il suo ruolo viene assunto dall&#8217;istanza sopravvissuta.<br />
Ma chi si occupa del controllo delle istanze stesse?<br />
Questo articolo descrive un caso di studio relativo ad un cluster nativo Tomcat le cui istanze vengono gestite da Heartbeat attraverso il Cluster Resource Manager Pacemaker.</p>
<p><strong>Installazione di Java</strong></p>
<p>Java è essenziale per il funzionamento di Tomcat ed è anche il primo software da configurare per ottenere il risultato prefissato in questo articolo. Per prima cosa quindi sarà necessario scaricare il pacchetto di installazione dal sito ufficiale di SUN presso il link <a href="http://www.java.com/it/download/linux_manual.jsp?locale=it&#038;host=www.java.com">http://www.java.com/it/download/linux_manual.jsp?locale=it&#038;host=www.java.com</a>.<br />
Ottenuto il file <em>jre-6u23-linux-i586.bin</em>, il cui nome potrà variare a seconda della versione, questo va eseguito:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># chmod +x jre-6u23-linux-i586.bin 
# ./jre-6u23-linux-i586.bin</pre></div></div>

<p>L&#8217;esecuzione del file creerà una cartella nominata <em>jre1.6.0_23</em> che sarà possibile spostare in un path consono, ad esempio <em>/usr/local</em>, per il quale potrà essere creato un link simbolico:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># mv jre1.6.0_23 /usr/local
# ln -s /usr/local/jre1.6.0_23 /usr/local/java</pre></div></div>

<p>In questo modo sarà possibile far riferimento al path <em>/usr/local/java</em> per il raggiungimento degli eseguibili java ed inoltre, in caso di installazioni di versioni diverse di Java, basterà cambiare il puntamento del link simbolico.</p>
<p><strong>Installazione di Tomcat</strong></p>
<p>L&#8217;installazione di Tomcat viene descritta in maniera generalista, indipendente quindi dalla distribuzione utilizzata.<br />
Per prima cosa quindi è necessario scaricare l&#8217;ultima versione dell&#8217;application server Tomcat, andando sul sito ufficiale di Tomcat (<a href="http://tomcat.apache.org/download-70.cgi">http://tomcat.apache.org/download-70.cgi</a>) oppure scaricando il pacchetto da uno dei mirror:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># wget http://it.apache.contactlab.it/tomcat/tomcat-7/v7.0.6/bin/apache-tomcat-7.0.6.tar.gz -o /tmp/apache-tomcat-7.0.6.tar.gz</pre></div></div>

<p>una volta terminato lo scaricamento, è possibile decomprimere il pacchetto in un path di sistema, ad esempio (e per convenzione) <em>/usr/local</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># cd /usr/local
# tar -xzvf /tmp/apache-tomcat-7.0.6.tar.gz
# ln -s apache-tomcat-7.0.6 tomcat</pre></div></div>

<p>L&#8217;ultimo comando lanciato crea un link simbolico, in modo che in futuro per accedere alla directory di Tomcat sarà sufficiente utilizzare il percorso <em>/usr/local/tomcat</em>.</p>
<p><strong>Installazione di Heartbeat e Pacemaker</strong></p>
<p>L&#8217;installazione dell&#8217;apparato cluster offerto dal progetto <em>Linux-ha</em> non verrà descritta in questo articolo, in quanto ampiamente trattata nei precedenti articoli della serie, in particolare nella puntata <a href="http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/">confronto pratico tra Heartbeat classico ed Heartbeat con Pacemaker</a>.</p>
<p><strong>Configurazione di Tomcat</strong></p>
<p>La configurazione prevede due fasi: la prima relativa alle credenziali di accesso, la seconda relativa alle impostazioni per il clustering.<br />
All&#8217;interno del file <em>/usr/local/tomcat/conf/tomcat-users.xml</em> sono definite le utenze di accesso alle diverse componenti dell&#8217;application server, in particolare, per permettere all&#8217;utente <em>tomcat</em> di gestire l&#8217;installazione di nuove applicazioni attraverso l&#8217;interfaccia web disponibile, il contenuto del file dovrà essere il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">'1.0'</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">'utf-8'</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tomcat-users<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;role</span> <span style="color: #000066;">rolename</span>=<span style="color: #ff0000;">&quot;tomcat&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;role</span> <span style="color: #000066;">rolename</span>=<span style="color: #ff0000;">&quot;manager-gui&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;user</span> <span style="color: #000066;">username</span>=<span style="color: #ff0000;">&quot;tomcat&quot;</span> <span style="color: #000066;">password</span>=<span style="color: #ff0000;">&quot;tomcat&quot;</span> <span style="color: #000066;">roles</span>=<span style="color: #ff0000;">&quot;manager,manager-gui,tomcat&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tomcat-users<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Inutile dire come il campo password debba essere modificato in base alla password scelta.<br />
L&#8217;abilitazione del cluster Tomcat, data la natura introduttiva dell&#8217;articolo, verrà fatta nella modalità più semplice, così come illustrato dalla documentazione ufficiale di Tomcat (<a href="http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html">http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html</a>), abilitando cioè la seguente riga all&#8217;interno del file <em>/usr/local/tomcat/conf/server.xml</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Cluster</span> <span style="color: #000066;">className</span>=<span style="color: #ff0000;">&quot;org.apache.catalina.ha.tcp.SimpleTcpCluster&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<p>La configurazione preliminare dell&#8217;application server è così completa.</p>
<p><strong>Configurazione di Heartbeat e Pacemaker</strong></p>
<p>Appena avviato il demone Heartbeat:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /etc/init.d/heartbeat start</pre></div></div>

<p>è possibile definire le configurazioni preliminari del cluster:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure property stonith-enabled=&quot;false&quot;
# crm configure property no-quorum-policy=&quot;ignore&quot;
# crm configure primitive ping ocf:pacemaker:ping params host_list=&quot;192.168.0.254&quot; name=&quot;ping&quot; op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot; op start timeout=&quot;60s&quot; op stop timeout=&quot;60s&quot;
# crm configure clone ping_clone ping meta globally-unique=&quot;false&quot;</pre></div></div>

<p>Come spiegato nei precedenti articoli queste configurazioni preliminari indicano di non utilizzare <em>stonith</em>, ignorare l’assenza di quorum e creare una risorsa <em>ping</em> che controlli la connettività in entrambi i nodi attraverso il <em>clone</em> della risorsa stessa.<br />
Maggiori informazioni e spiegazioni approfondite si trovano nella <a href="http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/">seconda parte del secondo articolo della serie</a>.<br />
In particolare l&#8217;ultima definizione, ossia la risorsa clonata per il controllo della connettività, favorisce lo spunto per la configurazione della risorsa Tomcat per la quale esiste un resource agent apposito: <a href="http://www.linux-ha.org/doc/re-ra-tomcat.html">http://www.linux-ha.org/doc/re-ra-tomcat.html</a>. Essendo obiettivo del progetto la gestione per mezzo di Pacemaker delle istanze di Tomcat, ed essendo le istanze di Tomcat in tutto e per tutto simili su entrambi nodi, queste potranno essere assimilate ad un&#8217;unica risorsa clonata.<br />
Nel dettaglio, la configurazione sarà la seguente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="console" style="font-family:monospace;">crm configure primitive cluster_tomcat ocf:heartbeat:tomcat params java_home=&quot;/usr/local/java/&quot; catalina_home=&quot;/usr/local/tomcat/&quot; op monitor interval=&quot;60s&quot; timeout=&quot;30s&quot; op start interval=&quot;0&quot; timeout=&quot;60s&quot; op stop interval=&quot;0&quot; timeout=&quot;120s&quot;
crm configure clone cluster_tomcat_clone cluster_tomcat meta globally-unique=&quot;false&quot; target-role=&quot;Started&quot;
crm configure location cluster_tomcat_on_connected_node cluster_tomcat_clone -inf: not_defined ping or ping lte 0</pre></td></tr></table></div>

<p>Nel dettaglio:</p>
<ol>
<li>Viene definita la risorsa <em>cluster_tomcat</em> i cui parametri sono il path in cui è installato Java (<em>java_home</em>) ed il path di tomcat stesso (<em>catalina_home</em>);</li>
<li>La risorsa <em>cluster_tomcat</em> viene clonata dalla nuova risorsa <em>cluster_tomcat_clone</em>. Così come per la risorsa <em>ping_clone</em> che risiederà su ciascun nodo definito, anche questa avrà lo stesso comportamento;</li>
<li>Viene definita una <em>location</em>, ossia un vincolo che obbliga la risorsa clonata a funzionare unicamente sui nodi la cui connettività è comprovata (nodi su cui cioè la risorsa ping esiste e restituisce un risultato positivo);</li>
</ol>
<p>A questo punto, la situazione del cluster dovrebbe essere la seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">============
Last updated: Mon Jan 24 10:17:05 2011
Stack: Heartbeat
Current DC: tomcatcluster-nodo2 (b091eddc-aa64-4d7d-8407-65a7dddafbdf) - partition with quorum
Version: 1.0.10-da7075976b5ff0bee71074385f8fd02f296ec8a3
2 Nodes configured, unknown expected votes
2 Resources configured.
============
&nbsp;
Online: [ tomcatcluster-nodo1 tomcatcluster-nodo2 ]
&nbsp;
 Clone Set: ping_clone
     Started: [ tomcatcluster-nodo1 tomcatcluster-nodo2 ]
 Clone Set: cluster_tomcat_clone
     Started: [ tomcatcluster-nodo1 tomcatcluster-nodo2 ]</pre></div></div>

<p>Ed entrambe le istanze di Tomcat dovrebbero essersi avviate su ciascun nodo. E&#8217; possibile verificarlo provando ad accedere all&#8217;interfaccia web di amministrazione presente su ciascun nodo:</p>
<p><a href="http://tomcatcluster-nodo1:8080/manager/html">http://tomcatcluster-nodo1:8080/manager/html</a><br />
<a href="http://tomcatcluster-nodo2:8080/manager/html">http://tomcatcluster-nodo2:8080/manager/html</a></p>
<p>Entrambi link dovrebbero essere funzionanti e richiedere uno username con password per accedervi. Una volta inserite le credenziali definite in fase di configurazione di Tomcat, sarà visibile l&#8217;interfaccia di amministrazione delle applicazioni.</p>
<p><strong>Analisi dei log</strong></p>
<p>L&#8217;avvio dei servizi Tomcat da parte del cluster può essere seguito dai file di log dell&#8217;application server stesso, all&#8217;interno dei quali è possibile verificare se il cluster nativo di Tomcat viene attivato correttamente.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># cat /usr/local/tomcat/logs/catalina.out
...
INFO: Cluster is about to start
...
INFO: Setting cluster mcast soTimeout to 500
...
INFO: Server startup in 3153 ms
...
21-gen-2011 17.05.47 org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
INFO: Replication member added:org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 0, 1}:4000,{192, 168, 0, 2},4000, alive=1259, securePort=-1, UDP Port=-1, id={101 64 89 59 2 -44 67 123 -73 23 4 -50 -57 105 8 58 }, payload={}, command={}, domain={}, ]
...</pre></div></div>

<p>Il server è avviato e certamente ha considerato la configurazione, includendo l&#8217;host (<em>memberAdded</em>) <em>192.168.0.52</em> nel cluster.</p>
<p><strong>Configurazione applicazione di Test</strong></p>
<p>La configurazione può dirsi completa. E&#8217; possibile quindi installare una semplice applicazione di test per verificare nell&#8217;effettivo il funzionamento delle sessioni condivise. Per fare ciò è sufficiente creare un&#8217;applicazione configurata con il parametro &#8220;<distributable/>&#8221; che indica al cluster di sfruttare la configurazione cluster per la condivisione delle sessioni.<br />
L&#8217;applicazione <em>TestSession</em>, scaricabile dal portale è stata configurata proprio a questo scopo:</p>
<p><a href='http://www.miamammausalinux.org/wp-content/uploads/2011/01/TestSession.war'>TestSession</a></p>
<p>Una volta scaricato il file <em>TestSession.war</em>, attraverso la console Tomcat e su ciascun nodo, sarà possibile installare l&#8217;applicazione nella sezione &#8220;WAR file to deploy&#8221;, selezionando il fie &#8220;war&#8221; scaricato e premendo il tasto &#8220;deploy&#8221;. Se l&#8217;esito sarà &#8220;OK&#8221;, entrambe le applicazioni saranno disponibili attraverso l&#8217;indirizzo:</p>
<p><a href="http://tomcatcluster-nodo1:8080/TestSession">http://tomcatcluster-nodo1:8080/TestSession</a><br />
<a href="http://tomcatcluster-nodo2:8080/TestSession">http://tomcatcluster-nodo2:8080/TestSession</a></p>
<p>E&#8217; possibile dunque avviare i test.</p>
<p><strong>Test di funzionamento</strong></p>
<p>Il principio di funzionamento del cluster è quello di rispondere alle richieste. Generalmente in questo tipo di architettura, gli Application Server risiedono dietro a <em>bilanciatori</em>, cioè apparati hardware o software che distribuiscono il carico attraverso batterie di macchine che offrono servizi.<br />
L&#8217;architettura di test predisposta non prevede l&#8217;utilizzo di un bilanciatore, a per simulare il bilanciamento del carico tra i due host sarà sufficiente inserire nel file <em>/etc/hosts</em> della propria macchina queste due righe:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">192.168.0.1 tomcatcluster
#192.168.0.2 tomcatcluster</pre></div></div>

<p>Come scritto in precedenza quindi, l&#8217;applicazione potrà essere chiamata come segue, senza far riferimento all&#8217;IP:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">http://tomcatcluster:8080/TestSession/</pre></div></div>

<p>Il test funzionerà in modo che chiamato l&#8217;url relativo al quale si passa un parametro, ad esempio:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">http://tomcatcluster:8080/TestSession/session.jsp?aaa=111</pre></div></div>

<p>la pagina visualizzi quanto segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Server info
&nbsp;
    * Name: tomcatcluster-nodo1
    * Address: 192.168.0.1
&nbsp;
Session Attributes
&nbsp;
    * aaa = 111</pre></div></div>

<p>Ovviamente le chiamate successive con parametri differenti aggiungeranno nuovi attributi.<br />
Nella fattispecie, chiamare:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">http://tomcatcluster:8080/TestSession/session.jsp?bbb=222</pre></div></div>

<p>produrrà:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Server info
&nbsp;
    * Name: tomcatcluster-nodo1
    * Address: 192.168.0.1
&nbsp;
Session Attributes
&nbsp;
    * aaa = 111
    * bbb = 222</pre></div></div>

<p>Il test a questo punto è semplicissimo, modificando il file /etc/hosts in modo che appaia come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">#192.168.0.1 tomcatcluster
192.168.0.2 tomcatcluster</pre></div></div>

<p>Di fatto il secondo nodo ora sarà quello attivo. Richiamando nuovamente lo script:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">http://tomcatcluster:8080/TestSession/session.jsp?ccc=333</pre></div></div>

<p>Si otterrà il seguente output:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Server info
&nbsp;
    * Name: tomcatcluster-nodo2
    * Address: 192.168.0.2
&nbsp;
Session Attributes
&nbsp;
    * aaa = 111
    * bbb = 222
    * ccc = 333</pre></div></div>

<p>Da notare come nel Server info ora il nodo sia tomcatcluster-nodo2, mentre i dati di sessione sono stati mantenuti.</p>
<p>Il corretto funzionamento è verificabile anche accedendo singolarmente a ciascun tomcat ai link presenti nella pagina manager nella colonna &#8220;Sessions&#8221;, dove vengono elencate le sessioni, che ovviamente hanno lo stesso codice su entrambi gli Application server.</p>
<p><strong>Conclusioni</strong></p>
<p>Terminata questa carrellata di concetti e test una cosa è chiara: come sempre questo è solo l&#8217;inizio. Sono moltissimi gli ambiti in cui soluzioni come (o simili) a quella presentata possono essere messe in produzione per ottenere infrastrutture stabili, sicure e funzionali. Sempre e comunque altamente affidabili.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/01/evoluzione-dellalta-affidabilita-su-linux-creare-un-cluster-tomcat-utilizzando-la-soluzione-nativa-heartbeat-e-pacemaker/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
		<item>
		<title>Evoluzione dell’alta affidabilità su Linux: realizzare un NAS con Pacemaker, DRBD ed exportfs</title>
		<link>http://www.miamammausalinux.org/2010/09/evoluzione-dellalta-affidabilita-su-linux-realizzare-un-nas-con-pacemaker-drbd-ed-exportfs/</link>
		<comments>http://www.miamammausalinux.org/2010/09/evoluzione-dellalta-affidabilita-su-linux-realizzare-un-nas-con-pacemaker-drbd-ed-exportfs/#comments</comments>
		<pubDate>Mon, 20 Sep 2010 19:40:13 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[DRBD]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[NFS]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1128</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Nel precedente articolo è stato effettuato un confronto tra le tipologie possibili di utilizzo relativo ad Heartbeat, nella modalità classica ed in quella mediante CRM (Cluster Resource Manager) per l&#8217;erogazione in alta affidabilità del servizio Apache. In quest&#8217;ultimo articolo verrà proposto un vero case study relativo alla configurazione di un cluster erogante uno storage [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux-ha.png" alt="linux-ha" title="linux-ha" width="100" height="100" class="alignnone size-full wp-image-259" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2009/11/pacemaker.png" alt="Pacemaker" title="pacemaker" width="100" height="100" class="size-full wp-image-872" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2010/09/drbd.png" alt="" title="drbd" width="100" height="100" class="alignnone size-full wp-image-1190" /></p>
<p>Nel precedente articolo è stato effettuato un confronto tra le tipologie possibili di utilizzo relativo ad Heartbeat, nella modalità classica ed in quella mediante <em>CRM</em> (<em>Cluster Resource Manager</em>) per l&#8217;erogazione in alta affidabilità del servizio <em>Apache</em>.<br />
In quest&#8217;ultimo articolo verrà proposto un vero case study relativo alla configurazione di un cluster erogante uno <em>storage</em> NFS in alta affidabilità i cui dati verranno ridondati via <em>DRBD</em> (<em>Network Raid 1</em>), mediante la configurazione di <em>Pacemaker</em>.<br />
Peculiarità del progetto sarà l&#8217;utilizzo per l&#8217;erogazione delle directory NFS di entrambi i nodi, in modo da sfruttare tutte le macchine presenti, per un cluster di tipo <em>active-active</em>.</p>
<p><strong>Il progetto</strong></p>
<p>Quanto si propone di realizzare è un sistema in alta affidabilità che consenta di impiegare tutte le macchine presenti all&#8217;interno del cluster per rendere disponibile spazio all&#8217;interno di una rete. In altre parole, un <em>Network Attached Storage</em> (<em>NAS</em>), un&#8217;entità composta da due macchine collegate alla rete che consentano a dei client di montare le partizioni e fruire dello spazio reso disponibile.<br />
Le componenti impiegate all&#8217;interno del progetto saranno:</p>
<ol>
<li><em>Heartbeat e Pacemaker</em>: per la gestione del cluster;</li>
<li><em>DRBD</em>: per la replica dei dati fra le due macchine attraverso un <em>network raid 1</em>;</li>
<li><em>NFS</em>: per la condivisione attraverso la rete dello spazio;</li>
</ol>
<p>Il progetto si rifà nelle sue fondamenta a quanto illustrato nella <a href="http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/">seconda parte del precedente articolo</a> e, se non lo si è ancora fatto, è bene dare una rapida lettura in modo da poter applicare i concetti lì illustrati senza perplessità.<br />
Il cluster verrà costruito su due sistemi (<em>debian-lenny-nodo1</em> e <em>debian-lenny-nodo2</em>) collegati ciascuno alla rete locale (<em>192.168.1.0/24</em>) e l’uno all&#8217;altro da un cavo cross (<em>10.0.0.0/24</em>, connessione necessaria per realizzare <em>il network raid 1</em> con <em>DRBD</em>), lo spazio locale verrà esportato attraverso il protocollo <em>NFS</em>. In particolare verranno definite due condivisioni distinte, corrispondenti a due cartelle locali chiamate <em>/share-a</em> e <em>/share-b</em>.<br />
Obiettivo ultimo è quello di ottenere ciascuna condivisione esportata da un nodo, in modo da avere (a regime ed in condizioni ottimali) un cluster in cui nessun nodo risulti passivo.<br />
Unico requisito richiesto sui nodi è la presenza dei pacchetti <em>heartbeat</em> e <em>pacemaker</em> (la cui installazione è descritta nell&#8217;articolo precedente) e del demone <em>NFS</em>. Nei sistemi Debian ed Ubuntu sarà quindi necessario installare il pacchetto <em>nfs-kernel-server</em> mentre in RedHat/SuSe il pacchetto sarà <em>nfs</em>.</p>
<p><strong>La gestione locale dei dati: device, md, LVM o tutti e tre?</strong></p>
<p>Prima di iniziare a configurare il cluster è bene decidere come verranno gestiti sulle macchine i dati che andranno esposti. Questa scelta, la più delicata poiché intacca direttamente le performance, va fatta sulla base dell&#8217;hardware disponibile, partendo da tre ambiti operativi:</p>
<ul>
<li><em>device</em>: partizioni fisiche (ad esempio /dev/sda3, /dev/sda4 e via dicendo);</li>
<li><em>md (Multiple Disk)</em>: gestione locale dei raid, i dati sono ridondati sulle singole macchine (oltre che in rete);</li>
<li><em>LVM (Logical Volume Manager)</em>: volumi logici, per una gestire più elastica dello spazio locale;</li>
</ul>
<p>Partendo dal presupposto che l&#8217;utilizzo dei <em>device</em> è indispensabile (visto che si sta parlando di dischi locali), scegliere se configurare raid locali o <em>LVM</em> dipende da quanto si dispone.<br />
Se le macchine utilizzate possiedono una <a href="http://it.wikipedia.org/wiki/RAID#Hardware_o_software">controller RAID hardware</a>, allora si potrà evitare di configurare i dispositivi <em>md</em>, così come se si ritiene la ridondanza locale superflua (del resto i dati verranno comunque ridondati in rete).<br />
Se il sistema necessiterà di frequenti variazioni in termini di spazio sulle partizioni esposte sarà doveroso impiegare volumi logici in modo da gestire con facilità operazioni di ridimensionamento. Inoltre la gestione dei volumi logici potrebbe essere preferita dai più, proprio per la semplicità con cui è possibile apportare variazioni allo spazio disponibile, soprattutto in situazioni complesse.<br />
Lampante è come più livelli di complessità si aggiungono, maggiore sarà il carico che graverà sul sistema operativo e maggiore dovrà essere la capacità di gestire eventuali malfunzionamenti.<br />
Come sempre quindi, la libertà di scelta è totale e dipende unicamente dell&#8217;utente.<br />
Nel caso illustrato la scelta è caduta sull&#8217;impiego di LVM su due partizioni (/dev/sda3 e /dev/sdb3), in quanto le macchine su cui la soluzione viene implementata possiedono una <em>controller RAID</em> integrata che si occupa di ridondare i due dischi disponibili.<br />
Su entrambe le macchine sono stati definiti due <em>Physical Volume</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># pvcreate /dev/sd[ab]3</pre></div></div>

<p>Ai quali è stato associato un <em>Volume Group</em> denominato <em>vg_share</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># vgcreate vg_share /dev/sd[ab]3</pre></div></div>

<p>Ed infine sono stati creati due <em>Logical Volume</em>, denominati <em>lv_drbd0</em> ed <em>lv_drbd1</em>, i quali rappresenteranno le due condivisioni relative ai device drbd che verranno in seguito creati:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lvcreate -n lv_drbd0 -L 1G vg_share
# lvcreate -n lv_drbd1 -L 1G vg_share</pre></div></div>

<p>l&#8217;opzione &#8220;-L&#8221; definisce lo spazio massimo occupabile dal volume logico, chiaramente essendo un progetto con fini puramente didattici lo spazio è stato ridotto per facilitare e velocizzare le operazioni di creazione ed aggiornamento.<br />
All&#8217;interno della cartella /dev/mapper/ saranno quindi visibili i seguenti file:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ls -la /dev/mapper/
totale 0
drwxr-xr-x  2 root root     100 2010-09-14 12:15 .
drwxr-xr-x 17 root root    3700 2010-09-14 12:15 ..
crw-rw----  1 root root  10, 59 2010-09-14 12:15 control
brw-rw----  1 root disk 251,  0 2010-09-14 12:15 vg_share-lv_drbd0
brw-rw----  1 root disk 251,  1 2010-09-14 12:15 vg_share-lv_drbd1</pre></div></div>

<p>a dimostrazione che i volumi logici sono pronti ad essere utilizzati.</p>
<p><strong>Configurazione preliminare di Heartbeat</strong></p>
<p>La configurazione preliminare di Heartbeat si rifà totalmente a quanto illustrato nel <a href="http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/">precedente articolo</a> al paragrafo &#8220;Configurazione di Heartbeat in modalità CRM con Pacemaker&#8221;:</p>
<p><em>/etc/ha.d/ha.cf</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">autojoin none
keepalive 1
deadtime 10
warntime 5
initdead 20
mcast eth0 239.0.0.43 694 1 0
bcast eth1
node    debian-lenny-nodo1
node    debian-lenny-nodo2
crm respawn</pre></div></div>

<p><em>/etc/ha.d/authkeys</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">auth 1
1 crc</pre></div></div>

<p>Quindi una volta avviato Heartbeat:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /etc/init.d/heartbeat start</pre></div></div>

<p>è possibile definire le configurazioni preliminari del cluster:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure property stonith-enabled=&quot;false&quot;
# crm configure property no-quorum-policy=&quot;ignore&quot;
# crm configure primitive ping ocf:pacemaker:ping params host_list=&quot;192.168.1.1&quot; name=&quot;ping&quot; op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot; op start timeout=&quot;60s&quot; op stop timeout=&quot;60s&quot;
# crm configure clone ping_clone ping meta globally-unique=&quot;false&quot;</pre></div></div>

<p>In breve viene disabilitato lo <em>stonith</em>, viene imposto al cluster di ignorare l&#8217;assenza di <em>quorum</em> e viene definita una risorsa <em>ping</em> che controlla la connettività in entrambi i nodi attraverso il <em>clone</em> della risorsa stessa.<br />
La situazione del cluster viene così riassunta:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm status
============
Last updated: Tue Sep 14 12:17:29 2010
Stack: Heartbeat
Current DC: debian-lenny-nodo1 (1627f3ec-ec7e-4f0c-b69e-e9729933a2cc) - partition with quorum
Version: 1.0.8-042548a451fce8400660f6031f4da6f0223dd5dd
2 Nodes configured, unknown expected votes
1 Resources configured.
============
&nbsp;
Online: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
&nbsp;
 Clone Set: ping_clone
     Started: [ debian-lenny-nodo1 debian-lenny-nodo2 ]</pre></div></div>

<p>Per qualsiasi dubbio in merito alle configurazioni sopra riportate, come già detto, è bene far riferimento al <a href="http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/">precedente articolo</a>.</p>
<p><strong>Configurazione preliminare di DRBD</strong></p>
<p>In questa fase del progetto è necessario configurare i due volumi logici creati in precedenza affinché possano essere utilizzati con DRBD. Per prima cosa il sistema deve essere predisposto per supportare DRBD, il che significa che vanno installati i pacchetti relativi al <em>modulo</em> che verrà inserito all&#8217;interno del <em>kernel</em>. Come sempre tutto dipende dalla distribuzione che si sta utilizzando, nel caso illustrato Debian offre il meta pacchetto <em>drbd8-modules-2.6-686</em> che si occupa di installare la corretta versione associata al kernel utilizzato:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">apt-get install drbd8-modules-2.6-686 drbd8-utils</pre></div></div>

<p>Con Ubuntu è sufficiente installare il pacchetto <em>drbd8-utils</em> che risolverà le dipendenze ed installerà il modulo, stesso dicasi per SuSe, mentre per RedHat è necessario utilizzare i pacchetti Extra di CentOS.<br />
Maggiori informazioni sulle versioni disponibili sono qui: <a href="http://www.drbd.org/download/packages/">http://www.drbd.org/download/packages/</a>.</p>
<p>Installato il modulo, per configurare i due volumi logici i passi da seguire sono semplicissimi. In prima istanza va modificato il file /etc/drbd.conf come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">global { usage-count no; }
&nbsp;
common { protocol C; syncer { rate 100M; } }
&nbsp;
resource r0 {
        device /dev/drbd0;
        meta-disk internal;
        disk /dev/mapper/vg_share-lv_drbd0;
&nbsp;
        on debian-lenny-nodo1 {
                address 10.0.0.1:7788;
        }
&nbsp;
        on debian-lenny-nodo2 {
                address 10.0.0.2:7788;
        }
}
&nbsp;
resource r1 {
        device /dev/drbd1;
        meta-disk internal;
        disk /dev/mapper/vg_share-lv_drbd1;
&nbsp;
        on debian-lenny-nodo1 {
                address 10.0.0.1:7789;
        }
&nbsp;
        on debian-lenny-nodo2 {
                address 10.0.0.2:7789;
        }
}</pre></div></div>

<p>Le dichiarazioni presenti nel file sono auto esplicative: Il tipo di algoritmo con cui verrà gestita la sincronizzazione è C (replicazione sincrona, standard, <a href="http://www.drbd.org/users-guide/s-replication-protocols.html">qui i dettagli sui diversi protocolli disponibili</a>), mentre la velocità a cui i dati verranno sincronizzati è 100 Mega (<a href="http://www.drbd.org/users-guide/s-resync.html">qui come calcolare la corretta velocità di sincronizzazione</a>).<br />
sono state definite due risorse (<em>resource</em>) che poggeranno su volumi logici interni (<em>disk</em>) e registreranno i meta-dati relativi alla sincronizzazione internamente (<em>meta-disk</em>), ciascuna risorsa farà viaggiare le informazioni per la sincronizzazione sull&#8217;interfaccia locale relativa alla rete 10.0.0.0 (<em>address</em>) ad una porta differente (<em>7788</em> e <em>7789</em>).</p>
<p>A questo punto i volumi logici vanno inizializzati in modo che il sistema possa iniziare a servirsi dei device. Le operazioni da compiere in sequenza, su entrambi i nodi, sono le seguenti:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="console" style="font-family:monospace;"># modprobe drbd
# drbdadm create-md r0
# drbdadm create-md r1
# drbdadm up r0
# drbdadm up r1</pre></td></tr></table></div>

<p>Linea per linea, ecco quanto fatto:</p>
<ol>
<li>Caricamento del modulo drbd: il sistema è in grado di supportare dispositivi drbd;</li>
<li>Creazione del <em>meta-device</em> sopra il volume logico r0, così come dichiarato nel file di configurazione, il volume /dev/mapper/vg_share-lv_drbd0 viene inizializzato;</li>
<li>Creazione del <em>meta-device</em> sopra il volume logico r1, così come dichiarato nel file di configurazione, il volume /dev/mapper/vg_share-lv_drbd1 viene inizializzato;</li>
<li>Attivazione del <em>meta-device</em>, da questo momento il sistema &#8220;vede&#8221; /dev/drbd0;</li>
<li>Attivazione del <em>meta-device</em>, da questo momento il sistema &#8220;vede&#8221; /dev/drbd1;</li>
</ol>
<p>Come ultima fase per l&#8217;inizializzazione dei dispositivi è necessario effettuare la prima sincronizzazione in modo che i volumi remoti vengano allineati. Per far ciò è necessario lanciare il seguente comando su uno solo dei due nodi:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># drbdadm -- --overwrite-data-of-peer primary all</pre></div></div>

<p>Il comando forza lo stato primario del nodo su cui è stato lanciato ed avvia nel contempo la prima sincronizzazione, al termine della quale lo stato dei meta-device drbd sarà il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># cat /proc/drbd 
version: 8.3.7 (api:88/proto:86-91)
GIT-hash: ea9e28dbff98e331a62bcbcc63a6135808fe2917 build by root@debian-lenny-nodo1, 2010-09-13 18:03:02
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0</pre></div></div>

<p>Per concludere la configurazione preliminare di drbd andrà creato un filesystem su ciascuno dei device creati:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># mkfs.ext3 /dev/drbd0
# mkfs.ext3 /dev/drbd1</pre></div></div>

<p>E rimosso l&#8217;avvio automatico del demone dal sistema, poiché questo verrà gestito totalmente dal cluster. Per Debian ed Ubuntu il comando da lanciare sarà:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># update-rc.d -f drbd remove</pre></div></div>

<p>mentre nel caso di RedHat/CentOS/SuSe:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># chkconfig --level 123456 drbd off</pre></div></div>

<p>E&#8217; giunto il momento di configurare lo storage condiviso.</p>
<p><strong>Configurazione di Heartbeat e DRBD</strong></p>
<p>Prima implementare l&#8217;esposizione dello spazio che abbiamo creato via NFS è necessario configurare il cluster affinché gestisca i dispositivi DRBD e ne amministri lo stato. Come stabilito in precedenza infatti, il controllo di tali componenti sarà totalmente nelle mani del cluster e non del sistema operativo. In altre parole i due componenti DRBD non saranno gestiti come demoni, ma come due risorse distinte.<br />
DRBD, rispetto a quanto illustrato sinora, non è una risorsa standard: non è assimilabile infatti alle risorse comuni poiché necessità di risiedere su (almeno) due nodi, questa peculiarità però non permette comunque di creare un clone della risorsa da ripartire sulle altre macchine, poiché in ciascuno dei nodi su cui essa sarà attiva questa dovrà assumere uno stato differente.<br />
Per questa ragione, dopo aver definito le risorse standard associate ai dispositivi DRBD in precedenza creati (r0 ed r1):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure primitive drbd0 ocf:linbit:drbd params drbd_resource=&quot;r0&quot; op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot; op start interval=&quot;0&quot; timeout=&quot;240s&quot; op stop interval=&quot;0&quot; timeout=&quot;100s&quot;
# crm configure primitive drbd1 ocf:linbit:drbd params drbd_resource=&quot;r1&quot; op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot; op start interval=&quot;0&quot; timeout=&quot;240s&quot; op stop interval=&quot;0&quot; timeout=&quot;100s&quot;</pre></div></div>

<p> è necessario configurare due risorse <em>multi-state</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure ms ms-drbd0 drbd0 meta master-max=&quot;1&quot; notify=&quot;true&quot;
# crm configure ms ms-drbd1 drbd1 meta master-max=&quot;1&quot; notify=&quot;true&quot;</pre></div></div>

<p>I due comandi, ciascuno relativo ad una risorsa DRBD, definiscono una risorsa <em>multi-state</em> che può avere un solo nodo master (<em>master-max</em>) il quale una volta assunto il proprio stato (master o slave che sia) deve notificare il successo agli altri nodi (<em>notify</em>), in modo che la risorsa sia in uno stato coerente su entrambi i nodi.<br />
Dopo qualche secondo sarà possibile osservare all&#8217;interno dello stato del cluster quanto realizzato:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">============
Last updated: Wed Sep 15 20:16:44 2010
Stack: Heartbeat
Current DC: debian-lenny-nodo1 (1627f3ec-ec7e-4f0c-b69e-e9729933a2cc) - partition with quorum
Version: 1.0.8-042548a451fce8400660f6031f4da6f0223dd5dd
2 Nodes configured, unknown expected votes
3 Resources configured.
============
&nbsp;
Online: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
&nbsp;
 Clone Set: ping_clone
     Started: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
 Master/Slave Set: ms-drbd0
     Masters: [ debian-lenny-nodo1 ]
     Slaves: [ debian-lenny-nodo2 ]
 Master/Slave Set: ms-drbd1
     Masters: [ debian-lenny-nodo1 ]
     Slaves: [ debian-lenny-nodo2 ]</pre></div></div>

<p>Come si evince dall&#8217;output mostrato il nodo master per entrambe le risorse è <em>debian-lenny-nodo1</em>.</p>
<p>Ora che il cluster controlla i dispositivi è necessario esporli. Per fare ciò sono necessarie tre componenti:</p>
<ol>
<li>Indirizzo IP: ossia l&#8217;indirizzo di riferimento per l&#8217;intera rete a quela specifica condivisione;</li>
<li>Filesystem: ovvero il <em>mount</em> del filesystem relativo alla risorsa DRBD in modo che ci si possa scrivere sopra;</li>
<li>NFS: in modo da esporre la condivisione con il protocollo NFS e permettere il mount da parte di client di rete;</li>
</ol>
<p>Esisteranno quindi due gruppi di risorse contenenti le tre risorse descritte, tali gruppi verranno nominati come le cartelle che dovranno esporre, così come definito in fase di studio del progetto: <em>share-a</em> e <em>share-b</em>.</p>
<p><em>Indirizzo IP</em></p>
<p>La configurazione degli indirizzi IP è identica a quanto illustrato nel precedente articolo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure primitive share-a-ip ocf:heartbeat:IPaddr2 params ip=&quot;192.168.1.33&quot; nic=&quot;eth0&quot; op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot;
# crm configure primitive share-b-ip ocf:heartbeat:IPaddr2 params ip=&quot;192.168.1.34&quot; nic=&quot;eth0&quot; op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot;</pre></div></div>

<p>al gruppo che eroga <em>share-a</em> pertanto verrà associato l&#8217;indirizzo 192.168.1.33 mentre a <em>share-b</em> 192.168.1.34, entrambe le risorse sono gestite dal il <em>resource agent IPAddr2</em>.</p>
<p><em>Filesystem</em></p>
<p>Il dispositivo <em>/dev/drbd0</em> verrà associato a <em>share-a</em> ed alla directory <em>/share-a</em>, così come <em>share-b</em> monterà <em>/dev/drbd1</em> sulla directory <em>/share-b</em>.<br />
Andranno quindi create le directory per i mount su entrambi i nodi:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># mkdir /share-a
# mkdir /share-b</pre></div></div>

<p>Ed infine configurate le risorse attraverso il <em>resource agent Filesystem</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure primitive share-a-fs ocf:heartbeat:Filesystem params device=&quot;/dev/drbd0&quot; directory=&quot;/share-a&quot; fstype=&quot;ext3&quot; op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot; op start interval=&quot;0&quot; timeout=&quot;60s&quot; op stop interval=&quot;0&quot; timeout=&quot;60s&quot; meta is-managed=&quot;true&quot; 
# crm configure primitive share-b-fs ocf:heartbeat:Filesystem params device=&quot;/dev/drbd1&quot; directory=&quot;/share-b&quot; fstype=&quot;ext3&quot; op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot; op start interval=&quot;0&quot; timeout=&quot;60s&quot; op stop interval=&quot;0&quot; timeout=&quot;60s&quot; meta is-managed=&quot;true&quot;</pre></div></div>

<p><em>NFS</em></p>
<p>Per permettere l&#8217;esportazione di ciascuna share in maniera indipendente, fermo restando che su ogni sistema il demone NFS deve essere in esecuzione, è possibile utilizzare un <em>resource agent</em> denominato <em>exportfs</em>.<br />
Questo <em>resource agent</em> creato da <em>Holger Teutsch</em>, potrebbe non essere disponibile se non si possiede una versione recente di Heartbeat (successiva al marzo 2010). In questo caso il problema è facilmente risolvibile installando il resource agent su entrambi i nodi come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># cd /usr/lib/ocf/resource.d/heartbeat/
# wget http://hg.linux-ha.org/agents/raw-file/c8d8b1126ffd/heartbeat/exportfs
# chmod +x exportfs</pre></div></div>

<p>In questo modo sarà possibile dichiarare due risorse exportfs affinché espongano le due cartelle:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure primitive share-a-exportfs ocf:heartbeat:exportfs params directory=&quot;/share-a&quot; clientspec=&quot;192.168.1.0/24&quot; options=&quot;rw,async,no_subtree_check,no_root_squash&quot; fsid=&quot;1&quot; op monitor interval=&quot;10s&quot; timeout=&quot;30s&quot; op start interval=&quot;0&quot; timeout=&quot;40s&quot; op stop interval=&quot;0&quot; timeout=&quot;40s&quot;
# crm configure primitive share-b-exportfs ocf:heartbeat:exportfs params directory=&quot;/share-b&quot; clientspec=&quot;192.168.1.0/24&quot; options=&quot;rw,async,no_subtree_check,no_root_squash&quot; fsid=&quot;2&quot; op monitor interval=&quot;10s&quot; timeout=&quot;30s&quot; op start interval=&quot;0&quot; timeout=&quot;40s&quot; op stop interval=&quot;0&quot; timeout=&quot;40s&quot;</pre></div></div>

<p>Il <em>resource agent exportfs</em> si occupa di aggiornare in tempo reale lo stato delle export NFS di sistema, utilizzando appunto il comando <em>exportfs</em>.<br />
Come è facile notare la dichiarazione del resource agent si rifà totalmente alla sintassi del comando exportfs, o più semplicemente al contenuto del file <em>/etc/exports</em> (ossia il file di configurazione di NFS), in particolare:</p>
<ul>
<li><em>directory</em> definisce la directory locale che verrà esportata;</li>
<li><em>client_spec</em> definisce quali client potranno accedere alla condivisione;</li>
<li><em>options</em> contiene le opzioni di esportazione: lettura/scrittura (<em>rw</em>), l&#8217;allineamento del filesystem sarà asincrono (<em>async</em>) e tutto il volume verrà esportato senza controllo alle sotto directory (<em>no_subtree_check</em>), infine sarà possibile per l&#8217;utente root del client remoto avere privilegi di root sulla condivisione (no_root_squash);</li>
<li><em>fsid</em> definisce un identificatore univoco per la condivisione;</li>
</ul>
<p><em>Raggruppare le risorse create</em></p>
<p>Ora che è terminata la creazione delle risorse, è facile notare come queste abbiano nomi riconducibili al loro utilizzo, ma  siano in realtà slegate le une dalle altre. Necessitano quindi, per una corretta gestione, di essere raggruppate. Pacemaker permette di creare quindi gruppi di risorse, la cui definizione sequenziale stabilisce anche l&#8217;ordine con cui le risorse verranno avviate:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure group share-a share-a-fs share-a-exportfs share-a-ip
# crm configure group share-b share-b-fs share-b-exportfs share-b-ip</pre></div></div>

<p>Sono stati quindi definiti due gruppi <em>share-a</em> e <em>share-b</em> che avvieranno innanzitutto il filesystem, seguito dall&#8217;export dello stesso via NFS ed infine l&#8217;indirizzo IP. Chiaramente in fase di stop l&#8217;ordine sarà logicamente invertito, garantendo in caso di disservizi ai client remoti in prima istanza di perdere connettività con il server (i client non rilevando più l&#8217;indirizzo del server tratterranno le connessioni esistenti in stato di attesa, <em>TIME_WAIT</em>) e, una volta che le risorse saranno ripristinate sul nodo attivo, di continuare a scrivere senza alcuna perdita di dati.</p>
<p><em>Collocazione, ordinamento e controllo connettività delle risorse</em></p>
<p>La configurazione del cluster non è però ancora completa. Le risorse <em>drbd</em> ed i gruppi <em>share</em> al momento non sono correlati. Infatti per come è stato configurato il sistema su un nodo potrebbe avviarsi <em>share-a</em>, ma non esserci la risorsa <em>drbd0</em> promossa allo stato di <em>master</em>, quindi non utilizzabile come mount point, né scrivibile.<br />
Per ovviare a questa potenziale situazione, è necessario associare i gruppi <em>share</em> ai nodi su cui la risorsa <em>drbd</em> è <em>master</em>.<br />
Pacemaker gestisce queste operazioni attraverso le <em>colocation</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure colocation share-a_on_ms-drbd0 inf: share-a ms-drbd0:Master
# crm configure colocation share-b_on_ms-drbd1 inf: share-b ms-drbd1:Master</pre></div></div>

<p>Viene definita per entrambi i gruppi <em>share</em> una <em>colocation</em> di peso infinito (<em>inf</em>, quindi senza possibilità di variazione) per cui il gruppo si avvierà solo laddove la risorsa <em>multi-state</em> è in stato <em>master</em>.</p>
<p>E&#8217; necessaria un&#8217;altra condizione per aggiungere coerenza alla configurazione e riguarda l&#8217;ordinamento nell&#8217;avvio delle risorse. Chiaramente ciascun gruppo <em>share</em> non ha ragione di avviarsi se non dopo che il dispositivo <em>drbd</em> è attivo. Pacemaker gestisce la cosa attraverso le definizioni <em>order</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure order share-a_after_ms-drbd0 inf: ms-drbd0:promote share-a:start
# crm configure order share-a_after_ms-drbd1 inf: ms-drbd1:promote share-b:start</pre></div></div>

<p>Viene definita una <em>order</em> di peso infinito in cui l&#8217;operazione di promozione a <em>master</em> della risorsa <em>multi-state</em> vincola l&#8217;avvio del gruppo <em>share</em>.</p>
<p>A completamento della configurazione non rimane che associare le risorse ai nodi con connettività, facendo riferimento alla risorsa <em>ping</em> dichiarata in precedenza e clonata in tutti i nodi:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure location share-a_on_connected_node share-a rule -inf: not_defined ping or ping lte 0
# crm configure location share-b_on_connected_node share-b rule -inf: not_defined ping or ping lte 0</pre></div></div>

<p>Viene definita una <em>location</em> relativa ai gruppi <em>share</em> la cui regola di peso meno infinito (<em>-inf</em>) si verifica in assenza di connettività: la risorsa ping non è definita oppure restituisce un valore negativo.<br />
In questo modo quando un nodo che ospita un gruppo perderà la connettività Pacemaker tenterà di effettuare uno <em>switch</em> del gruppo su un altro nodo attivo.</p>
<p><em>Cleanup finale</em></p>
<p>Ora che la configurazione del cluster è completa è facile immaginare come tutte le operazioni effettuate possano aver falsato lo stato generale del cluster, quindi, al fine di partire da una situazione pura, è possibile lanciare i seguenti comandi:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm resource cleanup share-a
# crm resource cleanup share-b</pre></div></div>

<p>L&#8217;operazione di cleanup della risorsa come dice il nome, azzera il conteggio degli errori per le risorse e le riavvia ordinatamente in modo da, come detto, partire da zero a vagliare eventuali problemi.<br />
Lo stato del cluster a configurazione ultimata dovrebbe essere quindi il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm status
============
Last updated: Fri Sep 17 14:33:16 2010
Stack: Heartbeat
Current DC: debian-lenny-nodo1 (1627f3ec-ec7e-4f0c-b69e-e9729933a2cc) - partition with quorum
Version: 1.0.8-042548a451fce8400660f6031f4da6f0223dd5dd
2 Nodes configured, unknown expected votes
5 Resources configured.
============
&nbsp;
Online: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
&nbsp;
 Clone Set: ping_clone
     Started: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
 Master/Slave Set: ms-drbd0
     Masters: [ debian-lenny-nodo2 ]
     Slaves: [ debian-lenny-nodo1 ]
 Master/Slave Set: ms-drbd1
     Masters: [ debian-lenny-nodo1 ]
     Slaves: [ debian-lenny-nodo2 ]
 Resource Group: share-a
     share-a-fs (ocf::heartbeat:Filesystem):    Started debian-lenny-nodo1
     share-a-exportfs   (ocf::heartbeat:exportfs):      Started debian-lenny-nodo1
     share-a-ip (ocf::heartbeat:IPaddr2):       Started debian-lenny-nodo1
 Resource Group: share-b
     share-b-fs (ocf::heartbeat:Filesystem):    Started debian-lenny-nodo2
     share-b-exportfs   (ocf::heartbeat:exportfs):      Started debian-lenny-nodo2
     share-b-ip (ocf::heartbeat:IPaddr2):       Started debian-lenny-nodo2</pre></div></div>

<p><strong>Creare una configurazione active active</strong></p>
<p>Il progetto iniziale prevede che nessun nodo, in condizioni normali, sia passivo. Pertanto per completare la configurazione del cluster è necessario assegnare ciascun gruppo <em>share</em> ad uno specifico nodo.<br />
Tale risultato è ottenibile mediante l&#8217;aggiunta di due ulteriori regole di tipo <em>location</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">location cli-prefer-share-a share-a rule inf: #uname eq debian-lenny-nodo1
location cli-prefer-share-b share-b rule inf: #uname eq debian-lenny-nodo2</pre></div></div>

<p>In questo modo, la regola creata impone che <em>share-a</em> venga associata al nodo <em>debian-lenny-nodo1</em> mentre <em>share-b</em> al nodo <em>debian-lenny-nodo2</em>: i due nodi saranno entrambi operativi, completando così l&#8217;obiettivo deciso in fase di progettazione.</p>
<p><em>Considerazioni sulla stickiness</em></p>
<p>La politica del cluster in merito al posizionamento di una risorsa dipende dal peso che questa ha. Il peso viene stabilito in base alle condizioni del cluster e della risorsa stessa. Molte delle regole relative a definizioni di <em>location</em> e <em>order</em> fanno infatti riferimento a pesi infiniti in modo che se queste si verificano lo stato del cluster DEVE variare.<br />
Lo <em>stickiness</em> di una risorsa rappresenta il peso necessario al suo spostamento dalla posizione attuale nel momento in cui il cluster subisce variazioni.</p>
<p><em>Ad esempio&#8230;</em></p>
<p>Il valore di default della <em>stickyness</em> è 0.  se una risorsa viene migrata a mano, il cluster aggiunge una regola di <em>location</em> come quelle descritte poco sopra. Se il nodo che eroga la risorsa perde di connettività, allora questa, per la sua sopravvivenza, verrà migrata sul nodo attivo. Quando però il nodo originale tornerà a vivere, la risorsa, per via della regola impostata, verrà nuovamente migrata in quanto non ha vincoli (la <em>stickiness</em> è 0) che la legano al nodo attuale. Questo significa che nel giro i poco tempo si assisterà a due <em>switch</em> della risorsa, assimilabili a due interruzioni di servizio.<br />
Facile capire come non sempre questo possa essere il comportamento desiderato. Basti pensare al caso di database Oracle, ed a tutti i problemi che comporta uno <em>switch</em>.<br />
Inutile dire che meno sono, meglio è.<br />
Fortunatamente Pacemaker consente di impostare il valore di default di <em>stickiness</em> a infinito:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">crm configure property default-resource-stickiness=INFINITY</pre></div></div>

<p>In questo modo se una risorsa associata ad un nodo migra, alla ricomparsa del nodo questa rimarrà dov&#8217;è, limitando ulteriori disservizi.<br />
A seconda della decisione presa in merito alla stickiness, si dovrà quindi scegliere se questa dovrà rimanere al suo valore di default o avere altri valori (numeri maggiori di zero per arrivare ad <em>INFINITY</em>).</p>
<p><strong>Configurazione finale</strong></p>
<p>La configurazione estesa (modificabile attraverso il comando <em>crm configure edit</em>) è la seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">node $id=&quot;1627f3ec-ec7e-4f0c-b69e-e9729933a2cc&quot; debian-lenny-nodo1
node $id=&quot;f4380aee-c67b-4472-9449-5fa8e5ddae34&quot; debian-lenny-nodo2
primitive drbd0 ocf:linbit:drbd \
	params drbd_resource=&quot;r0&quot; \
	op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;240s&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;100s&quot;
primitive drbd1 ocf:linbit:drbd \
	params drbd_resource=&quot;r1&quot; \
	op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;240s&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;100s&quot;
primitive ping ocf:pacemaker:ping \
	params host_list=&quot;192.168.1.1&quot; name=&quot;ping&quot; \
	op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;60s&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;60s&quot;
primitive share-a-exportfs ocf:heartbeat:exportfs \
	params directory=&quot;/share-a&quot; clientspec=&quot;192.168.1.0/24&quot; options=&quot;rw,async,no_subtree_check,no_root_squash&quot; fsid=&quot;1&quot; \
	op monitor interval=&quot;10s&quot; timeout=&quot;30s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;40s&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;40s&quot;
primitive share-a-fs ocf:heartbeat:Filesystem \
	params device=&quot;/dev/drbd0&quot; directory=&quot;/share-a&quot; fstype=&quot;ext3&quot; \
	op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;60s&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;60s&quot; \
	meta is-managed=&quot;true&quot;
primitive share-a-ip ocf:heartbeat:IPaddr2 \
	params ip=&quot;192.168.1.33&quot; nic=&quot;eth0&quot; \
	op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot;
primitive share-b-exportfs ocf:heartbeat:exportfs \
	params directory=&quot;/share-b&quot; clientspec=&quot;192.168.1.0/24&quot; options=&quot;rw,async,no_subtree_check,no_root_squash&quot; fsid=&quot;2&quot; \
	op monitor interval=&quot;10s&quot; timeout=&quot;30s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;40s&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;40s&quot;
primitive share-b-fs ocf:heartbeat:Filesystem \
	params device=&quot;/dev/drbd1&quot; directory=&quot;/share-b&quot; fstype=&quot;ext3&quot; \
	op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;60s&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;60s&quot; \
	meta is-managed=&quot;true&quot;
primitive share-b-ip ocf:heartbeat:IPaddr2 \
	params ip=&quot;192.168.1.34&quot; nic=&quot;eth0&quot; \
	op monitor interval=&quot;20s&quot; timeout=&quot;40s&quot;
group share-a share-a-fs share-a-exportfs share-a-ip
group share-b share-b-fs share-b-exportfs share-b-ip
ms ms-drbd0 drbd0 \
	meta master-max=&quot;1&quot; notify=&quot;true&quot;
ms ms-drbd1 drbd1 \
	meta master-max=&quot;1&quot; notify=&quot;true&quot;
clone ping_clone ping \
	meta globally-unique=&quot;false&quot;
location cli-prefer-share-a share-a \
	rule $id=&quot;cli-prefer-rule-share-a&quot; inf: #uname eq debian-lenny-nodo1
location cli-prefer-share-b share-b \
	rule $id=&quot;cli-prefer-share-b-rule&quot; inf: #uname eq debian-lenny-nodo2
location share-a_on_connected_node share-a \
	rule $id=&quot;share-a_on_connected_node-rule&quot; -inf: not_defined ping or ping lte 0
location share-b_on_connected_node share-b \
	rule $id=&quot;share-b_on_connected_node-rule&quot; -inf: not_defined ping or ping lte 0
colocation share-a_on_ms-drbd0 inf: share-a ms-drbd0:Master
colocation share-b_on_ms-drbd1 inf: share-b ms-drbd1:Master
order share-a_after_ms-drbd0 inf: ms-drbd0:promote share-a:start
order share-a_after_ms-drbd1 inf: ms-drbd1:promote share-b:start
property $id=&quot;cib-bootstrap-options&quot; \
	dc-version=&quot;1.0.8-042548a451fce8400660f6031f4da6f0223dd5dd&quot; \
	cluster-infrastructure=&quot;Heartbeat&quot; \
	stonith-enabled=&quot;false&quot; \
	no-quorum-policy=&quot;ignore&quot; \
	last-lrm-refresh=&quot;1284661245&quot;</pre></div></div>

<p><strong>Test funzionale</strong></p>
<p>Una volta montato da parte di un client lo share NFS:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># mount -t nfs 192.168.1.33:/share-a /mnt/</pre></div></div>

<p>è possibile lanciare sempre sul client una copia arbitraria di file:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">cp -av /usr/ /mnt/</pre></div></div>

<p>partirà la copia dei file e sarà possibile agire quindi sul cluster, tenendo monitorato sia la copia che lo stato attraverso <em>crm_mon</em>.</p>
<p><em>Primo test: disconnessione cavo LAN nodo master</em></p>
<p>Alla disconnessione del cavo la risorsa <em>ping</em> avverte immediatamente l&#8217;assenza di connettività e forza la migrazione del gruppo <em>share-a</em> al nodo rimanente, in questo caso il debian-lenny-nodo1. Il tutto è osservabile dal file /var/log/syslog:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Sep 17 18:05:35 debian-lenny-nodo2 heartbeat: [1079]: info: Link debian-lenny-nodo1:eth0 dead.
...
Sep 17 18:05:46 debian-lenny-nodo2 kernel: [20384.996634] block drbd1: peer( Primary -&gt; Secondary ) 
...
Sep 17 18:05:50 debian-lenny-nodo2 Filesystem[27581]: [27636]: INFO: Running start for /dev/drbd0 on /share-a
...
Sep 17 18:05:50 debian-lenny-nodo2 kernel: [20389.636665] EXT3-fs: mounted filesystem with ordered data mode.
...
Sep 17 18:05:51 debian-lenny-nodo2 exportfs[27676]: [27739]: INFO: File system exported
...
Sep 17 18:05:52 debian-lenny-nodo2 IPaddr2[27764]: [27817]: INFO: ip link set eth0 up
...</pre></div></div>

<p>Lato client, la scrittura su NFS si ferma per qualche secondo e riparte appena l&#8217;ultima operazione di start è eseguita da Pacemaker.</p>
<p><em>Secondo test: migrazione manuale delle risorse</em></p>
<p>Lanciando il comando <em>migrate</em> sulla risorsa <em>share-a</em> viene forzato manualmente lo switch della risorsa dal nodo attuale al nodo indicato:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">crm resource migrate share-a debian-lenny-nodo1</pre></div></div>

<p>Quanto il cluster fa in questo genere di operazione è quello di modificare la stessa <em>location</em> descritta poco sopra:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure show
...
...
location cli-prefer-share-a share-a \
	rule $id=&quot;cli-prefer-rule-share-a&quot; -inf: #uname eq debian-lenny-nodo1
...
...</pre></div></div>

<p>In sostanza la <em>location</em> prima impostata su <em>share-a</em> è stata modificata da Pacemaker da <em>inf</em> a <em>-inf</em> invertendo il vincolo che legava la risorsa al nodo <em>debian-lenny-nodo1</em>.<br />
E&#8217; necessario porre particolare attenzione a questa regola, poiché il peso <em>-inf</em> implica che la risorsa sarà da qui in poi SEMPRE associata al nodo <em>debian-lenny-nodo2</em>, poiché non potrà più risiedere sul nodo originale.</p>
<p>Per ripristinare la situazione originaria e rimuovere la regola aggiunta esistono due modi:</p>
<ol>
<li>Lanciare il comando precedente utilizzando <em>unmigrate</em>, in modo che la risorsa torni sul nodo originale (e la regola verrà cancellata, eliminando anche l&#8217;impostazione della configurazione originale);</li>
<li>Modificare a mano la configurazione del cluster attraverso il comando <em>crm configure edit</em> rimuovendo la linea aggiunta automaticamente, in modo da lasciare la risorsa dove si trova ora senza vincolarne i futuri spostamenti;</li>
</ol>
<p>Lato client l&#8217;operazione è ancora più indolore di prima: dai log il comportamento è simile al precedente test e la scrittura sullo share NFS si ferma il tempo che la risorsa migra.</p>
<p><em>Terzo test: spegnimento improvviso nodo master</em></p>
<p>Lo spegnimento improvviso del nodo <em>master</em> rende il comportamento del cluster del tutto simile a quello illustrato primo test, con una differenza sostanziale:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
Sep 17 18:36:37 debian-lenny-nodo2 heartbeat: [1079]: WARN: node debian-lenny-nodo1: is dead
...
Sep 17 18:36:37 debian-lenny-nodo2 crmd: [1120]: WARN: check_dead_member: Our DC node (debian-lenny-nodo1) left the cluster
...
Sep 17 18:36:37 debian-lenny-nodo2 kernel: [22236.912107] block drbd0: peer( Primary -&gt; Unkno
wn ) conn( Connected -&gt; NetworkFailure ) pdsk( UpToDate -&gt; DUnknown ) 
...</pre></div></div>

<p>Il cluster ha dovuto rimpiazzare il proprio <em>DC</em> (<em>Designated Coordinator</em>) poiché spento ed ovviamente il dispositivo drbd è in stato <em>Primary</em> sul nodo sopravvissuto, ma ovviamente in stato <em>Unknown</em> nella sua replica.</p>
<p>Anche in questo caso, lato client tutto si è svolto in maniera trasparente, la copia si è fermata per qualche secondo per poi ripartire.</p>
<p><strong>Conclusioni</strong></p>
<p>La soluzione illustrata descrive a pieno le potenzialità del progetto Pacemaker. E&#8217; possibile combinare i suggerimenti espressi in questo lungo articolo immaginando di disporre di un cluster composto da più di due macchine, o segmentando ulteriormente le <em>share</em> esposte, creando ulteriori <em>volumi logici</em> e dispositivi <em>drbd</em>.<br />
Il tutto con dei costi decisamente contenuti rispetto alle soluzioni <em>NAS</em> in commercio: in pratica il solo prezzo dell&#8217;hardware!<br />
Bene, con quest&#8217;ultima parte la serie &#8220;Evoluzione dell&#8217;alta affidabilità su Linux&#8221; può dirsi conclusa. Sicuramente &#8220;Mia Mamma Usa Linux&#8221; tornerà su temi inerenti l&#8217;argomento, magari trattando l&#8217;integrazione delle tecniche di virtualizzazione nel cluster, utilizzando <em>virtual machines</em> come fossero risorse da migrare, magari senza necessità che i sistemi virtualizzati vengano spenti!<br />
Commenti sulla serie sono ben accetti, suggerimenti su futuri argomenti anche di più, proposte di collaborazione sono in assoluto il meglio.<br />
Lunga vita al software libero.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2010/09/evoluzione-dellalta-affidabilita-su-linux-realizzare-un-nas-con-pacemaker-drbd-ed-exportfs/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Evoluzione dell’alta affidabilità su Linux: confronto pratico tra Heartbeat classico ed Heartbeat con Pacemaker</title>
		<link>http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/</link>
		<comments>http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 07:00:44 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=966</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160; Nel precedente articolo è stata affrontata l&#8217;evoluzione del progetto Heartbeat, dalla versione iniziale in cui il supporto era limitato a due macchine e con un CRM (Cluster Resource Manager) dalle funzionalità ridotte, per arrivare all&#8217;evoluzione del progetto culminata in Pacemaker, il CRM avanzato con il quale è possibile specificare priorità, ordini e dipendenze delle [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux-ha.png" alt="linux-ha" title="linux-ha" width="100" height="100" class="alignnone size-full wp-image-259" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2009/11/pacemaker.png" alt="Pacemaker" title="pacemaker" width="100" height="100" class="size-full wp-image-872" /></p>
<p>Nel precedente articolo è stata affrontata l&#8217;evoluzione del progetto Heartbeat, dalla versione iniziale in cui il supporto era limitato a due macchine e con un <em>CRM</em> (<em>Cluster Resource Manager</em>) dalle funzionalità ridotte, per arrivare all&#8217;evoluzione del progetto culminata in <em>Pacemaker</em>, il CRM avanzato con il quale è possibile specificare priorità, ordini e dipendenze delle risorse al fine di ottenere il controllo totale su quanto erogato dal cluster.<br />
In questo nuovo articolo viene analizzata a fondo, con un esempio pratico, la configurazione delle due modalità operative di Heartbeat, al fine di effettuare un confronto sul funzionamento del cluster con e senza <em>Pacemaker</em>.</p>
<p><strong>Versioni di Heartbeat ed installazione</strong></p>
<p>Fino alla versione 3 il progetto Heartbeat era un unico monolite contenente tutte le componenti funzionali all&#8217;esecuzione del software. L&#8217;evoluzione del programma ha comportato la suddivisione dello stesso in sotto progetti, ciascuno sviluppato indipendentemente rispetto agli altri, ma critico per una specifica funzione all&#8217;interno dell&#8217;architettura cluster.<br />
Ad oggi l&#8217;intero progetto Heartbeat è quindi suddiviso in tre componenti:</p>
<ol>
<li><em><strong>Heartbeat</strong></em>: comprendente il demone heartbeat, fornitore dell&#8217;infrastruttura cluster;</li>
<li><strong><em>Cluster Glue</em></strong>: un insieme di librerie con scopi specifici:
<ul>
<li><em>LRM</em> (<em>Local Resource Manager</em>): incaricato di ricevere le istruzioni dal CRM, passarle ai <em>Resource Agents</em> e riportarne l&#8217;esito;</li>
<li><em>STONITH</em> (<em>Shoot The Other Node In The Head</em>): incaricato di gestire situazioni ambigue in cui una risorsa potrebbe essere utilizzata contemporaneamente da più nodi;</li>
<li><em>hb_report</em>: incaricato di fornire dettagli sugli errori che si verificano nel sistema;</li>
<li><em>Cluster Plumbing Library</em>:una libreria per la comunicazioni interne al cluster;</li>
</ul>
<li><strong><em>Resource Agents</em></strong>: comprendente un insieme di script standard per le risorse del cluster;</li>
</ol>
<p>A ciascuna di queste componenti corrisponde un pacchetto scaricabile dalla sezione downloads del sito di Heartbeat: <a href="http://www.linux-ha.com/wiki/Downloads">http://www.linux-ha.com/wiki/Downloads</a>.<br />
Le maggiori distribuzioni al momento distribuiscono ancora pacchetti di Heartbeat nelle versioni precedenti alla 3.<br />
Scegliendo di utilizzare la versione più recente di ciascun software, è quindi possibile ricompilare manualmente i pacchetti partendo dai sorgenti oppure utilizzare pacchetti ricompilati.<br />
Nel caso si usasse <em>Debian Lenny</em> è possibile dichiarare il seguente repository all&#8217;interno del file <em>/etc/apt/sources.list</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">deb http://people.debian.org/~madkiss/ha lenny main</pre></div></div>

<p>Mentre per <em>Ubuntu Hardy Heron</em> i repository sono i seguenti:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">deb http://ppa.launchpad.net/ubuntu-ha/ppa/ubuntu karmic main</pre></div></div>

<p><em>Ubuntu Lucid Lynx</em> supporta invece la versione più recente della suite Heartbeat.</p>
<p>Per l&#8217;installazione sarà quindi necessario utilizzare lo strumento di gestione pacchetti fornito con la propria distribuzione: <em>apt</em> per <em>Debian</em> ed <em>Ubuntu</em>, <em>yast</em> per <em>SuSe/OpenSuse</em> e <em>yum</em> per <em>CentOS/RedHat</em>.</p>
<p>L&#8217;esempio che verrà implementato nel corso dell&#8217;articolo prevede la messa in alta affidabilità di due servizi nelle due versioni di Heartbeat: un indirizzo IP ed il webserver apache2. Il presupposto da cui si partirà è quello di avere un cluster composto da due nodi, collegati ciascuno alla rete locale (192.168.1.0/24) e l&#8217;uno all&#8217;altro da un cavo cross (10.0.0.0/24).</p>
<p><strong>Configurazione di Heartbeat in modalità classica (senza CRM)</strong></p>
<p>Sebbene Heartbeat sia giunto ormai alla versione 3.0.3 ed il CRM sia stato introdotto dalla versione 2, la modalità predefinita con cui il software viene avviato è quella senza CRM.<br />
Qualsiasi configurazione Heartbeat 1.x quindi funzionerà verosimilmente su tutte le versioni successive.<br />
Al di là delle innovazioni a livello software apportate al progetto, il principio di funzionamento senza CRM rimane quindi invariato, così come i file di configurazione necessari al funzionamento del cluster, come illustrato nel precedente articolo.<br />
Il primo di questi è <em>/etc/ha.d/ha.cf</em>, il cui contenuto dovrà essere simile a quanto segue (ed identico in entrambi i nodi):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">##      keepalive: how long between heartbeats?
keepalive 1
##      deadtime: how long-to-declare-host-dead?
deadtime 10
##      warntime: how long before issuing &quot;late heartbeat&quot; warning?
warntime 5
##      Very first dead time (initdead)
initdead 20
##      What interfaces to unicast heartbeats over?
ucast eth1 10.0.0.1
ucast eth1 10.0.0.2
ucast eth0 192.168.1.86
ucast eth0 192.168.1.66
##      Should we autofailback?
auto_failback off
##      Who is part of the cluster?
node    debian-lenny-nodo1
node    debian-lenny-nodo2
##      Network monitoring
ping 192.168.1.50
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster</pre></div></div>

<p>I commenti presenti all&#8217;interno del listato rendono le opzioni autoesplicative. Particolare attenzione va posta relativamente ad alcune opzioni:</p>
<p><em>auto_failback</em> si riferisce alle risorse: se impostata ad &#8220;on&#8221; nel momento in cui una risorsa effettua uno switch su un nodo differente dall&#8217;attuale (per via di un malfunzionamento di quest&#8217;ultimo) nel momento in cui il nodo tornerà attivo la risorsa effettuerà un nuovo switch.</p>
<p><em>ping</em> definisce un indirizzo ip che verrà usato come riferimento per capire se un nodo è parte della rete: &#8220;vedendo&#8221; l&#8217;indirizzo indicato il nodo avrà coscienza di essere presente sulla rete. A tutti gli effetti l&#8217;ip indicato è considerato un nodo del cluster, pertanto dovrà essere un ip affidabile, ad esempio quello del gateway di rete. E&#8217; inoltre possibile definire un gruppo di ip, attraverso la direttiva <em>ping_group</em> in modo da non affidarsi ad un unico host per il monitoring.</p>
<p><em>respawn</em> e <em>apiauth</em> definiscono rispettivamente un comando e l&#8217;utente con cui questo deve essere lanciato. Insieme alla definizione del nodo ping completano la parte di monitoraggio della connettività necessaria ad Heartbeat per regolarsi in caso di connettività limitata od assente.</p>
<p>Le ultime tre opzioni descritte, come apparirà chiaro in seguito, risultano di importanza critica in configurazioni senza CRM.</p>
<p>Il secondo file essenziale alla costruzione del cluster è <em>/etc/ha.d/haresources</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">debian-lenny-nodo1 IPaddr::192.168.1.200/24/eth0 apache2</pre></div></div>

<p>Il contenuto definisce il nodo master per le due risorse definite: l&#8217;indirizzo ip 192.168.1.200 (associato all&#8217;interfaccia eth0) e apache2, il demone che controlla il webserver. Entrambe le risorse verranno quindi, in condizioni normali, avviate sul nodo identificato come <em>debian-lenny-nodo1</em>.</p>
<p>L&#8217;ultimo file ad essere creato è <em>/etc/ha.d/authkeys</em> e contiene le informazioni per la sicurezza delle comunicazioni tra i due nodi. Non essendo vincolante ai fini del progetto avere una comunicazione criptata tra i nodi, il contenuto del file può essere il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">auth 1
1 crc</pre></div></div>

<p>Che sta ad indicare come non esisterà sicurezza nella comunicazione fra i nodi (eccettuato il controllo sulla corruzione dei pacchetti).</p>
<p>Prima di avviare il demone per la prima volta ed effettuare i test è necessario accertarsi che il demone apache non venga avviato al boot del sistema, poiché verrà gestito da heartbeat. In <em>Debian/Ubuntu</em> si può rimuovere così:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># update-rc.d -f apache2 remove</pre></div></div>

<p>Mentre in <em>RedHat/Centos/Opensuse</em> il comando da usare è chkconfig:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># chkconfig --level 123456 apache2 off</pre></div></div>

<p>A questo punto è possibile avviare su entrambi i nodi il demone heartbeat:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /etc/init.d/heartbeat start</pre></div></div>

<p>dopo alcuni minuti i servizi dovrebbero salire sul nodo che secondo quanto impostato nella configurazione sarà master, <em>debian-lenny-nodo1</em>. Il tutto è verificabile attraverso il controllo sullo stato dell&#8217;interfaccia <em>eth0:0</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ifconfig eth0:0
eth0:0    Link encap:Ethernet  HWaddr 08:00:27:59:18:22  
          inet addr:192.168.1.200  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:10 Base address:0xd020</pre></div></div>

<p>E sull&#8217;effettiva esecuzione del demone apache2:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ps -ef| grep apache
root      2052     1  0 11:30 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  2053  2052  0 11:30 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  2054  2052  0 11:30 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  2057  2052  0 11:30 ?        00:00:00 /usr/sbin/apache2 -k start</pre></div></div>

<p><strong>Test di Heartbeat in modalità classica (senza CRM)</strong></p>
<p>Il comportamento nelle varie situazione del demone heartbeat è osservabile attraverso il principale file di log di sistema, su entrambi i nodi:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">tail -f /var/log/syslog</pre></div></div>

<p><span style="color: #505050;"><em>Primo test: disconnessione cavo LAN</em></span></p>
<p>Il primo test riguarderà la disconnessione del cavo di rete LAN relativo al nodo master, l&#8217;operazione genererà alcune righe di log, la più importante delle quali, sull&#8217;unico nodo rimasto attivo in rete, riporterà quanto segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
ResourceManager[14403]: [14415]: info: Acquiring resource group: debian-lenny-nodo1 IPaddr::192.168.1.200/24/eth0 apache2
...</pre></div></div>

<p>l&#8217;indicazione è chiara: le risorse sono state acquisite dal nodo secondario. A rilevare l&#8217;assenza di connettività è stato, come precedentemente illustrato, l&#8217;esegubile <em>ipfail</em>.</p>
<p><span style="color: #505050;"><em>Secondo test: disconnessione cavo Heartbeat</em></span></p>
<p>Il secondo test prevede la rimozione del cavo che collega i due nodi del cluster:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
Apr  8 16:24:16 debian-lenny-nodo1 kernel: [17722.012482] eth1: link down
Apr  8 16:24:25 debian-lenny-nodo1 heartbeat: [14269]: info: Link debian-lenny-nodo2:eth1 dead.
Apr  8 16:24:25 debian-lenny-nodo1 ipfail: [14297]: info: Link Status update: Link debian-lenny-nodo2/eth1 now has status dead
Apr  8 16:24:25 debian-lenny-nodo1 ipfail: [14297]: debug: Found ping node 192.168.1.50!
Apr  8 16:24:26 debian-lenny-nodo1 ipfail: [14297]: info: Asking other side for ping node count.
Apr  8 16:24:26 debian-lenny-nodo1 ipfail: [14297]: debug: Message [num_ping] sent.
Apr  8 16:24:26 debian-lenny-nodo1 ipfail: [14297]: info: Checking remote count of ping nodes.
Apr  8 16:24:27 debian-lenny-nodo1 ipfail: [14297]: debug: Got asked for num_ping.
Apr  8 16:24:27 debian-lenny-nodo1 ipfail: [14297]: debug: Found ping node 192.168.1.50!
Apr  8 16:24:28 debian-lenny-nodo1 ipfail: [14297]: info: Ping node count is balanced.
Apr  8 16:24:28 debian-lenny-nodo1 ipfail: [14297]: debug: Abort message sent.
Apr  8 16:24:28 debian-lenny-nodo1 ipfail: [14297]: info: No giveup timer to abort.
...</pre></div></div>

<p>I messaggi riguardano l&#8217;interfaccia secondaria e, come è osservabile, la perdita di questa interfaccia non provoca alcun tipo di switch, in quanto la comunicazione tra i nodi funziona ancora attraverso l&#8217;interfaccia primaria, quindi attraverso la LAN.</p>
<p><span style="color: #505050;"><em>Terzo test: spegnimento improvviso nodo master</em></span></p>
<p>Il terzo test consiste nella rimozione improvvisa dell&#8217;alimentazione relativa al nodo master:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Apr  8 16:24:16 debian-lenny-nodo2 heartbeat: [8170]: WARN: node debian-lenny-nodo1: is dead
Apr  8 16:24:16 debian-lenny-nodo2 ipfail: [8233]: info: Status update: Node debian-lenny-nodo1 now has status dead
...
...
Apr  8 16:24:16 debian-lenny-nodo2 ResourceManager[8913]: [8925]: info: Acquiring resource group: debian-lenny-nodo1 IPaddr::192.168.1.200/24/eth0 apache2
Apr  8 16:24:17 debian-lenny-nodo2 ipfail: [8233]: debug: Found ping node 192.168.1.50!
Apr  8 16:24:17 debian-lenny-nodo2 IPaddr[8937]: [8972]: INFO:  Resource is stopped
Apr  8 16:24:17 debian-lenny-nodo2 ResourceManager[8913]: [8987]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.1.200/24/eth0 start
Apr  8 16:24:17 debian-lenny-nodo2 ipfail: [8233]: info: NS: We are still alive!
...
...</pre></div></div>

<p>Lo switch avviene in maniera corretta, è possibile notare il messaggio &#8220;We are still alive!&#8221; che indica come il nodo secondario abbia rilevato che il nodo primario sia assente, acquisendone le risorse, una volta accertato il proprio grado di connettività con la rete.</p>
<p><span style="color: #505050;"><em>Quarto test: migrazione manuale delle risorse</em></span></p>
<p>Heartbeat dispone di un ristretto set di comandi che consentono di interagire con le risorse. Questi comandi sono contenuti nella cartella <em>/usr/share/heartbeat/</em>, ed il comando che consente di gestire le risorse dichiarate è <em>hb_takeover</em>, la cui sintassi d&#8217;impiego è la seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /usr/share/heartbeat/hb_standby all|foreign|local|failback</pre></div></div>

<p>I parametri passabili al comando comprendono la possibilità da parte di un nodo di acquisire tutte le risorse (<em>all</em>), le risorse del nodo secondario (<em>foreign</em>), le risorse di proprietà (<em>local</em>), le risorse precedentemente migrate (<em>failback</em>).<br />
Nel caso che si vuole simulare il nodo secondario lancerà il seguente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /usr/share/heartbeat/hb_standby foreign</pre></div></div>

<p>Ed il comportamento del cluster, osservabile dal nodo primario, sarà il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Apr  8 16:28:36 debian-lenny-nodo1 heartbeat: [14269]: info: debian-lenny-nodo1 wants to go standby [local]
Apr  8 16:28:36 debian-lenny-nodo1 heartbeat: [14269]: info: standby: debian-lenny-nodo2 can take our local resources
Apr  8 16:28:36 debian-lenny-nodo1 heartbeat: [14859]: info: give up local HA resources (standby).
Apr  8 16:28:36 debian-lenny-nodo1 ResourceManager[14872]: [14884]: info: Releasing resource group: debian-lenny-nodo1 IPaddr::192.168.1.200/24/eth0 apache2
Apr  8 16:28:36 debian-lenny-nodo1 ResourceManager[14872]: [14895]: info: Running /etc/init.d/apache2  stop
Apr  8 16:28:38 debian-lenny-nodo1 ResourceManager[14872]: [14929]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.1.200/24/eth0 stop
Apr  8 16:28:38 debian-lenny-nodo1 IPaddr[14956]: [14968]: INFO: ifconfig eth0:0 down
Apr  8 16:28:38 debian-lenny-nodo1 IPaddr[14930]: [14972]: INFO:  Success</pre></div></div>

<p>Le risorse sono state correttamente spostate su <em>debian-lenny-nodo2</em>.</p>
<p><span style="color: #505050;"><em>Quinto test: standby manuale di un nodo</em></span></p>
<p>Il quinto test della serie prevederà la messa in standby del nodo attivo, al fine di verificare il corretto spostamento delle risorse. Il controllo di questa funzionalità da parte del cluster è possibile mediante lo stesso comando precedentemente illustrato, lanciato senza argomenti (che equivale a lanciarlo parametro &#8220;all&#8221;) sul secondo nodo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /usr/share/heartbeat/hb_standby</pre></div></div>

<p>Il comportamento è il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Apr  8 16:29:48 debian-lenny-nodo1 heartbeat: [14269]: info: debian-lenny-nodo2 wants to go standby [all]
Apr  8 16:29:49 debian-lenny-nodo1 ipfail: [14297]: debug: Other side is unstable.
Apr  8 16:29:51 debian-lenny-nodo1 heartbeat: [14269]: info: standby: acquire [all] resources from debian-lenny-nodo2
Apr  8 16:29:51 debian-lenny-nodo1 heartbeat: [14974]: info: acquire all HA resources (standby).
Apr  8 16:29:51 debian-lenny-nodo1 ResourceManager[14987]: [14999]: info: Acquiring resource group: debian-lenny-nodo1 IPaddr::192.168.1.200/24/eth0 apache2
Apr  8 16:29:52 debian-lenny-nodo1 IPaddr[15011]: [15046]: INFO:  Resource is stopped
Apr  8 16:29:52 debian-lenny-nodo1 ResourceManager[14987]: [15061]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.1.200/24/eth0 start
Apr  8 16:29:53 debian-lenny-nodo1 IPaddr[15088]: [15121]: INFO: Using calculated netmask for 192.168.1.200: 255.255.255.0
Apr  8 16:29:53 debian-lenny-nodo1 IPaddr[15088]: [15143]: INFO: eval ifconfig eth0:0 192.168.1.200 netmask 255.255.255.0 broadcast 192.168.1.255
Apr  8 16:29:53 debian-lenny-nodo1 IPaddr[15062]: [15162]: INFO:  Success
Apr  8 16:29:53 debian-lenny-nodo1 ResourceManager[14987]: [15183]: info: Running /etc/init.d/apache2  start</pre></div></div>

<p>Tutte le risorse vengono acquisite dal nodo <em>debian-lenny-nodo2</em>.</p>
<p><span style="color: #505050;"><em>Sesto test: interruzione manuale di un servizio</em></span></p>
<p>L&#8217;ultimo test della serie comprende lo stop manuale di uno dei servizi erogati. Ad esempio apache:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /etc/init.d/apache2 stop</pre></div></div>

<p>è facile verificare come nessuna azione venga svolta da Heartbeat, il servizio infatti rimane spento, e l&#8217;unica via per fare in modo che il cluster lo riavvii è quella di mandare in standby manualmente il nodo.</p>
<p>Gli ultimi tre test mostrano come in realtà il controllo manuale del cluster sia unicamente la simulazione della messa in standby di un nodo o lo stop di un servizio attivo. Lo standby non avviene in maniera totale, il nodo non viene escluso dal cluster, semplicemente rilascia le proprie risorse e lo stesso vale per i servizi.<br />
Quanto descritto rappresenta una grossa differenza nei confronti dell&#8217;utilizzo del CRM Pacemaker, ed il concetto sarà ancora più chiaro nei paragrafi successivi.</p>
<p><strong>Configurazione di Heartbeat in modalità CRM con Pacemaker</strong></p>
<p>L&#8217;esecuzione di Heartbeat in modalità CRM prevede che nel sistema sia installato il pacchetto Pacemaker. Questo pacchetto è disponibile nelle maggiori distribuzioni (e nei repository indicati nel primo capitolo dell&#8217;articolo) e tra le varie librerie e file che installa uno su tutti sarà fondamentale nel proseguo dell&#8217;articolo: <em>/usr/sbin/crm</em>. Come verrà illustrato in seguito il comando <em>crm</em> consente di interagire direttamente con il cluster, il suo comportamento e la sua configurazione.<br />
Prima di procedere è necessario predisporre nuovamente il file di configurazione <em>/etc/ha.d/ha.cf</em> con questo contenuto, su entrambi i nodi:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">autojoin none
keepalive 1
deadtime 10
warntime 5
initdead 20
mcast eth0 239.0.0.43 694 1 0
bcast eth1
node    debian-lenny-nodo1
node    debian-lenny-nodo2
crm respawn</pre></div></div>

<p>Le differenze con la precedente configurazione sono subito evidenti. Esiste una nuova opzione chiamata <em>autojoin none</em> che disabilita la funzione automatica di scoperta ed aggiunta di nodi sulla rete, inoltre sono state modificate le informazioni relative alla rete: non viene più definito un <a href="http://it.wikipedia.org/wiki/Unicast">unicast</a> per ciascuna interfaccia interessate alla comunicazione del cluster, i pacchetti viaggeranno in <a href="http://it.wikipedia.org/wiki/Multicast">multicast</a> per la rete locale ed in <a href="http://it.wikipedia.org/wiki/Broadcasting_(informatica)">broadcast</a> per la rete non condivisa (il cavo cross che collega le due macchine).<br />
Infine, l&#8217;opzione <em>crm respawn</em> indica che il cluster userà il Cluster Resource Manager, Pacemaker.<br />
Va sottolineato come siano assenti i parametri relativi al monitoraggio della connettività, che verrà gestita in maniera totale da Pacemaker.<br />
E&#8217; chiaro come in questa configurazione il file /etc/ha.d/haresources non ha più ragione di esistere in quanto, così come spiegato nel precedente articolo, a preoccuparsi della gestione delle risorse è il CRM stesso.<br />
Il file relativo al protocollo di comunicazione e sicurezza <em>/etc/ha.d/authkeys</em> rimane invece identico.</p>
<p>E&#8217; quindi possibile avviare Heartbeat per la prima volta:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /etc/init.d/heartbeat start</pre></div></div>

<p>Le fasi di avvio sono visibili attraverso il log, oppure utilizzando il già citato comando <em>crm</em> con il parametro <em>status</em>.<br />
Inizialmente lo stato del cluster sarà il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm status
============
Last updated: Wed Jun 16 11:34:38 2010
Current DC: NONE
0 Nodes configured, unknown expected votes
0 Resources configured.
============</pre></div></div>

<p>Dopo qualche minuto, una volta che i nodi avranno avviato le comunicazioni la situazione varierà in questa forma:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm status
============
Last updated: Wed Jun 16 11:35:48 2010
Stack: Heartbeat
Current DC: debian-lenny-nodo2 (e1f7faf3-7152-4c51-bfc4-b5382944a62e) - partition with quorum
Version: 1.0.8-2c98138c2f070fcb6ddeab1084154cffbf44ba75
2 Nodes configured, unknown expected votes
0 Resources configured.
============
&nbsp;
Online: [ debian-lenny-nodo1 debian-lenny-nodo2 ]</pre></div></div>

<p>Il cluster può dirsi così avviato. Sebbene non ci siano risorse configurate (&#8220;<em>0 Resources configured.</em>&#8220;) i due nodi configurati risultano &#8220;Online&#8221;, pronti cioè ad erogare risorse e <em>debian-lenny-nodo2</em> ha il ruolo di <em>DC</em>, <em>Designated Coordinator</em>, il nodo &#8220;master&#8221; che guiderà cioè le operazioni.</p>
<p>Qualsiasi tipo di configurazione sul cluster può essere effettuata attraverso il comando <em>crm</em>, mediante il parametro <em>configure</em> seguito dalle impostazioni da modificare.<br />
Di seguito in quattro fasi viene illustrata una configurazione che rispetti fedelmente quanto fatto per la versione senza CRM.</p>
<p><span style="color: #505050;"><strong>Prima fase: comportamento generale del cluster</strong></span></p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure property stonith-enabled=&quot;false&quot;</pre></div></div>

<p>Disabilitazione dello <em>stonith</em>: come anticipato in apertura di articolo, lo stonith prevede la configurazione di device specifici che possano essere guidati al fine di spegnere immediatamente un nodo in situazioni in cui non si ha la certezza di quale nodo sia ancora vivo. Nel caso illustrato la configurazione dello stonith verrà pertanto disabilitato.<br />
Una interessante documentazione su come configurare lo stonith su Heartbeat è disponibile sul sito Novell, a <a href="http://www.novell.com/documentation/sles10/heartbeat/?page=/documentation/sles10/heartbeat/data/b8nrkl5.html"><br />
questo indirizzo</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure property no-quorum-policy=&quot;ignore&quot;</pre></div></div>

<p>Non considerazione dell&#8217;assenza di quorum: se la locazione comune dei dati relativi al cluster (quorum) non sarà accessibile da parte dei nodi, il cluster non dovrà prendere alcun provvedimento. Le opzioni disponibili sono <em>ignore</em>, <em>stop</em>, <em>freeze</em> e <em>suicide</em>.<br />
Il valore <em>stop</em> porterà il cluster a fermare ordinatamente tutte le risorse.<br />
Il valore <em>freeze</em> consentirà al cluster di continuare ad erogare le risorse in esecuzione senza però avviarne di nuove.<br />
Il valore <em>suicide</em> obbligherà il cluster a spegnere immediatamente tutti i nodi con limitato accesso al quorum.</p>
<p>Chiaramente le due opzioni <em>stonith-enabled</em> e <em>no-quorum-policy</em> non vengono considerate nella configurazione classica. Il concetto di <em>quorum</em> e <em>stonith</em> si applica solo a cluster gestiti da CRM, in cui esiste una memoria comune.</p>
<p><span style="color: #505050;"><strong>Seconda fase: controllo della connettività</strong></span></p>
<p>Il controllo della connettività con Pacemaker è possibile attraverso la definizione di una risorsa denominata &#8220;ping&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure primitive ping ocf:pacemaker:ping params host_list=&quot;192.168.1.1&quot; name=&quot;ping&quot; op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot; op start timeout=&quot;60s&quot; op stop timeout=&quot;60s&quot;</pre></div></div>

<p>Il comando crea una risorsa (<em>primitive</em>) denominata <em>ping</em>, il cui <em>Resource Agent</em> (RA) è di tipo <em>ocf</em>, fornito da <em>pacemaker</em>: il path effettivo dell&#8217;eseguibile sarà quindi <em>/usr/lib/ocf/resource.d/pacemaker/ping</em> (si veda l&#8217;articolo precedente per l&#8217;approfondimento sulle tipologie di resource agent e loro posizionamento).<br />
Il RA supporta diversi parametri, fra questi <em>host_list</em> deve contenere la lista degli host da controllare per verificare la connettività (in questo caso il gateway di rete) e <em>name</em> dovrà corrispondere al nome interno della risorsa (si veda la quarta fase).<br />
Infine le indicazioni che seguono le voci &#8220;op&#8221; (abbreviazione di <em>operations</em>) consentono di definire le politiche di monitoring della risorsa: come deve essere controllata (ad intervalli di 10 secondi e con 60 secondi di timeout) ed in quanto tempo si deve avviare e fermare (entro i 60 secondi di timeout).</p>
<p>La definizione della risorsa ping non è però sufficiente per fornire ad ogni nodo uno strumento per il controllo della connettività, poiché, definita nel modo indicato, la risorsa <em>ping</em> verrà eseguita su un unico nodo. Proprio per ovviare a questo problema e fare in modo che la stessa risorsa possa girare su più nodi è possibile <em>clonarla</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure clone ping_clone ping meta globally-unique=&quot;false&quot;</pre></div></div>

<p>Il comando indica al cluster di creare la risorsa <em>ping_clone</em> che girerà su tutti i nodi, indistintamente (meta globally-unique=&#8221;false&#8221;).</p>
<p><span style="color: #505050;"><strong>Terza fase: definizione delle risorse</strong></span></p>
<p>Per riprodurre il test e confrontarlo con il precedente rimangono da definire le due risorse scelte ip e apache. La risorsa ip verrà dichiarata come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure primitive cluster-ip ocf:heartbeat:IPaddr2 params ip=&quot;192.168.1.200&quot; nic=&quot;eth0&quot; op monitor interval=&quot;10s&quot; timeout=&quot;20s&quot; op start timeout=&quot;20s&quot; op stop timeout=&quot;20s&quot;</pre></div></div>

<p>il nome della risorsa è <em>cluster-ip</em> ed il resource agent utilizzato sarà di tipo OCF, con fornitore heartbeat.<br />
I parametri comprendono l&#8217;indirizzo ip che verrà erogato ed il nic (la scheda di rete) a cui verrà associato.<br />
Per quanto riguarda le politiche di monitoring vale quanto detto poco sopra per la risorsa ping.</p>
<p>Il servizio apache2 verrà dichiarato in maniera similare:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">crm configure primitive cluster-apache2 ocf:heartbeat:apache params configfile=&quot;/etc/apache2/apache2.conf&quot; httpd=&quot;/usr/sbin/apache2&quot; port=&quot;80&quot; op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot; op start timeout=&quot;40s&quot; op stop timeout=&quot;60s&quot;</pre></div></div>

<p>E&#8217; da notare che il Resource Agent utilizzato non è, come per la configurazione di Heartbeat senza CRM, lo script di avvio del demone presente in /etc/init.d, ma un vero e proprio resource agent di tipo OCF. I parametri necessari al funzionamento sono il file di configurazione (configfile), l&#8217;eseguibile del demone (httpd) e la porta su cui apache sarà in ascolto (port).<br />
Anche in questo caso per le opzioni di monitoring vale quanto espresso in precedenza.</p>
<p>Per completare la configurazione delle risorse verrà definito un gruppo, denominato <em>cluster</em>, a cui verranno associate le risorse definite:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure group cluster cluster-ip cluster-apache2</pre></div></div>

<p>Il gruppo <em>cluster</em> potrà essere utilizzato nella configurazione come un unica risorsa, le cui operazioni di avvio e stop rispetteranno l&#8217;ordine indicato nella definizione: in fase di start del gruppo cluster verrà avviato prima <em>cluster-ip</em> e poi <em>cluster-apache2</em>, in fase di stop verrà prima stoppato <em>cluster-apache2</em> e poi <em>cluster-ip</em>.</p>
<p><span style="color: #505050;"><strong>Quarta fase: associazione delle risorse al nodo attivo</strong></span></p>
<p>La configurazione del cluster, definiti i parametri di monitoraggio della connessione ed il gruppo delle risorse, potrebbe sembrare a questo punto completa:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm status
============
Last updated: Wed Jun 16 15:36:43 2010
Stack: Heartbeat
Current DC: debian-lenny-nodo2 (e1f7faf3-7152-4c51-bfc4-b5382944a62e) - partition with quorum
Version: 1.0.8-2c98138c2f070fcb6ddeab1084154cffbf44ba75
2 Nodes configured, unknown expected votes
2 Resources configured.
============
&nbsp;
Online: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
&nbsp;
 Clone Set: ping_clone
     Started: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
 Resource Group: cluster
     cluster-ip	(ocf::heartbeat:IPaddr2):	Started debian-lenny-nodo1
     cluster-apache2	(ocf::heartbeat:apache):	Started debian-lenny-nodo1</pre></div></div>

<p>Ma non è così. E&#8217; vero che al momento il cluster eroga quanto stabilito, ma non è ancora stato definito il comportamento da assumere in caso di assenza di connettività. Se infatti si dovesse rimuovere il cavo di rete LAN dal nodo debian-lenny-nodo1 le risorse non verrebbero automaticamente migrate sul secondo nodo.<br />
Questo perché il cluster non è istruito a dovere in merito al comportamento da assumere a fronte di un esito negativo delle operazioni effettuate dalla risorsa clonata ping.<br />
Quanto descritto rappresenta un&#8217;altra grossa differenza tra le due tipologie di funzionamento: in un caso la definizione di ipfail forzava lo standby delle risorse in autonomia (e minor controllo), con Pacemaker la filosofia cambia: tutto va definito, aggiungendo certamente complessità all&#8217;architettura, ma rendendo il controllo sul cluster totale.<br />
Per definire quindi un vincolo sull&#8217;erogazione delle risorse è necessario definire una &#8220;location&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure location cluster_on_connected_node cluster rule -inf: not_defined ping or ping lte 0</pre></div></div>

<p>Viene definita cioè una regola denominata <em>cluster_on_connected_node</em> associata alla risorsa <em>cluster</em> che prevede di dare il peso di meno infinito (<em>-inf</em>, rendere cioè incapace di erogare risorse) al nodo in cui la risorsa nominata <em>ping</em> non sia definita (<em>not_defined</em>) o il cui codice di uscita sia minore o uguale a zero (<em>lte 0</em> e quindi il comando ping non ha avuto esito positivo, il ping node non risponde).</p>
<p>Grazie a questa regola la struttura realizzata con Heartbeat e Pacemaker risulta l&#8217;esatta replica della soluzione Heartbeat senza CRM per comportamento e configurazione.</p>
<p><span style="color: #505050;"><strong>La configurazione completa</strong></span></p>
<p>E&#8217; possibile ottenere il resoconto della configurazione, completo di <em>highlight</em> attraverso il comando <em>crm configure show</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure show
node $id=&quot;1984521f-539f-4967-b0ff-eb23f3cf9ccf&quot; debian-lenny-nodo1
node $id=&quot;e1f7faf3-7152-4c51-bfc4-b5382944a62e&quot; debian-lenny-nodo2
primitive cluster-apache2 ocf:heartbeat:apache \
	params configfile=&quot;/etc/apache2/apache2.conf&quot; httpd=&quot;/usr/sbin/apache2&quot; port=&quot;80&quot; \
	op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;40s&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;60s&quot;
primitive cluster-ip ocf:heartbeat:IPaddr2 \
	params ip=&quot;192.168.1.200&quot; nic=&quot;eth0&quot; \
	op monitor interval=&quot;10s&quot; timeout=&quot;20s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;20s&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;20s&quot;
primitive ping ocf:pacemaker:ping \
	params host_list=&quot;192.168.1.1&quot; name=&quot;ping&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;60s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;60s&quot; \
	op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot;
group cluster cluster-ip cluster-apache2
clone ping_clone ping \
	meta globally-unique=&quot;false&quot;
location cluster_on_connected_node cluster \
	rule $id=&quot;cluster_on_connected_node-rule&quot; -inf: not_defined ping or ping lte 0
property $id=&quot;cib-bootstrap-options&quot; \
	dc-version=&quot;1.0.8-2c98138c2f070fcb6ddeab1084154cffbf44ba75&quot; \
	cluster-infrastructure=&quot;Heartbeat&quot; \
	stonith-enabled=&quot;false&quot; \
	no-quorum-policy=&quot;ignore&quot; \
	last-lrm-refresh=&quot;1276694458&quot;</pre></div></div>

<p>E&#8217; da notare che oltre ad essere un comando invocabile con specifiche opzioni, <em>crm</em> può essere lanciato senza argomenti, in modo da accedere alla console di amministrazione interattiva che permette di controllare il cluster su tutti i livelli. Ad esempio digitando in sequenza:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm
crm(live)# configure
crm(live)configure# edit</pre></div></div>

<p>Si accederà alla configurazione riportata sopra all&#8217;interno dell&#8217;editor di testo <em>vi</em>, questa configurazione potrà essere modificata a piacimento e salvata attraverso il comando <em>vi</em> &#8220;:wq&#8221;.<br />
Le modifiche verranno applicate digitando:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">crm(live)configure# commit</pre></div></div>

<p>L&#8217;interfaccia analizzerà quanto digitato ed applicherà alla configurazione effettiva del cluster le modifiche, ovviamente se e soltanto se queste rispettano la sintassi e la struttura del cluster.</p>
<p><strong>Test di Heartbeat in modalità CRM con Pacemaker</strong></p>
<p>Anche nella configurazione con Pacemaker il comportamento di Heartbeat è osservabile dal file di log di sistema <em>/var/log/syslog</em>. La quantità di log relativa a questa configurazione di Heartbeat è decuplicata rispetto alla configurazione classica, il che rende a volte complicato seguire quanto avviene nel cluster. Un buon approccio in caso di disservizi o comportamenti divergenti da quanto ci si aspetta è quello di cercare parole chiave come &#8220;error&#8221; o &#8220;warning&#8221; in modo da evidenziare subito potenziali problemi.</p>
<p><span style="color: #505050;"><em>Primo test: disconnessione cavo LAN</em></span></p>
<p>Il comportamento di Heartbeat nei confronti della disconnessione del cavo LAN è il seguente (vengono riportate solo alcune righe del log del nodo attivo):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Jun 17 17:11:42 debian-lenny-nodo1 attrd: [2426]: info: attrd_trigger_update: Sending flush op to all hosts for: ping (0)
...
Jun 17 17:11:43 debian-lenny-nodo1 lrmd: [2424]: info: rsc:cluster-apache2:16: stop
...
Jun 17 17:11:46 debian-lenny-nodo1 lrmd: [2424]: info: rsc:cluster-ip:17: stop
...
Jun 17 17:11:49 debian-lenny-nodo1 lrmd: [2424]: info: perform_op:2873: operation monitor[11] on ocf::ping::ping:1 for client 2427, its parameters: CRM_meta_clone=[1] host_list=[192.168.1.1]</pre></div></div>

<p>Il nodo attivo segnala di aver perso connettività (leggendo la risposta del comando clonato ping) e procede con lo stop delle due risorse interessate (che verranno attivate sul nodo secondario, ovviamente se questo ha connettività).<br />
Il nodo debian-lenny-nodo1 continua a tentare la connessione al nodo ping.<br />
Da notare che debian-lenny-nodo1 non viene in alcuna maniera escluso dal cluster poiché l&#8217;interfaccia Heartbeat (il cavo che collega fra loro le due macchine) è attiva, garantendo la comunicazione dei due nodi.</p>
<p><span style="color: #505050;"><em>Secondo test: disconnessione cavo Heartbeat</em></span></p>
<p>La rimozione del cavo heartbeat, così come il secondo test di Heartbeat senza CRM, non comporta alcuna variazione nello stato del cluster:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Jun 18 10:57:12 debian-lenny-nodo1 kernel: [ 3020.112982] eth1: link down
Jun 18 10:57:20 debian-lenny-nodo1 heartbeat: [11076]: info: Link debian-lenny-nodo2:eth1 dead.</pre></div></div>

<p>Viene unicamente rilevata (sia dal kernel che da heartbeat) l&#8217;assenza di connettività sull&#8217;interfaccia eth1, ma la comunicazione del cluster è ancora garantita dal link <em>eth0</em>.</p>
<p><span style="color: #505050;"><em>Terzo test: spegnimento improvviso nodo master</em></span></p>
<p>Ecco cosa avviene all&#8217;atto di spegnimento improvviso del nodo erogante i servizi:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="console" style="font-family:monospace;">Jun 18 11:00:44 debian-lenny-nodo1 heartbeat: [11076]: WARN: node debian-lenny-nodo2: is dead
Jun 18 11:00:44 debian-lenny-nodo1 heartbeat: [11076]: info: Link debian-lenny-nodo2:eth0 dead.
Jun 18 11:00:44 debian-lenny-nodo1 heartbeat: [11076]: info: Link debian-lenny-nodo2:eth1 dead.
...
Jun 18 11:00:45 debian-lenny-nodo1 crmd: [11091]: WARN: check_dead_member: Our DC node (debian-lenny-nodo2) left the cluster
...
Jun 18 11:00:48 debian-lenny-nodo1 crmd: [11091]: info: do_dc_takeover: Taking over DC status for this partition
...
Jun 18 11:00:53 debian-lenny-nodo1 pengine: [12660]: notice: unpack_config: On loss of CCM Quorum: Ignore
...
Jun 18 11:00:53 debian-lenny-nodo1 lrmd: [11088]: info: rsc:cluster-ip:13: start
...
Jun 18 11:00:53 debian-lenny-nodo1 lrmd: [11088]: info: rsc:cluster-apache2:15: start</pre></td></tr></table></div>

<p>In sequenza quanto avviene sul nodo sopravvissuto è:</p>
<ul>
<li>linea 1,2,3) Rilevazione della perdita di connettività totale con l&#8217;altro nodo;</li>
<li>linea 5) Rilevazione della perdita di <em>DC</em>;</li>
<li>linea 7) Presa i carico da parte del nodo attuale del ruolo di <em>DC</em>;</li>
<li>linea 9) Come da configurazione l&#8217;assenza di quorum viene ignorata;</li>
<li>linea 11,13) Avvio dei servizi;</li>
</ul>
<p>Il nodo <em>debian-lenny-nodo1</em> ha quindi preso in carico la totalità delle risorse, in maniera automatica.</p>
<p><span style="color: #505050;"><em>Quarto test: migrazione manuale delle risorse</em></span></p>
<p>La migrazione manuale delle risorse è possibile sempre attraverso l&#8217;utilizzo del comando <em>crm</em>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="console" style="font-family:monospace;"># crm resource migrate cluster debian-lenny-nodo2</pre></td></tr></table></div>

<p>In questo caso, il gruppo di risorse <em>cluster</em> viene migrato dal nodo attuale al nodo <em>debian-lenny-nodo2</em>: è possibile migrare indistintamente un gruppo o una singola risorsa, ma se questa fa parte del gruppo, allora tutto il gruppo verrà migrato.<br />
La migrazione della risorsa genera automaticamente un&#8217;aggiunta nella configurazione del cluster di questo tipo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">location cli-prefer-cluster cluster \
	rule $id=&quot;cli-prefer-rule-cluster&quot; inf: #uname eq debian-lenny-nodo2</pre></div></div>

<p>il cui scopo è chiaro: la regola infatti indica al cluster di dare priorità <em>inf</em> (ossia infinità) all&#8217;esecuzione della risorsa cluster sul nodo il cui comando <em>uname</em> equivale a <em>debian-lenny-nodo2</em>. Non a caso, la regola viene automaticamente battezzata &#8220;cli-prefer-cluster&#8221;. Va chiarito che sebbene il peso della regola sia infinito, questa decade in caso il nodo preferito smetta di funzionare.<br />
E&#8217; possibile ripristinare la migrazione attraverso il comando inverso:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm resource unmigrate cluster</pre></div></div>

<p>Tale operazione ripristinerà la situazione precedente, rimuovendo la regola aggiunta all&#8217;interno della configurazione.</p>
<p><span style="color: #505050;"><em>Quinto test: standby manuale di un nodo</em></span></p>
<p>Anche la messa in standby di un nodo è effettuabile attraverso il comando <em>crm</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm node standby debian-lenny-nodo1</pre></div></div>

<p>Lo stato del cluster al termine di questa operazione sarà quindi il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
Node debian-lenny-nodo1 (1984521f-539f-4967-b0ff-eb23f3cf9ccf): standby
Online: [ debian-lenny-nodo2 ]
&nbsp;
 Clone Set: ping_clone
     Started: [ debian-lenny-nodo2 ]
     Stopped: [ ping:0 ]
 Resource Group: cluster
     cluster-ip (ocf::heartbeat:IPaddr2):       Started debian-lenny-nodo2
     cluster-apache2    (ocf::heartbeat:apache):        Started debian-lenny-nodo2</pre></div></div>

<p>Le risorse vengono correttamente migrate sul nodo secondario ed il nodo primario viene messo in stato &#8220;standby&#8221;. Per ripristinare la situazione è sufficiente anche in questo caso forzare <em>debian-lenny-nodo1</em> a tornare online:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm node online debian-lenny-nodo1</pre></div></div>

<p><span style="color: #505050;"><em>Sesto test: interruzione manuale di un servizio</em></span></p>
<p>L&#8217;ultimo test della serie prevede l&#8217;interruzione manuale di un servizio. Verrà simulato il <em>crash</em> del servizio <em>apache2</em> tramite un comando <em>kill</em>, Il presupposto è che il servizio <em>apache2</em> sia in esecuzione su <em>debian-lenny-nodo1</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># killall apache2</pre></div></div>

<p>Ecco le operazioni che il cluster esegue per porre rimedio alla situazione:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="console" style="font-family:monospace;">Jun 18 11:29:21 debian-lenny-nodo1 apache[24129]: [24187]: INFO: apache not running
...
Jun 18 11:29:21 debian-lenny-nodo1 crmd: [11091]: WARN: update_failcount: Updating failcount for cluster-apache2 on debian-lenny-nodo1 after failed monitor: rc=7 (update=value++, time=1276853361)
...
Jun 18 11:29:22 debian-lenny-nodo1 lrmd: [11088]: info: rsc:cluster-apache2:45: start</pre></td></tr></table></div>

<p>In sequenza quello che avviene è:</p>
<ul>
<li>linea 1) Il monitor ha rilevato che il servizio non sta funzionando;</li>
<li>linea 3) Pacemaker aggiorna il conteggio dei disservizi relativi alla risorsa cluster-apache2;</li>
<li>linea 5) La risorsa viene nuovamente eseguita;</li>
</ul>
<p>La risorsa è di nuovo attiva e funzionante.</p>
<p>E&#8217; possibile monitorare in maniera costante lo stato del cluster attraverso il comando <em>crm_mon</em> il cui funzionamento consiste nell&#8217;esecuzione del comando <em>crm status</em> ad intervalli regolari. <em>crm_mon</em> supporta il parametro <em>&#8211;failcount</em> che permette di avere un sommario dei disservizi rilevati sul cluster. Nell&#8217;esempio illustrato, l&#8217;output del comando sarà il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
Online: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
&nbsp;
 Clone Set: ping_clone
     Started: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
 Resource Group: cluster
     cluster-ip (ocf::heartbeat:IPaddr2):       Started debian-lenny-nodo1
     cluster-apache2    (ocf::heartbeat:apache):        Started debian-lenny-nodo1
&nbsp;
Migration summary:
* Node debian-lenny-nodo1: 
   ping:0: migration-threshold=1000000 fail-count=1
   cluster-apache2: migration-threshold=1000000 fail-count=1
* Node debian-lenny-nodo2:</pre></div></div>

<p>Il Migration summary presenta la situazione relativa alle risorse intaccate dai nostri test, il cui conteggio dei disservizi è 1 (fail-count=1).<br />
E&#8217; possibile azzerare tale conteggio effettuando un cleanup della risorsa:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm resource cleanup cluster-apache2
Cleaning up cluster-apache2 on debian-lenny-nodo1
Cleaning up cluster-apache2 on debian-lenny-nodo2</pre></div></div>

<p><strong>Conclusioni</strong></p>
<p>Giunti al termine di questo lunghissimo articolo le conclusioni da trarre sono molteplici. La prima di queste è che l&#8217;argomento Heartbeat/Pacemaker risulta tutt&#8217;altro che esaurito: esistono moltissime altre componenti del progetto che qui non sono state nemmeno accennate. Certo è che da questo confronto balza subito all&#8217;occhio come le differenze tra i due tipi di impiego siano sostanziali. La soluzione Heartbeat/Pacemaker sebbene sia evidentemente complicata offre un controllo insperato su tutte le componenti del cluster, oltre ad un monitoraggio costante di tutte le risorse configurate. L&#8217;implementazione della soluzione classica è immediata, ma come si è visto limitata.<br />
La scelta su quale sia la scelta migliore per la propria infrastruttura è unicamente dell&#8217;utente, che come sempre nel mondo OpenSource è libero di scegliere, sperimentare e realizzare.<br />
Nel prossimo articolo verrà presentata una soluzione Heartbeat/Pacemaker per implementare uno <em>Storage NFS Active/Active</em> basato su <em>DRBD</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Evoluzione dell’alta affidabilità su Linux: come orientarsi fra Hertbeat, Pacemaker, OpenAIS e Corosync</title>
		<link>http://www.miamammausalinux.org/2010/04/evoluzione-dellalta-affidabilita-su-linux-come-orientarsi-fra-hertbeat-pacemaker-openais-e-corosync/</link>
		<comments>http://www.miamammausalinux.org/2010/04/evoluzione-dellalta-affidabilita-su-linux-come-orientarsi-fra-hertbeat-pacemaker-openais-e-corosync/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 12:51:39 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[OpenAIS]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=871</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160; Orientarsi nell&#8217;attuale panorama dei cluster sotto Linux potrebbe essere, particolarmente per un neofita, molto complicato. L&#8217;insieme di progetti, nomi e versioni è certamente variegato. Ottenere alta affidabilità di servizi sotto Linux è possibile in svariati modi: si può optare per una soluzione completamente commerciale come Veritas Cluster (http://www.symantec.com/it/it/business/cluster-server), si può considerare un prodotto Opensource [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux-ha.png" alt="linux-ha" title="linux-ha" width="100" height="100" class="alignnone size-full wp-image-259" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2009/11/pacemaker.png" alt="Pacemaker" title="pacemaker" width="100" height="100" class="size-full wp-image-872" /></p>
<p>Orientarsi nell&#8217;attuale panorama dei cluster sotto Linux potrebbe essere, particolarmente per un neofita, molto complicato. L&#8217;insieme di progetti, nomi e versioni è certamente variegato.<br />
Ottenere alta affidabilità di servizi sotto Linux è possibile in svariati modi: si può optare per una soluzione completamente commerciale come <em>Veritas Cluster</em> (<a href="http://www.symantec.com/it/it/business/cluster-server">http://www.symantec.com/it/it/business/cluster-server</a>), si può considerare un prodotto Opensource sponsorizzato da un&#8217;azienda commerciale come la <em>RedHat Cluster Suite</em> (<a href="http://www.redhat.com/cluster_suite/">http://www.redhat.com/cluster_suite/</a>), prodotta e manutenuta come dice il nome stesso da RedHat (ma disponibile per quasi tutte le distribuzioni) oppure utilizzare <em>Hertbeat</em> (<a href="http://www.linux-ha.org/">http://www.linux-ha.org/</a>) prodotto e manutenuto dalla comunità del progetto <strong>Linux-HA</strong>.<br />
Questo primo articolo cerca di analizzare l&#8217;evoluzione del progetto Heartbeat, facendo luce su quali siano oggi i software da utilizzare per creare un&#8217;architettura ad alta affidabilità attraverso i software OpenSource disponibili: Hertbeat stesso, Pacemaker sino ad arrivare alla Standard Based Cluster Framework con OpenAIS e Corosync.</p>
<p><strong>In principio era Heartbeat</strong></p>
<p>Il progetto Heartbeat nasce nel 1999 con l&#8217;obiettivo di creare e diffondere un software Opensource in grado di garantire l&#8217;alta affidabilità nei servizi erogati da sistemi Linux.<br />
Heartbeat è di fatto un software per creare cluster di servizi. Un cluster di servizi è composto da un insieme di macchine, definite <em>nodi</em>, sulle quali vengono distribuiti programmi definiti <em>risorse</em>. Se un nodo per qualsiasi ragione smette di funzionare, al suo posto ne subentra un altro in grado di garantire il funzionamento delle stesse risorse, con lo scopo di recare il minor disservizio possibile all&#8217;utente finale.<br />
Questa tipologia di funzionamento è definita <em>active-passive</em>. Una risorsa è attiva su un nodo <em>active</em> mentre gli altri nodi <em>passive</em> sono in attesa, pronti ad erogare la risorsa in caso di malfunzionamenti relativi al nodo attivo.</p>
<p>Prima della versione 2.0, Heartbeat supportava cluster composti unicamente da due macchine ed aveva strumenti integrati in grado di svolgere operazioni sulle risorse stesse in maniera limitata. Non era possibile definire priorità nell&#8217;avvio delle risorse o dipendenze di una risorsa rispetto ad un&#8217;altra. Relativamente alla singola risorsa Heartbeat si preoccupava solamente dell&#8217;avvio, del termine e del posizionamento della stessa all&#8217;interno di un nodo specifico.<br />
Il modo in cui il cluster gestiva una risorsa era definito dall&#8217;<em>RA</em>, il <em>Resource Agent</em>.<br />
Un Resource Agent era uno script a cui il sistema faceva riferimento per avviare, fermare e controllare lo stato delle risorse. I Resource Agent di Heartbeat 1 erano contenuti all&#8217;interno delle directory <em>/etc/ha.d/resource.d</em> e <em>/etc/init.d</em>. Questi altro non erano che script di avvio dei demoni che supportavano operazioni di start, stop e status. Potenzialmente quindi QUALSIASI servizio poteva essere posto sotto cluster (purché supportasse le tre operazioni citate), sebbene il controllo da parte del sistema di questi servizi fosse essenzialmente nullo.</p>
<p>I limiti insiti in un&#8217;architettura simile sono subito evidenti. Basti pensare ad uno scenario in cui Heartbeat eroga il database MySQL. Il cluster si preoccupa di avviare il servizio sul nodo attivo. Se però MySQL per qualsiasi ragione (carico di utenti eccessivo, saturazione del buffer, mancanza di spazio o banalmente uno stop manuale) smette di funzionare, Heartbeat non ovvia in alcuna maniera all&#8217;inconveniente e solo un eventuale crash del nodo attivo provoca il cosiddetto <em>switch della risorsa</em>, lo spostamento cioè della stessa sul nodo rimanente, che a sua volta diventa attivo.<br />
La possibilità di effettuare controlli sullo stato di salute delle risorse e di agire autonomamente in funzione di disservizi nelle versioni precedenti alla 2.0 di Heartbeat poteva essere abilitata mediante l&#8217;utilizzo di programmi esterni (ad esempio <a href="http://www.keepalived.org/">keepalived</a>), ma non era parte integrante del cluster.</p>
<p><strong>L&#8217;avvento del CRM</strong></p>
<p>Un gestore delle risorse è sempre esistito all&#8217;interno del software Heartbeat. In origine infatti le informazioni relative al posizionamento della risorse ed alla struttura del cluster venivano lette in fase di avvio da due file di testo:</p>
<ul>
<li><em>/etc/ha.d/ha.cf</em> contenente la definizione della struttura del cluster (numero ed indirizzo dei nodi, tempistiche di controllo, politica relativa ai log);
</li>
<li><em>/etc/ha.d/haresources</em> contenente la definizione delle risorse erogate dal cluster;
</li>
</ul>
<p>Questi file (identici su entrambi i nodi) contenevano informazioni che così come erano scritte, tali rimanevano sino al termine dell&#8217;esecuzione del programma Heartbeat.<br />
La configurazione era quindi statica ed una variazione, per essere assimilata dal sistema, comportava il cosiddetto <em>reload</em> del servizio Heartbeat, una rilettura totale dei file di configurazione.</p>
<p>Questo limite unito a quelli descritti nel paragrafo precedente sono stati al centro dell&#8217;evoluzione del progetto Heartbeat e sono culminati nel <em>CRM</em>, il <em>Cluster Resource Manager</em>.<br />
Il CRM introdotto con Heartbeat 2 evolve radicalmente la funzione del gestore delle risorse attraverso una gestione dinamica delle stesse, un totale controllo sui servizi erogati ed il supporto ad un numero di nodi maggiore di due.<br />
Se abilitato (esplicitamente, all&#8217;interno della configurazione di Heartbeat) il CRM consente infatti di gestire l&#8217;avvio e la destinazione delle risorse, raggrupparle, controllarne lo stato di salute e definire priorità di esecuzione di una risorsa rispetto ad un&#8217;altra. Se non abilitato Heartbeat continua a funzionare nella maniera classica descritta in precedenza.<br />
Utilizzando il CRM, tutte le informazioni relative alla configurazione dei nodi, delle risorse ed dello stato generale del cluster sono mantenute all&#8217;interno di un unico file XML denominato <em>CIB</em>, <em>Cluster Information Base</em>.<br />
I file che dalla versione 2 di Heartbeat permettono di definire il cluster sono quindi due:</p>
<ul>
<li><em>/etc/ha.d/ha.cf</em> contenente la definizione della struttura del cluster (che dichiara anche l&#8217;opzione crm=on, ed indica al sistema di utilizzare il CRM);
</li>
<li><em>/var/lib/heartbeat/crm/cib.xml</em> contenente tutte le informazioni relative alle risorse ed allo stato attuale del cluster;
</li>
</ul>
<p>I file illustrati sono identici in tutti i nodi. E va sottolineato come le operazioni manuali dirette sul CIB siano sconsigliate, in quanto esistono tool appositi (primo fra tutti il comando <em>crm</em>, che verrà illustrato nei successivi articoli di questa serie) che permettono di interagire con esso.<br />
L&#8217;altra grande novità di Heartbeat 2 risiede nel modo in cui le risorse vengono gestite. Infatti il metodo attraverso Resource Agent classici (sebbene supportato) viene sconsigliato in funzione di Resource Agent di tipo <em>OCF</em>, <em>Open Clustering Framework</em>. Questi Resource Agent oltre a possedere le medesime proprietà di quelli classici (quindi start, stop e status) supportano anche ulteriori opzioni che consentono di definire in maniera approfondita il comportamento della risorsa nelle varie situazioni, per aumentare il più possibile il controllo del sistema.<br />
A differenza degli RA classici, gli RA di tipo OCF risiedono nella cartella <em>/usr/lib/ocf/resource.d/</em>.<br />
Maggiori dettagli sui Resoruce Agent di tipo OCF verranno introdotti nei successivi articoli e sono consultabili all&#8217;indirizzo <a href="http://www.linux-ha.org/HeartbeatResourceAgent">http://www.linux-ha.org/HeartbeatResourceAgent</a>.</p>
<p><strong>L&#8217;evoluzione della specie: Pacemaker</strong></p>
<p>La necessità di creare un <em>CRM</em> sempre più evoluto che potesse occuparsi a trecentosessanta gradi delle risorse, rendendo più flessibile la gestione delle stesse ed ovviando ai limiti della componente integrata è stata evidenziata a partire dal 2004, anno in cui al progetto Heartbeat è stata affiancato lo sviluppo di un CRM indipendente.<br />
Il nome di questo progetto è <a href="http://www.clusterlabs.org">Pacemaker</a>.<br />
Pacemaker rappresenta un progetto di CRM a sé stante, indipendente dalla piattaforma cluster di Heartbeat, il cui obiettivo è quello di proporre un&#8217;interfaccia comune alla gestione delle risorse del cluster.<br />
Le figure riportate di seguito (ottenute dal sito ufficiale <a href="http://www.clusterlabs.org">http://www.clusterlabs.org</a>) riassumono le diverse tipologie di funzionamento di Pacemaker, partendo dalla classica Active-Passive:</p>
<div id="attachment_951" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-active-passive.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-active-passive-300x225.png" alt="Figura 1" title="pacemaker-active-passive" width="300" height="225" class="size-medium wp-image-951" /></a><p class="wp-caption-text">Figura 1</p></div>
<p>passando dal supporto di più nodi:</p>
<div id="attachment_953" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-n-plus-1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-n-plus-1-300x225.png" alt="Figura 2" title="pacemaker-n-plus-1" width="300" height="225" class="size-medium wp-image-953" /></a><p class="wp-caption-text">Figura 2</p></div>
<p>per arrivare al supporto di più nodi collegati al medesimo storage:</p>
<div id="attachment_954" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-n-to-n.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-n-to-n-300x225.png" alt="Figura 3" title="pacemaker-n-to-n" width="300" height="225" class="size-medium wp-image-954" /></a><p class="wp-caption-text">Figura 3</p></div>
<p>Ciascuna di queste tipologie di cluster rappresenta i diversi livelli di complessità ottenibili mediante l&#8217;impiego di Pacemaker.<br />
In questo primo articolo le informazioni illustrate vanno prese con beneficio di inventario, in quanto temi come DRBD o Load Balancing non sono ancora stati trattati. Ciò che però è importante capire sono i tre livelli nei quali il cluster viene diviso:</p>
<ul>
<li><em>Il livello hardware</em>: rappresentato dai nodi fisici;</li>
<li><em>Il cluster stack</em>: rappresentato dall&#8217;unione del CRM con il sistema di gestione della comunicazione dei nodi;</li>
<li><em>Il livello servizi</em>: rappresentato dall&#8217;insieme dei servizi del sistema che verranno fruiti;</li>
</ul>
<p>Balzerà all&#8217;occhio il fatto che all&#8217;interno del <em>cluster stack</em>, il sistema di gestione della comunicazione dei nodi è identificato come OpenAIS e non come Heartbeat. ll motivo di questo è spiegato nell&#8217;ultimo paragrafo di questo primo articolo. </p>
<p><strong>OpenAIS: l&#8217;avvento dello Standard Based Cluster Framework</strong></p>
<p>In tutte le immagini illustrate nel precedente paragrafo il cosiddetto <em>cluster stack</em> è rappresentato dall&#8217;unione di due componenti: la prima è il CRM su cui è stata fatta sufficiente chiarezza, la seconda è OpenAIS.<br />
Secondo la definizione ufficiale, OpenAIS è uno <em>Standard Based Cluster Framework</em> (ossia una struttura di supporto standard per i cluster) che implementa una serie di <em>API</em> (<em>Application Programming Interface</em>, un insieme di strumenti specifici) e di politiche volte a sviluppare applicazioni che mantengono attivi i servizi nonostante potenziali malfunzionamenti.<br />
OpenAIS rappresenta quindi il mezzo utilizzato dal sistema per garantire la comunicazione tra i nodi e permettere al CRM di interagire con gli stessi.<br />
Questo spiega la presenza di OpenAIS nelle figure presentate: la decisione su cosa utilizzare per rendere disponibile la struttura di supporto del cluster a Pacemaker è dell&#8217;utente, poiché Heartbeat non è il solo strumento utilizzabile che supporta lo <em>Standard Based Cluster Framework</em>.<br />
In origine il progetto OpenAIS oltre al Framework rendeva disponibile anche il <em>cluster engine</em>, il programma per la gestione dell&#8217;infrastruttura del cluster. Dal Luglio 2008 la parte relativa al cluster engine di OpenAIS è stata separata in un progetto a sé stante denominato <a href="http://www.corosync.org">Corosync</a>.<br />
Corosync è un <em>cluster engine</em> che si pone allo stesso livello di Heartbeat, il cui modello di configurazione verrà illustrato nei prossimi articoli.</p>
<p><strong>Conclusioni</strong></p>
<p>Il numero di nomi e definizioni illustrate in quest&#8217;articolo è oggettivamente enorme e giustifica la difficoltà nel mettere insieme le cose. La stesura di questo articolo ha richiesto molto più tempo del previsto proprio per via del fatto che oltre ai nomi, anche i concetti esposti sono moltissimi e parecchio complicati.<br />
Il rischio è quindi che queste tecnologie, che sono alla portata di tutti, rimangano confinate ai margini dell&#8217;utilizzo per via di tutte le variazioni che nel tempo hanno riguardato i vari progetti.<br />
Questo non deve succedere: le potenzialità di Pacemaker (con Hertbeat o Corosync) sono enormi e sarà evidente nel corso dei successivi articoli in cui finalmente verrà illustrato come mettere in pratica tutte queste tecnologie OpenSource.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2010/04/evoluzione-dellalta-affidabilita-su-linux-come-orientarsi-fra-hertbeat-pacemaker-openais-e-corosync/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>RAID Software : Proteggere i dati con l’aiuto del kernel (5 di 5)</title>
		<link>http://www.miamammausalinux.org/2009/04/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-5-di-5/</link>
		<comments>http://www.miamammausalinux.org/2009/04/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-5-di-5/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 07:20:31 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[DRBD]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[NFS]]></category>
		<category><![CDATA[Raid]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Condivisione dati]]></category>
		<category><![CDATA[Protezione dati]]></category>
		<category><![CDATA[Sistema]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=578</guid>
		<description><![CDATA[Dopo il primo case study relativo all&#8217;impiego di mdadm per la creazione di un sistema RAID 1 con disco estraibile, l&#8217;ultima puntata di questa serie di articoli presenta nel dettaglio una soluzione di network Raid 1 creata attraverso il software drbd, per una replica in rete del disco contenente i dati e la condivisione di [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Dopo il primo case study relativo all&#8217;impiego di <em>mdadm</em> per la creazione di un sistema RAID 1 con disco estraibile, l&#8217;ultima puntata di questa serie di articoli presenta nel dettaglio una soluzione di network Raid 1 creata attraverso il software <em>drbd</em>, per una replica in rete del disco contenente i dati e la condivisione di questi attraverso i servizi NFS e SAMBA, in alta affidabilità.</p>
<p><strong>DRBD : Network RAID 1</strong></p>
<p>Fino ad ora sono state illustrate soluzioni RAID applicate a singole macchine, ma è possibile garantire la protezione dai dati anche attraverso RAID distribuiti, in soluzioni ad alta affidabilità. Uno fra i progetti più interessanti in questo ambito, giunto allo stato di piena maturità, è sicuramente DRBD (http://www.drbd.org).<br />
DRBD permette di replicare dati (in mirror, sul modello del RAID 1) da una macchina primaria definita “master” ad una secondaria definita “slave” attraverso una connessione di rete dedicata, tipicamente ottenuta dal collegamento di due schede di rete attraverso un cavo “cross” (senza disporre quindi di uno switch apposito).<br />
Tecnicamente DRBD è un modulo del kernel, proprio come sono moduli quelli del RAID e come per questi moduli la gestione di DRBD è affidata ad una serie di utilities che comprende (come per mdadm) un demone che gestisce ed attiva le configurazioni. La sostanziale differenza tra DRBD ed i moduli standard di RAID è che questo modulo non è ancora incluso nei sorgenti ufficiali del kernel. Per questo motivo prima di poter utilizzare DRBD è necessario compilare il moduli del kernel partendo dai sorgenti.<br />
Tipicamente DRBD viene utilizzato insieme al programma heartbeat, che consente di estenderne le funzionalità attraverso la gestione dei failover. Per failover si intendono tutte quelle situazioni in cui un servizio erogato da una macchina, se questa smette di funzionare, rimane accessibile attraverso una seconda che ne garantisce l&#8217;accessibilità costante.<br />
I servizi erogabili attraverso heartbeat sono molteplici e possono riguardare i più svariati utilizzi : da un webserver ad un database MySQL, per arrivare a dei filesystem condivisi via NFS o SAMBA.<br />
Nel case study di questo paragrafo verranno illustrate le operazioni necessarie all&#8217;installazione di DRBD e alla sua integrazione con heartbeat affinché condivida un filesystem in rete via NFS e SAMBA.</p>
<p><strong>Case Study 2 &#8211; DRBD in una soluzione di alta affidabilità con heartbeat, NFS e SAMBA.</strong></p>
<p>Il seguente case study descrive quanto è stato fatto per la società 3Dvision che effettua consulenza, supervisione e produzione di elaborazioni digitali destinate ai settori pubblicitario, promozionale e televisivo.<br />
La grande quantità di dati trattati e la criticità del loro contenuto hanno sempre imposto la memorizzazione di questi attraverso hardware proprietario. Nella rete era infatti installato un dispositivo NAS (Network Attached Storage), che attraverso un sistema operativo proprietario, rendeva disponibile il proprio spazio.<br />
Nel momento in cui il NAS si è guastato, si è optato per una scelta di radicale cambiamento, basata su hardware di consumo e software Opensource. E&#8217; stato quindi acquistato hardware per creare due macchine identiche ciascuna con processore AMD Sempron 3200 MegaHertz, un GigaByte di RAM, due schede di rete Gigabit e quattro dischi da 300 GigaByte.<br />
L&#8217;obiettivo finale è stato quello di ottenere 1,2 Tb di spazio debitamente protetto e condiviso in rete attraverso SAMBA ed NFS.</p>
<p><strong>Sviluppo del progetto</strong></p>
<p>Su entrambe le macchine è stato installato il sistema operativo Debian Sarge in forma minimale, senza cioè ambiente grafico, attraverso un lettore DVD esterno collegato via USB. In questo modo si sono potuti sfruttare tutti e due i canali IDE per il collegamento dei quattro dischi da 300 GigaByte gestiti attraverso il kernel in RAID 0, per un totale di 1,2 TeraByte di spazio disponibile.<br />
Per ovviare all&#8217;insicurezza dettata dalla scelta del RAID 0 (se un disco dei quattro cessa di funzionare, tutto il sistema cade) si è scelto di effettuare un RAID 1 in rete attraverso DRBD. In questo modo si è sfruttata la capacità di scrittura parallela del RAID 0 e l&#8217;affidabilità della copia dati del Network RAID 1 via DRBD.<br />
Il progetto è rappresentato in figura 5 :</p>
<div id="attachment_579" class="wp-caption alignnone" style="width: 282px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/04/raid-software_articolo_1-10-figura5.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/04/raid-software_articolo_1-10-figura5-272x300.png" alt="Figura 5" title="raid-software_articolo_1-10-figura5" width="272" height="300" class="size-medium wp-image-579" /></a><p class="wp-caption-text">Figura 5</p></div>
<p><strong>Configurazione di DRBD</strong></p>
<p>Al termine delle installazioni lo schema di partizionamento delle macchine è il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ fdisk -l
&nbsp;
Disk /dev/hda: 300.0 GB, 300090728448 bytes
255 heads, 63 sectors/track, 36483 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&nbsp;
   Device Boot      Start         End      Blocks   Id  System
/dev/hda1               1          30      240943+  82  Linux swap / Solaris
/dev/hda2              31        1246     9767520   83  Linux
/dev/hda3            1247       36483   283041202+  fd  Linux raid autodetect
&nbsp;
Disk /dev/hdb: 300.0 GB, 300090728448 bytes
255 heads, 63 sectors/track, 36483 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&nbsp;
   Device Boot      Start         End      Blocks   Id  System
/dev/hdb1               1          30      240943+  82  Linux swap / Solaris
/dev/hdb2              31       36483   292808722+  fd  Linux raid autodetect
&nbsp;
Disk /dev/hdc: 300.0 GB, 300090728448 bytes
255 heads, 63 sectors/track, 36483 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&nbsp;
   Device Boot      Start         End      Blocks   Id  System
/dev/hdc1               1          30      240943+  82  Linux swap / Solaris
/dev/hdc2              31       36483   292808722+  fd  Linux raid autodetect
&nbsp;
Disk /dev/hdd: 300.0 GB, 300090728448 bytes
255 heads, 63 sectors/track, 36483 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&nbsp;
   Device Boot      Start         End      Blocks   Id  System
/dev/hdd1               1          30      240943+  82  Linux swap / Solaris
/dev/hdd2              31       36483   292808722+  fd  Linux raid autodetect
&nbsp;
Disk /dev/md0: 1189.3 GB, 1189342216192 bytes
2 heads, 4 sectors/track, 290366752 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
&nbsp;
Disk /dev/md0 doesn't contain a valid partition table</pre></div></div>

<p>Ciascuno dei quattro dischi contiene un&#8217;area di swap ed un&#8217;area dedicata al RAID, solo il primo dei quattro contiene una partizione da 10 Giga destinata alla partizione root.<br />
Lo stato del RAID 0 sulle due macchine è il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] [multipath] [raid6] [faulty]
md0 : active raid0 hdd2[3] hdc2[2] hdb2[1] hda3[0]
      1161467008 blocks 64k chunks
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>Entrambe possiedono una device <em>/dev/md0</em> di circa 1,2 TeraByte gestita in RAID 0 dal kernel.<br />
La prima fase del progetto riguarda l&#8217;installazione dei pacchetti necessari a ricompilare il kernel secondo la comodissima metodologia Debian, insieme alle utility ed ai sorgenti di DRBD  :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get install kernel-source kernel-package bzip2 libncurses5-dev drbd0.7-utils drbd0.7-module-source</pre></div></div>

<p>Per creare il kernel personalizzato vanno decompressi i sorgenti e lanciata la configurazione che va effettuata sulla base dell&#8217;hardware delle macchine impiegate :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cd /usr/src/
$ tar -xjvf kernel-source-2.6.8.tar.bz2
$ cd /usr/src/kernel-source-2.6.8
$ make menuconfig</pre></div></div>

<p>Terminata questa fase, andranno creati i pacchetti relativi al kernel ed ai moduli DRBD :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ make-kpkg --revision 1 --append-to-version rasca-3dv kernel_image
$ make-kpkg --revision 1 --append-to-version rasca-3dv modules_image
$ ls -1 /usr/src/
drbd0.7-module-2.6.8rasca-3dv_0.7.10-4+1_i386.deb
drbd0.7.tar.gz
kernel-image-2.6.8rasca-3dv_1_i386.deb
linux-source-2.6.8
linux-source-2.6.8.tar.bz2
modules</pre></div></div>

<p>E di conseguenza installati :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg -i kernel-image-2.6.8rasca-3dv_1_i386.deb drbd0.7-module-2.6.8rasca-3dv_0.7.10-4+1_i386.deb</pre></div></div>

<p>Il sistema va avviato col nuovo kernel (vanno ignorati gli errori in fase di boot del demone DRBD in quanto non è stato ancora configurato). Per verificare che il sistema sia stato avviato col nuovo kernel è sufficiente lanciare il comando “uname -a” :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ uname -a
Linux 3dv-ha-1 2.6.8rasca-3dv #1 PREEMPT Sat Jun 17 20:56:39 CEST 2006 i686 GNU/Linux</pre></div></div>

<p>Il sistema è quindi pronto per la configurazione di DRBD. Come da specifiche, le interfacce presenti nel sistema sono 3, eth0 (Gigabit, PCI) collegata alla LAN, eth1 (Gigabit, PCI) collegata attraverso il cavo cross all&#8217;altra macchina e eth2 (Megabit, integrata nella scheda madre) scollegata :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:14:C1:0F:50:AF
          inet addr:192.168.0.8  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19841 errors:0 dropped:0 overruns:0 frame:0
          TX packets:32402 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:6882512 (6.5 MiB)  TX bytes:42354250 (40.3 MiB)
          Interrupt:177 Base address:0xe000
&nbsp;
eth1      Link encap:Ethernet  HWaddr 00:14:C1:0F:50:AA
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:218 (218.0 b)  TX bytes:218 (218.0 b)
          Interrupt:185
&nbsp;
eth2      Link encap:Ethernet  HWaddr 00:15:F2:D0:FC:B9
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:193 Base address:0xa400</pre></div></div>

<p>Il file di configurazione di DRBD è /etc/drbd.conf ed è diviso a blocchi. Per ogni risorsa esiste un blocco nominato “resource” contenente dei sotto-blocchi. Ciascuno dei blocchi si apre e si chiude con una parentesi graffa. Per le esigenze del progetto, la compilazione ideale è la seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">resource drbd0 {
  protocol C;
  incon-degr-cmd &quot;echo '!DRBD! primario sui dati inconsistenti' | wall ; sleep 60 ; halt -f&quot;;
&nbsp;
  startup {
    degr-wfc-timeout 120;
  }
&nbsp;
  disk {
    on-io-error   detach;
  }
&nbsp;
  net {
    timeout       80;
    connect-int   10;
    ping-int      10;
    ko-count      4;
    max-buffers   4096;
    max-epoch-size  2048;
  }
&nbsp;
  syncer {
    rate 650M;
    group 0;
    al-extents 521;
  }
&nbsp;
  on 3dv-ha-1 {
    device     /dev/drbd0;
    disk       /dev/md0;
    address    10.0.0.1:7788;
    meta-disk  internal;
  }
&nbsp;
  on 3dv-ha-2 {
    device    /dev/drbd0;
    disk      /dev/md0;
    address   10.0.0.2:7788;
    meta-disk internal;
  }
}</pre></div></div>

<p>Le opzioni del file sono auto esplicative ed attraverso la man page di drbd.conf è possibile conoscerne tutti i particolare (digitando “man drbd.conf”).<br />
All&#8217;interno del blocco “resource” viene indicato il nome che la device DRBD avrà per il sistema ed il messaggio che il kernel riceverà in caso di malfunzionamento.<br />
Il blocco “startup” contiene il tempo di attesa che in fase di boot il demone DRBD attenderà per ricevere notifica di esistenza da parte della macchina associata.<br />
“disk” è il blocco contenente il tipo di comportamento che il demone dovrà assumere in caso di errori relativi alla device, nel caso descritto sarà “detach” ossia “Stacca”, “Sconnetti”.<br />
Nel blocco “net” sono presenti le dichiarazioni relative al collegamento di rete tra le due macchine ossia il tempo che deve trascorrere tra un ping e l&#8217;altro (necessario per capire se l&#8217;altra macchina è in linea), la grandezza del buffer e così via.<br />
Nel blocco “syncer” è contenuta una tra le opzioni più importanti per le performances, e cioè “rate”. Tale parametro infatti regola il numero massimo di byte per secondo che il demone utilizzerà per replicare i dati tra il computer master e lo slave. Nel caso illustrato tale parametro, in forza alle interfacce Gigabit con cui le due macchine sono collegate fra loro, è stato settato al massimo disponibile, ossia 650 MegaByte.<br />
Gli ultimi due blocchi descrivono le due macchine impiegate nel RAID 1 e per ciascuna la device DRBD utilizzata, il filesystem locale condiviso, l&#8217;IP della macchina, la porta di ascolto del demone DRBD ed il tipo di meta-disk (interno).<br />
Terminata la compilazione del file, che dovrà essere IDENTICO per ciascuna delle due macchine, si potrà procedere al riavvio del servizio DRBD su entrambi i nodi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ /etc/init.d/drbd restart</pre></div></div>

<p>All&#8217;interno del file /var/log/syslog verranno riportate le fasi di attivazione del Network RAID 1 :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Jun 18 21:14:55 3dv-ha-1 kernel: drbd: module cleanup done.
Jun 18 21:14:55 3dv-ha-1 kernel: drbd: initialised. Version: 0.7.10 (api:77/proto:74)
Jun 18 21:14:55 3dv-ha-1 kernel: drbd: SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
Jun 18 21:14:55 3dv-ha-1 kernel: drbd: registered as block device major 147
Jun 18 21:14:55 3dv-ha-1 kernel: drbd0: Creating state block
Jun 18 21:14:55 3dv-ha-1 kernel: klogd 1.4.1, ---------- state change ----------
Jun 18 21:14:55 3dv-ha-1 kernel: No module symbols loaded - kernel modules not enabled.
Jun 18 21:14:55 3dv-ha-1 kernel: drbd0: resync bitmap: bits=290333984 words=9072938
Jun 18 21:14:55 3dv-ha-1 kernel: drbd0: size = 1107 GB (1161335936 KB)
Jun 18 21:14:55 3dv-ha-1 kernel: drbd0: Assuming that all blocks are out of sync (aka FullSync)
Jun 18 21:15:00 3dv-ha-1 kernel: drbd0: 1161335936 KB now marked out-of-sync by on disk bit-map.
Jun 18 21:15:00 3dv-ha-1 kernel: drbd0: drbdsetup [3151]: cstate Unconfigured --&gt; StandAlone
Jun 18 21:15:00 3dv-ha-1 kernel: drbd0: drbdsetup [3154]: cstate StandAlone --&gt; Unconnected
Jun 18 21:15:00 3dv-ha-1 kernel: drbd0: drbd0_receiver [3155]: cstate Unconnected --&gt; WFConnection
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: drbd0_receiver [3155]: cstate WFConnection --&gt; WFReportParams
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: Handshake successful: DRBD Network Protocol version 74
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: Connection established.
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: I am(S): 0:00000001:00000001:00000001:00000001:00
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: Peer(S): 0:00000001:00000001:00000001:00000001:00
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: drbd0_receiver [3155]: cstate WFReportParams --&gt; Connected
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: I am inconsistent, but there is no sync? BOTH nodes inconsistent!
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: Secondary/Unknown --&gt; Secondary/Secondary</pre></div></div>

<p>I due host avviati da DRBD sono connessi ma il Network RAID 1 non è ancora attivo. Lo si evince dal messaggio “I am inconsistent, but there is no sync?”. Questo perché i due dischi non sono mai stati sincronizzati. Abbiamo comunque la conferma che il primo nodo è primario, quindi ciò che rimane da fare è forzare la prima sincronizzazione attraverso il seguente comando sul nodo master :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ drbdadm -- --do-what-I-say primary all</pre></div></div>

<p>Su entrambi i nodi si può osservare lo stato della ricostruzione, visualizzando lo stato del Network RAID 1 contenuto nel file “drbd” della directory /proc, nella stessa maniera in cui veniva visualizzata la ricostruzione per i RAID creati con mdadm :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/drbd
version: 0.7.10 (api:77/proto:74)
SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
 0: cs:SyncSource st:Primary/Secondary ld:Consistent
    ns:54361636 nr:0 dw:0 dr:54378020 al:0 bm:3317 lo:27 pe:55 ua:4096 ap:0
        [&gt;...................] sync'ed:  4.9% (1036021/1089109)M
        finish: 5:18:23 speed: 55,492 (54,036) K/sec</pre></div></div>

<p>Lavorando con quantità di dati così ampie, la prima ricostruzione impiegherà poco più di quattro ore per completarsi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/drbd
version: 0.7.10 (api:77/proto:74)
SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
 0: cs:SyncSource st:Primary/Secondary ld:Consistent
    ns:738278800 nr:0 dw:0 dr:738295184 al:0 bm:45060 lo:0 pe:6 ua:4096 ap:0
        [=============&gt;......] sync'ed: 66.2% (368133/1089109)M
        finish: 1:53:34 speed: 55,288 (53,956) K/sec</pre></div></div>

<p>Al termine di tale ricostruzione, lo stato del Network RAID 1 è il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/drbd
version: 0.7.10 (api:77/proto:74)
SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
 0: cs:Connected st:Primary/Secondary ld:Consistent
    ns:1115247744 nr:0 dw:0 dr:1115247744 al:0 bm:68070 lo:0 pe:0 ua:0 ap:0</pre></div></div>

<p>Dal nodo master è quindi possibile creare un filesystem ext3 sulla neo-creata device :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mke2fs -j /dev/drbd0
mke2fs 1.37 (21-Mar-2005)
Etichetta del filesystem=
Tipo SO: Linux
Dimensione blocco=4096 (log=2)
Dimensione frammento=4096 (log=2)
145178624 inode, 290333984 blocchi
14516699 blocchi (5.00%) riservati per l'utente root
Primo blocco dati=0
8861 gruppi di blocchi
32768 blocchi per gruppo, 32768 frammenti per gruppo
16384 inode per gruppo
Backup del superblocco salvati nei blocchi:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848
&nbsp;
Scrittura delle tavole degli inode: fatto
Creazione del journal (8192 blocchi): fatto
Scrittura delle informazioni dei superblocchi e dell'accounting del filesystem: fatto
&nbsp;
Questo filesystem verrà automaticamente controllato ogni 30 mount, o
180 giorni, a seconda di quale venga prima. Usare tune2fs -c o -i per cambiare.</pre></div></div>

<p>Ed infine montare il nuovo filesystem nella directory /store (sempre e solo sul nodo master) :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount /dev/drbd0 /store</pre></div></div>

<p>Attraverso il comando “df”, è possibile osservare lo stato del Network RAID 1 :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ df -h
Filesystem         Dimens. Usati Disp. Uso% Montato su
/dev/hda2             9,2G 1001M  7,8G  12% /
tmpfs                 443M     0  443M   0% /dev/shm
/dev/drbd0            1,1T   33M  1,1T   1% /store</pre></div></div>

<p>Ma per ottenere quanto stabilito all&#8217;inizio del progetto è necessario spingersi oltre, configurando heartbeat in modo che controlli il filesystem DRBD e ne condivida il contenuto via NFS e SAMBA, in alta affidabilità.<br />
Su ciascuna delle due macchine andranno quindi configurati i due servizi insieme al demone heartbeat.</p>
<p><strong>Configurazione di NFS</strong></p>
<p>La configurazione di NFS va effettuata su entrambe le macchine, in quanto in caso di malfunzionamento di una di queste, l&#8217;altra attraverso heartbeat sarà in grado di continuare ad erogare il servizio.<br />
Per installare il pacchetto <em>nfs-kernel-server</em> è sufficiente lanciare il comando :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get install nfs-kernel-server</pre></div></div>

<p>l&#8217;installazione di NFS, implica l&#8217;avvio del servizio. Ma in funzione del fatto che tale servizio sarà controllato da heartbeat, il demone va fermato :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ /etc/init.d/nfs-kernel-server stop
Stopping NFS kernel daemon: mountd nfsd.
Unexporting directories for NFS kernel daemon...done.</pre></div></div>

<p>E rimosso dall&#8217;avvio automatico durante il boot del sistema :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ update-rc.d -f nfs-kernel-server remove
update-rc.d: /etc/init.d/nfs-kernel-server exists during rc.d purge (continuing)
 Removing any system startup links for /etc/init.d/nfs-kernel-server ...
   /etc/rc0.d/K80nfs-kernel-server
   /etc/rc1.d/K80nfs-kernel-server
   /etc/rc2.d/S20nfs-kernel-server
   /etc/rc3.d/S20nfs-kernel-server
   /etc/rc4.d/S20nfs-kernel-server
   /etc/rc5.d/S20nfs-kernel-server
   /etc/rc6.d/K80nfs-kernel-server</pre></div></div>

<p>Il servizio NFS tipicamente registra le informazioni di lock dei file nella directory <em>/var/lib/nfs</em>. Nel caso in esame però tale servizio, in caso di malfunzionamento, potrebbe cambiare da una macchina all&#8217;altra. E&#8217; facile capire come nel caso in cui un file venisse bloccato sulla macchina master (quindi con le informazioni di blocco scritte nella directory <em>/var/lib/nfs</em> della macchina master), se il servizio NFS effettuasse uno switch, tali informazioni non sarebbero più disponibili.<br />
Pertanto, è necessario configurare la cartella dei lock sul filesystem condiviso.<br />
Sulla macchina master quindi andrà copiata la cartella <em>/var/lib/nfs</em> in <em>/store</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mv /var/lib/nfs /store/</pre></div></div>

<p>Mentre sul nodo slave, tale directory andrà rimossa :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rm -rf /var/lib/nfs</pre></div></div>

<p>Il vecchio path andrà infine collegato al nuovo su entrambi i sistemi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ln -s /store/nfs /var/lib/nfs</pre></div></div>

<p>Sul nodo slave NON esiste la cartella <em>/store/nfs</em>, ma esisterà nel momento in cui il servizio NFS (e quindi il filesystem DRBD) effettuerà lo switch.<br />
Infine, nel file <em>/etc/default/nfs-common</em>, il parametro STATDOPTS andrà modificato così :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">STATDOPTS=&quot;-n 3dv-ha&quot;</pre></div></div>

<p>Questa opzione è necessaria in quanto il demone che controlla gli stati del servizio NFS (STATD) associa gli stati che controlla al nome dell&#8217;host. Anche in questo caso, nel momento in cui la macchina effettuerà lo switch del servizio, il nome host cambierà. Con questa opzione STATD non farà confusione e assocerà gli stati sempre al nome host “virtuale” 3dv-ha.</p>
<p>L&#8217;ultima operazione riguarda la configurazione delle directory condivise nel file /etc/exports su entrambi i nodi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/store/Progetti 192.168.0.0/255.255.255.0(rw,async)</pre></div></div>

<p>In questo modo è garantito il permesso a qualsiasi host della rete 192.168.0 di montare in lettura e scrittura la cartella <em>/store/Progetti</em>.</p>
<p><strong>Configurazione di SAMBA</strong></p>
<p>Dopo aver aggiornato i repositories di apt come spiegato nel case study precedente, si può procedere con l&#8217;installazione degli ultimi pacchetti SAMBA disponibili :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get install samba smbfs smbclient</pre></div></div>

<p>La più semplice delle configurazioni (personalizzabile a seconda delle esigenze) del file <em>/etc/samba/smb.conf</em> potrebbe essere la seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[global]
   workgroup = 3DVISION
   server string = %h server (Samba %v)
   dns proxy = no
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   panic action = /usr/share/samba/panic-action %d
   encrypt passwords = true
   passdb backend = tdbsam guest
   obey pam restrictions = yes
   invalid users = root
   passwd program = /usr/bin/passwd %u
   passwd chat = *EntersnewsUNIXspassword:* %nn *RetypesnewsUNIXspassword:* %nn .
   load printers = no
   socket options = TCP_NODELAY
&nbsp;
[Progetti]
   comment = Progetti
   browsable = yes
   path = /store/Progetti
   guest ok = no
   writable = no
   share modes = no
   write list = @3dvision
   create mask = 0770
   directory mask = 0770</pre></div></div>

<p>Viene quindi garantito l&#8217;accesso in scrittura alla cartella “Progetti” (che è stata creata con maschera 770 ed appartiene all&#8217;utente “3dv_user”) a tutti gli utenti appartenenti al gruppo “3dvision” :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdir /store/Progetti
$ chown 3dv_user:3dvision /store/Progetti
$ chmod 770 /store/Progetti
$ ll /store/
totale 28
drwx------  2 root     root     16384 2006-06-19 04:01 lost+found
drwxr-xr-x  4 root     root      4096 2006-06-20 17:47 nfs
drwxrwx---  2 3dv_user 3dvision  4096 2006-06-20 17:52 Progetti</pre></div></div>

<p>Anche per il servizio SAMBA, è necessario rimuovere l&#8217;avvio automatico al boot del sistema :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ update-rc.d -f samba remove
update-rc.d: /etc/init.d/samba exists during rc.d purge (continuing)
 Removing any system startup links for /etc/init.d/samba ...
   /etc/rc0.d/K19samba
   /etc/rc1.d/K19samba
   /etc/rc2.d/S20samba
   /etc/rc3.d/S20samba
   /etc/rc4.d/S20samba
   /etc/rc5.d/S20samba
   /etc/rc6.d/K19samba</pre></div></div>

<p>In questo modo anche il servizio SAMBA è configurato.</p>
<p><strong>Configurazione di Heartbeat</strong></p>
<p>L&#8217;ultima fase relativa al nostro progetto riguarda l&#8217;installazione di heartbeat :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get install heartbeat</pre></div></div>

<p>Per il quale sarà necessario aggiungere l&#8217;utente “cluster”, necessario per le interrogazioni sullo stato del cluster :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ adduser cluster
Adding user `cluster'...
Adding new group `cluster' (1002).
Adding new user `cluster' (1002) with group `cluster'.
Creating home directory `/home/cluster'.
Copying files from `/etc/skel'
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Modifica delle informazioni relative all'utente cluster
Inserire il nuovo valore o premere INVIO per quello predefinito
        Nome completo []:
        Stanza n° []:
        Numero telefonico di lavoro []:
        Numero telefonico di casa []:
        Altro []:
Is the information correct? [y/N] y</pre></div></div>

<p>Il file di configurazione di heartbeat è <em>/etc/ha.d/ha.cf</em> e per il nodo master sarà il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">logfacility daemon
keepalive 1
deadtime 14
warntime 7
initdead 120
udpport 694
baud 19200
serial /dev/ttyS0
ucast eth1 10.0.0.2
ucast eth0 192.168.0.9
auto_failback off
watchdog /dev/watchdog
node    3dv-ha-1
node    3dv-ha-2
ping 192.168.0.69
respawn cluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=cluster uid=cluster
deadping 30
logfile /var/log/ha.log</pre></div></div>

<p>Senza studiare a fondo ciascuna delle opzioni, ciò che interessa di più sono i parametri “ucast” che dovranno variare dal nodo master al nodo slave, in quanto rappresentano gli indirizzi IP attraverso i quali avverrà lo scambio delle informazioni per l&#8217;alta affidabilità (l&#8217;heartbeat appunto o “battito cardiaco”). Tali opzioni infatti sul nodo slave saranno esattamente l&#8217;opposto :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">ucast eth1 10.0.0.1
ucast eth0 192.168.0.8</pre></div></div>

<p>Heartbeat necessita per la sicurezza della creazione di una chiave di autenticazione :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dd if=/dev/urandom count=4 2&gt;/dev/null | md5sum | cut -c1-32
e0fb55565622e3a893a808ee16f70538</pre></div></div>

<p>Questo comando, da eseguire sulla sola macchina master, produrrà un output il cui contenuto andrà immesso nel file <em>/etc/ha.d/authkeys</em> su entrambe le macchine, con questa struttura :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">auth 1
1 sha1 e0fb55565622e3a893a808ee16f70538</pre></div></div>

<p>Su questo file andranno settati i permessi e la proprietà all&#8217;utente cluster :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ chmod 600 /etc/ha.d/authkeys
$ chown cluster:cluster /etc/ha.d/authkeys</pre></div></div>

<p>Rimangono quindi da creare due file su entrambi i nodi : il primo nominato “/etc/heartbeat/resource.d/sleep” con questo contenuto :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">sleep $1</pre></div></div>

<p>La cui funzione sarà quella di immettere una pausa (della durata del parametro passato) durante lo switch del servizio. Tale pausa eviterà di incorrere nell&#8217;errore “Stale NFS file handle” (per il quale esiste ampia documentazione in internet) che potrebbe influenzare il regolare funzionamento del servizio.<br />
Il secondo file da creare è <em>/etc/heartbeat/resource.d/killnfsd</em> con questo contenuto :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">killall -9 nfsd</pre></div></div>

<p>Che permetterà ad heartbet durante lo switch del servizio di uccidere eventuali processi NFS residui non più controllati.<br />
A questi script appena creati vanno assegnati i permessi di esecuzione :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ chmod 755 /etc/heartbeat/resource.d/killnfsd
$ chmod 755 /etc/heartbeat/resource.d/sleep</pre></div></div>

<p>Come ultimo passo per la configurazione, va creato il file <em>/etc/ha.d/haresources</em>, all&#8217;interno del quale verranno dichiarate le risorse condivise da heartbeat :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">3dv-ha-1 IPaddr::192.168.0.10/24/eth0 drbddisk::drbd0 Filesystem::/dev/drbd0::/store::ext3 killnfsd nfs-common nfs-kernel-server samba sleep::3</pre></div></div>

<p>La struttura del file è molto semplice, viene indicato il nodo master, ossia 3dv-ha-1, l&#8217;indirizzo IP virtuale a cui i servizi risponderanno ed i servizi stessi, cioè DRBD, NFS e SAMBA insieme agli script di controllo.<br />
Heartbeat è quindi pronto ad essere avviato :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ /etc/init.d/heartbeat start</pre></div></div>

<p>E ne si può seguire l&#8217;evoluzione nel file <em>/var/log/ha.log</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tail -f /var/log/ha.log
heartbeat: 2006/06/20_18:34:07 info: Running /etc/ha.d/rc.d/ip-request-resp ip-request-resp
heartbeat: 2006/06/20_18:34:07 received ip-request-resp IPaddr::192.168.0.10/24/eth0 OK yes
heartbeat: 2006/06/20_18:34:07 info: Acquiring resource group: 3dv-ha-1 IPaddr::192.168.0.10/24/eth0 drbddisk::drbd0 Filesystem::/dev/drbd0::/store::ext3 killnfsd nfs-common nfs-kernel-server samba sleep::3
heartbeat: 2006/06/20_18:34:07 info: Running /etc/ha.d/resource.d/IPaddr 192.168.0.10/24/eth0 start
heartbeat: 2006/06/20_18:34:07 info: /sbin/ifconfig eth0:0 192.168.0.10 netmask 255.255.255.0   broadcast 192.168.0.255
heartbeat: 2006/06/20_18:34:07 info: Sending Gratuitous Arp for 192.168.0.10 on eth0:0 [eth0]
heartbeat: 2006/06/20_18:34:07 /usr/lib/heartbeat/send_arp -i 1010 -r 5 -p /var/lib/heartbeat/rsctmp/send_arp/send_arp-192.168.0.10 eth0 192.168.0.10 auto 192.168.0.10 ffffffffffff
heartbeat: 2006/06/20_18:34:07 info: Running /etc/ha.d/resource.d/drbddisk drbd0 start
heartbeat: 2006/06/20_18:34:07 info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /store ext3 start
heartbeat: 2006/06/20_18:34:08 info: Running /etc/ha.d/resource.d/killnfsd  start
heartbeat: 2006/06/20_18:34:08 ERROR: Return code 1 from /etc/ha.d/resource.d/killnfsd
heartbeat: 2006/06/20_18:34:08 info: Running /etc/init.d/nfs-common  start
heartbeat: 2006/06/20_18:34:08 info: Running /etc/init.d/nfs-kernel-server  start
heartbeat: 2006/06/20_18:34:08 info: Running /etc/init.d/samba  start
heartbeat: 2006/06/20_18:34:11 info: Running /etc/ha.d/resource.d/sleep 3 start</pre></div></div>

<p>L&#8217;unico errore rilevato (“ERROR: Return code 1 from /etc/ha.d/resource.d/killnfsd”) si può ignorare, in quanto non esistono processi residui per NFS e l&#8217;esito dell&#8217;operazione “killall” è comunque coerente.</p>
<p>Per effettuare un test, da una macchina remota, è possibile montare lo share in NFS :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount -t nfs 192.168.0.10:/store/Progetti /mnt/</pre></div></div>

<p>Se l&#8217;esito del comando mount sarà positivo, si potrà provare a creare un file all&#8217;interno dello share:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ls -la /mnt/
$ touch /mnt/test-ha</pre></div></div>

<p>Per effettuare una prova di corretto failover basterà spegnere il nodo master e verificare che lo slave prenda il suo posto e sia quindi altamente affidabile.<br />
Mettendosi “in ascolto” sul file di log della macchina slave e spegnendo il nodo master si può controllare quanto succede :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tail -f /var/log/ha.log
heartbeat: 2006/06/20_18:39:51 info: Received shutdown notice from '3dv-ha-1'.
heartbeat: 2006/06/20_18:39:51 info: Resources being acquired from 3dv-ha-1.
heartbeat: 2006/06/20_18:39:51 info: acquire local HA resources (standby).
heartbeat: 2006/06/20_18:39:51 info: local HA resource acquisition completed (standby).
heartbeat: 2006/06/20_18:39:51 info: Standby resource acquisition done [all].
heartbeat: 2006/06/20_18:39:51 info: No local resources [/usr/lib/heartbeat/ResourceManager listkeys 3dv-ha-2] to acquire.
heartbeat: 2006/06/20_18:39:51 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2006/06/20_18:39:51 info: Taking over resource group IPaddr::192.168.0.10/24/eth0
heartbeat: 2006/06/20_18:39:51 info: Acquiring resource group: 3dv-ha-1 IPaddr::192.168.0.10/24/eth0 drbddisk::drbd0 Filesystem::/dev/drbd0::/store::ext3 killnfsd nfs-common nfs-kernel-server samba sleep::3
heartbeat: 2006/06/20_18:39:51 info: Running /etc/ha.d/resource.d/IPaddr 192.168.0.10/24/eth0 start
heartbeat: 2006/06/20_18:39:51 info: /sbin/ifconfig eth0:0 192.168.0.10 netmask 255.255.255.0   broadcast 192.168.0.255
heartbeat: 2006/06/20_18:39:51 info: Sending Gratuitous Arp for 192.168.0.10 on eth0:0 [eth0]
heartbeat: 2006/06/20_18:39:51 /usr/lib/heartbeat/send_arp -i 1010 -r 5 -p /var/lib/heartbeat/rsctmp/send_arp/send_arp-192.168.0.10 eth0 192.168.0.10 auto 192.168.0.10 ffffffffffff
heartbeat: 2006/06/20_18:39:51 info: Running /etc/ha.d/resource.d/drbddisk drbd0 start
heartbeat: 2006/06/20_18:39:51 info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /store ext3 start
heartbeat: 2006/06/20_18:39:51 info: Running /etc/ha.d/resource.d/killnfsd  start
heartbeat: 2006/06/20_18:39:51 ERROR: Return code 1 from /etc/ha.d/resource.d/killnfsd
heartbeat: 2006/06/20_18:39:52 info: Running /etc/init.d/nfs-common  start
heartbeat: 2006/06/20_18:39:52 info: Running /etc/init.d/nfs-kernel-server  start
heartbeat: 2006/06/20_18:39:52 info: Running /etc/init.d/samba  start
heartbeat: 2006/06/20_18:39:55 info: Running /etc/ha.d/resource.d/sleep 3 start
heartbeat: 2006/06/20_18:39:58 info: /usr/lib/heartbeat/mach_down: nice_failback: foreign resources acquired
heartbeat: 2006/06/20_18:39:58 info: mach_down takeover complete.
heartbeat: 2006/06/20_18:39:58 info: mach_down takeover complete for node 3dv-ha-1.
heartbeat: 2006/06/20_18:40:06 WARN: node 3dv-ha-1: is dead
heartbeat: 2006/06/20_18:40:06 info: Dead node 3dv-ha-1 gave up resources.
heartbeat: 2006/06/20_18:40:23 info: Link 3dv-ha-1:eth1 dead.
heartbeat: 2006/06/20_18:40:23 info: Link 3dv-ha-1:eth0 dead.</pre></div></div>

<p>Le due righe :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">heartbeat: 2006/06/20_18:39:58 info: mach_down takeover complete.
heartbeat: 2006/06/20_18:39:58 info: mach_down takeover complete for node 3dv-ha-1.</pre></div></div>

<p>confermano che il failover è stato eseguito con successo.<br />
Per il client che montava la cartella remota tutto si è svolto in maniera trasparente, ed il mount point risponde a dovere :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ls /mnt/
test-ha</pre></div></div>

<p>Stessi test possono essere effettuati per SAMBA.<br />
E&#8217; da notare che nel momento in cui si accenderà nuovamente il nodo master, ad erogare il servizio sarà sempre il nodo slave che cederà le risorse solo in caso di  spegnimento o di rottura di componenti hardware.</p>
<p>Anche la descrizione di questo progetto viene conclusa con il giudizio della società : &#8220;<em>Questo tipo di sistema ci ha permesso di memorizzare la totalità dei dati che gestiamo e di avere la sicurezza nella ridondanza dei dati. A questo si aggiunge il risparmio sensibile dettato dall&#8217;hardware impiegato.</em>&#8221; &#8211; Dario Colombo, Amministratore Delegato di 3Dvision</p>
<p><strong>Conclusioni</strong></p>
<p>Le potenzialità offerte dalla gestione del RAID software da parte del kernel Linux sono notevoli e questa lunga panoramica lo ha dimostrato. Quello che rimane da fare è cercare di spingere il più possibile le aziende a sperimentare queste soluzioni, perché dopo la logica diffidenza iniziale, rimane solo la soddisfazione di aver fatto una scelta che ha portato un incremento della produttività, un risparmio ed un sistema al passo con i tempi.</p>
<p><strong>Bibliografia essenziale</strong></p>
<p>“The Software-RAID HOWTO” di Jakob Østergaard ed Emilio Bueso <a href="http://www.tldp.org/HOWTO/Software-RAID-HOWTO.html">http://www.tldp.org/HOWTO/Software-RAID-HOWTO.html</a></p>
<p>“$ man mdadm”</p>
<p>“DRBD”<br />
<a href="http://www.drbd.org/">http://www.drbd.org/</a></p>
<p>“DRBD : Linux HA”</p>
<p>http://linux-ha.org/DRBD</p>
<p>“$ man drbd.conf”</p>
<p><strong>Ringraziamenti</strong></p>
<p>Questo documento esiste grazie anche ad alcune persone che mi hanno aiutato nei momenti critici. Grazie quindi a Lorenzo Panarello per le revisioni, al Morby per i consigli sull&#8217;applicazione pratica dei RAID ed a mia moglie per la pazienza, in quanto credo che ormai in fatto di RAID ne sappia più di me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/04/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-5-di-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RAID Software : Proteggere i dati con l’aiuto del kernel (4 di 5)</title>
		<link>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-4-di-5/</link>
		<comments>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-4-di-5/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 08:19:29 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Raid]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Condivisione dati]]></category>
		<category><![CDATA[Protezione dati]]></category>
		<category><![CDATA[Sistema]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=575</guid>
		<description><![CDATA[Nel precedente articolo è stato affrontato l&#8217;argomento della messa in RAID della partizione di root, partendo da un&#8217;installazione standard o da un sistema già esistente. In questa penultima parte della serie viene affrontato un case study relativo all&#8217;impiego di mdadm per la creazione di un sistema RAID 1 con disco estraibile. Case Study 1 &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Nel precedente articolo è stato affrontato l&#8217;argomento della messa in RAID della partizione di root, partendo da un&#8217;installazione standard o da un sistema già esistente.<br />
In questa penultima parte della serie viene affrontato un case study relativo all&#8217;impiego di <em>mdadm</em> per la creazione di un sistema RAID 1 con disco estraibile.</p>
<p><strong>Case Study 1 &#8211; RAID 1 con HD ide “a cassetto”</strong></p>
<p>Il seguente Case study descrive il progetto realizzato per la società &#8220;Immagine &#038; Dettaglio&#8221; che si occupa di architettura d&#8217;interni, progettazione architettonica e di grafica.<br />
L&#8217;esigenza primaria della società era di ottenere la gestione centralizzata dei dati e rimpiazzare il vetusto impianto per i backup, rappresentato da un DAT (Digital Audio Tape) a cassette, con un progetto che offrisse maggiore sicurezza nella registrazione dei dati, minori costi e la possibilità di trasportare tali backup in luoghi diversi dall&#8217;ufficio in cui risiedeva il sistema, per ridurre al minimo la possibilità di perdita totale di tutti i dati.<br />
Il progetto ha quindi previsto il riutilizzo di una vecchia macchina (denominata “ied-storage” con processore Intel Celeron 1000 MegaHertz, 256 MegaByte di RAM ed un disco da 20 GigaByte), l&#8217;acquisto di tre dischi IDE da 300 GigaByte e due kit per hard disk estraibili.<br />
Questi kit, visibili nella Foto 1 risultano facilmente installabili in qualsiasi slot da 5 pollici e ¼ (ossia lo slot dei lettori cd/dvd) e consentono di collegare un cassetto ad uno dei canali IDE della scheda madre e di rendere il disco che viene inserito all&#8217;interno di questo, estraibile.</p>
<div id="attachment_576" class="wp-caption alignnone" style="width: 160px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-foto1.jpg"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-foto1-150x150.jpg" alt="Foto 1" title="raid-software_articolo_1-10-foto1" width="150" height="150" class="size-thumbnail wp-image-576" /></a><p class="wp-caption-text">Foto 1</p></div>
<p>Sul canale IDE primario della scheda madre sono stati quindi collegati il disco del sistema operativo da 20 GigaByte (come Master) ed il lettore DVD (come Slave) mentre sul canale IDE secondario è stato collegato uno dei dischi da 300 GigaByte (come Master) ed il cassetto IDE (come Slave).<br />
Utilizzando la tecnologia RAID software offerta dal kernel Linux per realizzare un mirror (RAID 1) sui dischi collegati al secondo canale IDE oltre ad avere 300 GigaByte di spazio disponibile in rete, ne si garantisce il completo backup.<br />
Inoltre, attraverso delle sostituzioni schedulate del disco (ad esempio una volta la settimana), si garantisce la possibilità di trasportare il contenuto del disco lontano dall&#8217;ufficio, avere tre copie dello stesso dato ad ogni sostituzione e nella peggiore delle ipotesi, ossia quella in cui entrambi i dischi collegati alla macchina si rompano, una sola settimana di ritardo nei backup (presenti sul disco estratto la settimana precedente).<br />
Sul disco primario da 20 GigaByte è stato installato come sistema operativo Debian Sarge 3.1, mentre i due dischi hdc e hdd non sono stati configurati.</p>
<p><strong>Sviluppo del progetto</strong></p>
<p>Lo stato del sistema al primo boot è il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ df -h
Filesystem         Dimens. Usati Disp. Uso% Montato su
/dev/hda2            19,2G 1001M 17,8G  12% /
tmpfs                 443M     0  443M   0% /dev/shm</pre></div></div>

<p>Una partizione root da 19 GigaByte, una swap da 500 MegaByte.<br />
Su ciascuno dei due dischi <em>hdc</em> e <em>hdd</em> vanno quindi create due partizioni <em>hdc1</em> ed <em>hdd1</em> (ad esempio attraverso il programma fdisk) della massima grandezza disponibile (quindi 300 GigaByte) ed il RAID 1 ad esse associato:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/hdc1 /dev/hdd1
mdadm: array /dev/md0 started.</pre></div></div>

<p>Al termine della sincronizzazione lo stato del RAID è il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 hdd1[1] hdc1[0]
      2993440 blocks [2/2] [UU]
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>La fase successiva prevede la creazione del filesystem sulla device <em>md0</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mke2fs -j /dev/md0</pre></div></div>

<p>Ed il suo montaggio nella directory <em>/mnt</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount /dev/md0 /mnt</pre></div></div>

<p>In questo modo è possibile muovere l&#8217;attuale contenuto della cartella <em>/home</em> all&#8217;interno del nuovo filesystem, questo perché l&#8217;obiettivo finale vuole essere quello di rendere lo spazio offerto dal RAID 1 condiviso attraverso SAMBA, che nella configurazione standard condivide le directory home di ciascun utente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mv /home/* /mnt/</pre></div></div>

<p>Una volta smontata la cartella <em>/mnt</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ umount /mnt/</pre></div></div>

<p>E&#8217; possibile associare all&#8217;interno del file <em>/etc/fstab</em> la device <em>/dev/md0</em> al mount point <em>/home</em>, aggiungendo nel file <em>/etc/fstab</em> la seguente riga:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/dev/md0        /home           ext3    defaults        0       0</pre></div></div>

<p>E forzarne il mount con il comando <em>mount -a</em>, verificando che sia poi correttamente montata:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount -a
$ mount
...
...
/dev/md0 on /home type ext3 (rw)</pre></div></div>

<p><strong>Configurazione di SAMBA</strong></p>
<p>Nell&#8217;installare SAMBA come prima cosa, all&#8217;interno del file <em>/etc/apt/sources.list</em> di entrambe le macchine, vanno aggiunti i repositories SAMBA per le ultime versioni:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">deb http://it.samba.org/samba/ftp/Binary_Packages/Debian sarge samba</pre></div></div>

<p>In questo modo pur utilizzando una distribuzione stabile (Sarge) i cui pacchetti relativi a SAMBA sarebbero aggiornati a versioni precedenti alle ultime disponibili, si potrà disporre dei pacchetti allo stato dell&#8217;arte.<br />
Effettuata la modifica, è necessario lanciare l&#8217;aggiornamento dei repositories:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get update</pre></div></div>

<p>Quindi installare SAMBA lasciando il file di configurazione così com&#8217;è, in modo che condivida le cartelle homes di tutti gli utenti (configurazione di default):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get install samba smbfs smbclient</pre></div></div>

<p>Una volta creato un utente locale nel sistema ed in SAMBA:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ adduser ied-user1
$ passwd ied-user1
$ smbpasswd -a ied-user1</pre></div></div>

<p>Lo spazio presente nel RAID 1 è accessibile dai client Microsoft Windows della rete che effettuino il login con l&#8217;utenza “ied-user1”.</p>
<p><strong>Sostituire il disco estraibile</strong></p>
<p>A completamento del progetto, rimane da schedulare uno spegnimento forzato della macchina necessario alla sostituzione del disco. Inutile dire che il disco non può essere estratto a caldo, pertanto si è stato scelto di spegnere la macchina ogni venerdì, manualmente o attraverso la schedulazione del crontab sostituendo il disco prima di riaccenderla. L&#8217;unico accorgimento che va preso in questo senso riguarda la forzatura dell&#8217;aggiunta del nuovo disco esterno all&#8217;interno del RAID. La motivazione è che controller software del kernel, trovandosi un persistent superblock differente sul disco che è stato sostituito, giudica il RAID in stato inconsistente.<br />
Per ovviare, è sufficiente fare in modo che ad ogni avvio di sistema venga lanciato il seguente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm -a /dev/md0 /dev/hdd1</pre></div></div>

<p>Tale comando nel caso che il disco non cambi non effettuerà alcuna operazione, giudicando il disco “already added”, nel caso che il disco ed il <em>persistent superblock</em> siano differenti, lo aggiungerà avviandone in contemporanea la re sincronizzazione, operazione che impiegherà per una capacità di 300 Giga circa 100 minuti.<br />
Il comando lanciato può essere incluso in uno script denominato ad esempio /etc/init.d/mdadm-raid-recovery, dal seguente contenuto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Script per il recovery del secondo disco di RAID.</span>
&nbsp;
mdadm <span style="color: #660033;">-a</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md0 <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>hdd1</pre></div></div>

<p>Ed incluso fra gli script di avvio in questo modo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ update-rc.d mdadm-raid-recovery start 20 2 3 4 5 .
 Adding system startup for /etc/init.d/mdadm-raid-recovery ...
   /etc/rc2.d/S20mdadm-raid-recovery -&gt; ../init.d/mdadm-raid-recovery
   /etc/rc3.d/S20mdadm-raid-recovery -&gt; ../init.d/mdadm-raid-recovery
   /etc/rc4.d/S20mdadm-raid-recovery -&gt; ../init.d/mdadm-raid-recovery
   /etc/rc5.d/S20mdadm-raid-recovery -&gt; ../init.d/mdadm-raid-recovery</pre></div></div>

<p>ad ogni avvio del sistema verrà effettuato questo controllo e l&#8217;eventuale aggiunta del disco inserito.<br />
In caso sia presente un nuovo disco, verrà sincronizzato e messo in linea, di modo da garantire, al momento della sostituzione e prima di qualsiasi altra nuova scrittura, tre copie identiche dello stesso dato.</p>
<p>Ecco il giudizio sul progetto espresso dalla società : “<em>L&#8217;utilizzo di un backup come questo ci ha permesso di avere la totale sicurezza per i dati e la possibilità di conservare una copia di essi lontano dalla sede. A tutto questo si aggiunge il risparmio dovuto al fatto di aver usato una macchina dismessa insieme all&#8217;acquisto dei tre dischi e dei relativi kit.</em>” &#8211; Luciana Ferrari, Amministratore unico di “Immagine &#038; Dettaglio”</p>
<p><strong>Conclusioni</strong></p>
<p>Nel prossimo ed ultimo articolo verrà illustrato il secondo <em>case study</em>: un network RAID 1 attraverso DRBD.</p>
<p><strong>Note</strong></p>
<p>Questa serie di articoli è apparsa in origine nel libro edito da Duke Italia <a href="http://www.hitechshop.it/detail.asp?idT=&#038;idC=&#038;idP=1&#038;Pid=34483&#038;testo=clustering%20e%20raid%20software">Clustering e raid software</a> allegato all&#8217;edizione italiana di <em>Linux Journal</em> dell&#8217;Ottobre 2006.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-4-di-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RAID Software : Proteggere i dati con l’aiuto del kernel (3 di 5)</title>
		<link>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-3-di-5/</link>
		<comments>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-3-di-5/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 14:09:03 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Raid]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Protezione dati]]></category>
		<category><![CDATA[Sistema]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=565</guid>
		<description><![CDATA[Nel precedente articolo sono stati illustrati i metodi per la messa in RAID di partizioni nei diversi livelli disponibili. Di seguito viene affrontata la messa in RAID della partizione root del sistema, sia nel caso di una nuova installazione, sia nel caso di un&#8217;installazione già esistente. Il tutto sempre grazie al software Linux mdadm. Mettere [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Nel precedente articolo sono stati illustrati i metodi per la messa in RAID di partizioni nei diversi livelli disponibili.<br />
Di seguito viene affrontata la messa in RAID della partizione root del sistema, sia nel caso di una nuova installazione, sia nel caso di un&#8217;installazione già esistente. Il tutto sempre grazie al software Linux <em>mdadm</em>.</p>
<p><strong>Mettere in RAID la partizione root</strong></p>
<p>Sino a questo punto sono state illustrate soluzioni RAID applicate a partizioni diverse da root (intesa come &#8220;/&#8221;, non come la directory /root), Linux però, offre anche la possibilità di montare la partizione root su una device RAID.<br />
Le situazioni di partenza possono essere due : costruire un sistema partendo da una situazione vergine, oppure disporre di un sistema che non può essere cancellato, ma che si vuole mettere sotto RAID.<br />
Se da una situazione vergine ogni distribuzione offre la possibilità di impostare in fase di configurazione la partizione root in modo che risieda su una device RAID, migrare un sistema esistente può risultare leggermente più complicato.<br />
Verranno descritti entrambi le situazioni possibili, supponendo che il sistema possieda due dischi da 300 Giga collegati al canale IDE primario (quindi hda e hdb) e che si voglia mettere la partizione root sotto RAID 1 (o mirror). </p>
<p><strong>Situazione 1 : Nuova installazione con RAID sulla partizione root creato attraverso l&#8217;installer</strong></p>
<p>La maggior parte delle distribuzioni offre la possibilità di configurare in fase di installazione la partizione root in modo che risieda sotto una device RAID. I passi descritti e gli screenshot associati si riferiscono all&#8217;installer di Debian Sarge 3.1, ma concettualmente sono applicabili a tutte le distribuzioni.<br />
Verranno descritte solo le fasi che riguardano la configurazione dei dischi in quanto a parte queste, l&#8217;installazione su RAID non si differenzia in alcun modo da una standard.<br />
Attraverso il tool di configurazione dei dischi, andranno per prima cosa create per ogni disco una partizione di tipo &#8220;Volume fisico per il RAID&#8221; e la relativa swap :</p>
<div id="attachment_564" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-1-300x225.png" alt="Screenshot 1" title="raid-software_articolo_1-10-screenshot-1" width="300" height="225" class="size-medium wp-image-564" /></a><p class="wp-caption-text">Screenshot 1</p></div>
<div id="attachment_566" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-2.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-2-300x225.png" alt="Screenshot 2" title="raid-software_articolo_1-10-screenshot-2" width="300" height="225" class="size-medium wp-image-566" /></a><p class="wp-caption-text">Screenshot 2</p></div>
<p>Successivamente, selezionando &#8220;Configurare il RAID software&#8221; si accederà al menu di configurazione multidisk per il RAID software :</p>
<div id="attachment_567" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-3.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-3-300x225.png" alt="Screenshot 3" title="raid-software_articolo_1-10-screenshot-3" width="300" height="225" class="size-medium wp-image-567" /></a><p class="wp-caption-text">Screenshot 3</p></div>
<p>Selezionando l&#8217;opzione &#8220;Creare un device multidisk&#8221;, si potrà scegliere il tipo di multidisk da creare. Come stabilito, la scelta che verrà adottata verterà sul RAID 1, o mirror :</p>
<div id="attachment_568" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-4.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-4-300x225.png" alt="Screenshot 4" title="raid-software_articolo_1-10-screenshot-4" width="300" height="225" class="size-medium wp-image-568" /></a><p class="wp-caption-text">Screenshot 4</p></div>
<p>A questo punto andranno indicate al programma di installazione il numero di partizioni attive nel RAID (nel nostro caso 2) :</p>
<div id="attachment_569" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-5.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-5-300x225.png" alt="Screenshot 5" title="raid-software_articolo_1-10-screenshot-5" width="300" height="225" class="size-medium wp-image-569" /></a><p class="wp-caption-text">Screenshot 5</p></div>
<p>Ed il numero di device &#8220;spare&#8221;, utile soprattutto nei livelli di RAID 4 e 5, e che in questo caso potrà quindi rimanere 0 :</p>
<div id="attachment_570" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-6.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-6-300x225.png" alt="Screenshot 6" title="raid-software_articolo_1-10-screenshot-6" width="300" height="225" class="size-medium wp-image-570" /></a><p class="wp-caption-text">Screenshot 6</p></div>
<p>Per completare le informazioni sul RAID necessarie al programma di installazione, andranno indicate le partizioni attive per il RAID. Le due che sono state indicate durante il partizionamento con il tipo &#8220;Volume fisico per il RAID&#8221; :</p>
<div id="attachment_571" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-7.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-7-300x224.png" alt="Screenshot 7" title="raid-software_articolo_1-10-screenshot-7" width="300" height="224" class="size-medium wp-image-571" /></a><p class="wp-caption-text">Screenshot 7</p></div>
<p>Sulla neo creata device &#8220;RAID 1 dispositivo n° 0&#8243; andrà infine creato il filesystem ext3 associato alla partizione root, e terminate queste modifiche, la situazione dei dischi sarà la seguente :</p>
<div id="attachment_572" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-8.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-8-300x225.png" alt="Screenshot 8" title="raid-software_articolo_1-10-screenshot-8" width="300" height="225" class="size-medium wp-image-572" /></a><p class="wp-caption-text">Screenshot 8</p></div>
<p>Per completare il tutto, sarà necessario “Terminare il partizionamento e scrivere i cambiamenti sui dischi”, procedendo poi per il resto dell&#8217;installazione nella maniera consueta.</p>
<p><strong>Situazione 2 : Sistema preesistente, creazione del RAID sulla partizione root attraverso una distribuzione &#8220;Live&#8221;</strong></p>
<p>Nell&#8217;eventualità in cui non si possa cancellare un&#8217;installazione esistente e si voglia comunque fare in modo che la partizione root sia sotto RAID verrà proposta tra le tante disponibili una soluzione che prevede l&#8217;uso di una distribuzione “Live”, necessaria per l&#8217;avvio del sistema con la partizione root non montata, e di un disco USB, necessario per il backup dei dati presenti sulla partizione root.<br />
A sistema avviato, una volta collegato il disco USB, andranno copiate in una cartella nominata “oldroot” le cartelle di sistema ritenute critiche  :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdir /media/usb0/oldroot
$ cp -Rp /bin  /boot /dev /etc /home /lib /mnt /opt  /root  /sbin /tmp /usr /var /media/usb0/oldroot</pre></div></div>

<p>L&#8217;opzione -Rp del comando cp consente di percorrere ricorsivamente le directory e di copiarne il contenuto mantenendo permessi, proprietario, gruppo e date.<br />
Le cartelle indicate sono quelle giudicate &#8220;critiche&#8221;, ma nulla vieta in presenza di altri dati sensibili di copiarli nello stesso sistema.<br />
Essenziale è comunque avere nella directory <em>/meda/usb0/oldroot</em> del disco USB il contenuto attuale del sistema.<br />
Il sistema andrà riavviato quindi con una distribuzione &#8220;Live&#8221; recente come &#8220;Knoppix&#8221;, &#8220;Ubuntu&#8221; o qualsiasi altra tra le numerose disponibili.<br />
Una volta avviato il sistema si dovrà creare la device virtuale md0 composta dalle due partizioni appartenenti ai diversi dischi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/hda1 /dev/hdb1
mdadm: array /dev/md0 started.</pre></div></div>

<p>Terminata la sincronizzazione, sarà possibile creare il filesystem sulla device <em>md0</em>  :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mke2fs -j /dev/md0</pre></div></div>

<p>e montarlo su una cartella qualsiasi, copiandoci sopra le cartelle precedentemente salvate sul disco esterno :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdir /target
$ mount /dev/md0 /target
$ cd /media/usb0/oldroot
$ cp -Rp /bin  /boot /dev /etc /home /lib /mnt /opt  /root  /sbin /tmp /usr /var /target</pre></div></div>

<p>Alla struttura delle cartelle della partizione root andranno aggiunte le cartelle virtuali di sistema <em>/proc</em> e <em>/sys</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdir /target/proc
$ mkdir /target/sys</pre></div></div>

<p>Per completare i lavori ed installare il bootloader che dovrà avviare il sistema dalla device RAID, sarà sufficiente lanciare una shell interattiva nella cartella /target attraverso il comando chroot :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ chroot /target</pre></div></div>

<p>E dopo aver montato il filesystem <em>/proc</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount -t proc - /proc</pre></div></div>

<p>Editare il file <em>/boot/grub/menu.lst</em> (supponendo che sia grub il bootloader installato nel sistema) con le specifiche necessarie all&#8217;avvio dalla device RAID :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">default	0
timeout	5
color		cyan/blue	white/blue
&nbsp;
title		Debian GNU/Linux , kernel 2.6.8-2-386
root		(hd0,0)
kernel	/boot/vmlinuz-2.6.8-2-386 root=/dev/md0 ro
initrd	/boot/initrd.img-2.6.8-2-386 root=/dev/md0 ro
savedefault
boot
&nbsp;
title		Debian GNU/Linux , kernel 2.6.8-2-386 (Single)
root		(hd0,0)
kernel	/boot/vmlinuz-2.6.8-2-386 root=/dev/md0 ro single
initrd	/boot/initrd.img-2.6.8-2-386 root=/dev/md0 ro
savedefault
boot</pre></div></div>

<p>Anche se a differenza di lilo, grub non necessita di essere reinstallato ogni volta che ne si modifica il contenuto del file di configurazione, lanciare il comando <em>grub-install</em> aiuta a comprendere come il bootloader debba risiedere comunque nel master boot record del disco primario, visto che sarà quella la posizione da cui il BIOS avvierà il sistema operativo :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ grub-install /dev/hda
Installation is finished. No errors reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the line is incorrect,
fix it and re-run the script 'grub-install'.
&nbsp;
(hd0)	/dev/hda
(hd1)	/dev/hdb</pre></div></div>

<p>Ultimo passo da eseguire prima del riavvio è la modifica nel file <em>/etc/fstab</em> della riga che fa riferimento alla partizione <em>/</em>, in modo che non venga più montata su <em>/dev/hda1</em> ma su <em>/dev/md0</em>. Il contenuto di tale file dovrà quindi essere il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# &lt;file system&gt; &lt;mount point&gt;   &lt;type&gt;  &lt;options&gt;       &lt;dump&gt;  &lt;pass&gt;
proc		/proc	proc	defaults			0       0
/dev/md0	/	ext3	defaults,errors=remount-ro	0       1
/dev/hda2	none	swap	sw				0       0
/dev/hdb2	none	swap	sw				0       0</pre></div></div>

<p>A questo punto il sistema è pronto ad essere riavviato ed utilizzato.</p>
<p><strong>Verifica del funzionamento</strong></p>
<p>In entrambe le situazioni, per verificare che le operazioni siano andate a buon fine, sarà sufficiente controllare attraverso il comando mount che la device <em>/dev/md0</em> sia montata nella cartella <em>/</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount
/dev/md0 on / type ext3 (rw,errors=remount-ro)
...
...</pre></div></div>

<p>L&#8217;output conferma che tutto funziona come dovrebbe.</p>
<p><strong>Considerazione finale sulle aree di swap</strong></p>
<p>Anche se potrebbe risultare immediato pensare che volendo effettuare un mirror dell&#8217;intero sistema, anche la partizione di swap debba essere duplicata, non c&#8217;è niente di più sbagliato.<br />
Le aree di swap del sistema infatti sono gestite a livello di kernel ed è il kernel a sfruttarle a seconda delle necessità. Mettere in RAID 1 una partizione di swap comporterebbe una perdita di performance notevole. Nel momento in cui il kernel  scrivesse sulla partizione di swap primaria un&#8217;informazione, il sistema dovrebbe attendere che tale informazione venisse replicata anche sulla partizione swap secondaria. Tale informazione però non verrebbe mai utilizzata da nessuno ! Se a questo si aggiunge che il contenuto della partizione di swap è volatile, si capisce come sia molto più sensato indicare al sistema due aree di swap distinte, una sul primo disco ed una sul secondo, dichiarandole attraverso l&#8217;installer (si veda lo screenshot-8) o modificando a mano il file /etc/fstab in modo che contenga le seguenti righe :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/dev/hda2       none            swap    sw              0       0
/dev/hdb2       none            swap    sw              0       0</pre></div></div>

<p>In questo modo il kernel avrà due aree swap a cui far riferimento, e le performance ne gioveranno.</p>
<p><strong>Conclusioni</strong></p>
<p>Nel prossimo articolo verrà illustrato il primo dei due &#8220;case study&#8221;, una soluzione RAID 1 con Hard Disk ide &#8220;a cassetto&#8221;.</p>
<p><strong>Note</strong></p>
<p>Questa serie di articoli è apparsa in origine nel libro edito da Duke Italia <a href="http://www.hitechshop.it/detail.asp?idT=&#038;idC=&#038;idP=1&#038;Pid=34483&#038;testo=clustering%20e%20raid%20software">Clustering e raid software</a> allegato all&#8217;edizione italiana di <em>Linux Journal</em> dell&#8217;Ottobre 2006.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-3-di-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

