<?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; NFS</title>
	<atom:link href="http://www.miamammausalinux.org/category/software/nfs/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>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>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>
	</channel>
</rss>

