<?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; Linux HA</title>
	<atom:link href="http://www.miamammausalinux.org/category/clustering/linux-ha/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>Tue, 27 Jul 2010 12:03:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Evoluzione dell’alta affidabilità su Linux: confronto pratico tra Heartbeat classico ed Heartbeat con Pacemaker</title>
		<link>http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/</link>
		<comments>http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 07:00:44 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>Le due righe :</p>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>In questo modo il kernel avrà due aree swap a cui far riferimento, e le performance ne gioveranno.</p>
<p><strong>Conclusioni</strong></p>
<p>Nel prossimo articolo verrà illustrato il primo dei due &#8220;case study&#8221;, una soluzione RAID 1 con Hard Disk ide &#8220;a cassetto&#8221;.</p>
<p><strong>Note</strong></p>
<p>Questa serie di articoli è apparsa in origine nel libro edito da Duke Italia <a href="http://www.hitechshop.it/detail.asp?idT=&#038;idC=&#038;idP=1&#038;Pid=34483&#038;testo=clustering%20e%20raid%20software">Clustering e raid software</a> allegato all&#8217;edizione italiana di <em>Linux Journal</em> dell&#8217;Ottobre 2006.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-3-di-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RAID Software : Proteggere i dati con l’aiuto del kernel (2 di 5)</title>
		<link>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-2-di-5/</link>
		<comments>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-2-di-5/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 09:26:56 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Raid]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Protezione dati]]></category>
		<category><![CDATA[Sistema]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=559</guid>
		<description><![CDATA[Nel precedente articolo sono state introdotte le diverse tipologie di RAID ed i concetti di parità per la gestione della ridondanza. Di seguito viene affrontata nel dettaglio la creazione e l&#8217;amministrazione dei RAID attraverso il software Linux mdadm per configurare il sistema in modo che gestisca i diversi tipi di ridondanza sui dischi disponibili. RAID [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Nel precedente articolo sono state introdotte le diverse tipologie di RAID ed i concetti di parità per la gestione della ridondanza.<br />
Di seguito viene affrontata nel dettaglio la creazione e l&#8217;amministrazione dei RAID attraverso il software Linux <em>mdadm</em> per configurare il sistema in modo che gestisca i diversi tipi di ridondanza sui dischi disponibili.</p>
<p><strong>RAID software con Linux</strong></p>
<p>Per poter gestire via software i RAID, è necessario che il kernel utilizzato disponga del supporto   “Multiple devices driver support” insieme al “RAID Support” ed a tutti i moduli relativi ai livelli di RAID che si vogliono utilizzare. Nei kernel precompilati che vengono installati dalle più diffuse distribuzioni questi moduli sono compresi, quindi è necessario porre attenzione solo in caso di kernel compilati “a mano”.<br />
Il modulo principale che si occupa della gestione dei RAID è denominato “md” (Multiple Disk) che è un alias di “md-mod”. Per verificare che il kernel installato sulla macchina utilizzata abbia questo supporto è sufficiente provare a caricare il modulo :</p>

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

<p>Se il comando non restituisce errori, all&#8217;interno del filesystem virtuale /proc verrà creato un file denominato mdstat contenente le informazioni sullo stato della controller RAID software :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities :
unused devices: &lt;none&gt;</pre></div></div>

<p>Lo stato del RAID, non avendo effettuato alcuna configurazione, è nullo, ma l&#8217;output ricevuto conferma che il sistema supporta il tipo di operazioni che vogliamo effettuare.<br />
A questo punto andranno create le devices, i dispositivi virtuali associati ai RAID. Generalmente in Linux, tali devices vengono nominate con mdX dove X è un numero che partendo da 0 identifica tutti gli array gestiti dal sistema.</p>
<p><strong>Creare i RAID con mdadm</strong></p>
<p>In Linux originariamente, la gestione del RAID software era affidata ad una suite di programmi denominata raidtools che comprendeva una serie di eseguibili attraverso i quali era possibile creare, modificare ed amministrare i RAID software. Nelle recenti distribuzioni il pacchetto raidtools è stato rimpiazzato dal programma mdadm. Oltre a contenere notevoli migliorie, esso presenta l&#8217;indubbio vantaggio di consentire la gestione totale dei RAID di sistema attraverso un unico comando.<br />
mdadm è incluso come pacchetto binario in tutte le distribuzioni recenti, mentre i sorgenti sono disponibili a questo indirizzo : <a href="http://www.cse.unsw.edu.au/~neilb/source/mdadm/">http://www.cse.unsw.edu.au/~neilb/source/mdadm/</a> .</p>
<p>Prima di cominciare è necessario avere ben chiaro ciò che si vuole ottenere. Tenendo come riferimento i pregi ed i difetti di ciascun livello illustrati poco sopra bisogna capire quale livello si adatta di più all&#8217;obiettivo che si vuole raggiungere.<br />
Se ad esempio, la sicurezza dei dati è un fattore secondario e si necessita di performance e quanto più spazio possibile, sarà sensato creare un RAID 0, se invece i dati registrati sono di importanza critica, allora converrà optare per un RAID 1 a discapito delle performance, oppure per un RAID 5 nel caso in cui i dischi utilizzabili siano tre o più e si voglia aumentare la velocità di accesso ai dati.<br />
Una volta fatta la scelta sul livello da implementare, è necessario scegliere se si vuole mettere sotto RAID l&#8217;intero sistema, compresa quindi la partizione root (ossia “/”), oppure solo alcune partizioni. Tratteremo successivamente la messa in RAID della partizione root, gli esempi illustrati riguardano l&#8217;implementazione su partizioni diverse da quella principale. Nel caso particolare sono state utilizzate le partizioni hda5, hda6 ed hda7 tutte di 250 MegaByte. Avrebbe più senso utilizzare partizioni che risiedano su dischi differenti, ed in ambienti di produzione questo è vivamente consigliato, ma per comprendere i meccanismi di funzionamento di mdadm questo tipo di situazione è più che sufficiente. Vincolante è la dimensione delle partizioni che deve essere quantomeno simile per tutte quelle impiegate.<br />
Al comando mdadm, andranno passati come parametri il nome della device che si vorrà creare (ad esempio <em>/dev/md0</em>), il numero di dischi  impiegati nell&#8217;array ed infine le partizioni che ne faranno parte.</p>
<p><em>RAID 0</em></p>
<p>Come primo esempio verrà creato un RAID 0 (striping) con le due partizioni hda5 ed hda6. Il comando che andrà eseguito, sarà il seguente :</p>

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

<p>il messaggio “mdadm: array /dev/md0 started.” indica che il processo di creazione del RAID 0 è stato avviato con successo. Ciò è verificabile consultando il contenuto del file <em>/proc/mdstat</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 hda6[1] hda5[0]
      498688 blocks 64k chunks
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>L&#8217;output mostra come tra le “Personalities” (i tipi di raid disponibili) sia presente il RAID 0 e che la controller software gestisce la device md0 che poggia su di un Raid0 formato da hda5 e hda6 (nell&#8217;ordine sono i dischi con identificativo 0 e 1).<br />
La device <em>md0</em> è composta da 498.688 blocchi (ciascuno da 1024 byte), per un totale di circa 500 Mb che equivale alla somma delle dimensioni dei nostri dischi.<br />
L&#8217;ultimo valore mostrato è la “Chunck size” che riguarda la dimensione dei blocchi minima registrabile su ciascun disco dell&#8217;array. Ad esempio se va registrato un dato da 128k, il sistema registrerà 64k sul primo disco ed i rimanenti 64 sul secondo. Nel caso del Raid1 la chunk size non viene indicata in quanto i dati registrati non devono essere divisi per i dischi ma replicati così come sono su ciascuno di questi. Nel RAID 5 la chunk size è la dimensione del blocco di parità.</p>
<p><em>RAID 1</em></p>
<p>Nell&#8217;ambito della creazione di un RAID 1 il comando non cambierà di molto, l&#8217;unico parametro differente sarà “level” per il quale andrà indicato 1, il numero corrispondente al RAID “striping” :</p>

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

<p>Anche in questo caso è possibile seguire lo stato del nuovo RAID creato :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1]
md0 : active raid1 hda6[1] hda5[0]
      249344 blocks [2/2] [UU]
      [=================&gt;...]  resync = 86.0% (216000/249344) finish=0.0min speed=6156K/sec
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>Si nota dall&#8217;output ottenuto che la device md0 è in stato “resync”. Perché a differenza del RAID 0, unico RAID che non prevede la replicazione dei dati, i due dischi devono sincronizzarsi, processo per il quale, a seconda della grandezza relativa alle partizioni impiegate, è necessario del tempo.<br />
Terminato il “resync”, il contenuto di mdstat sarà il seguente :</p>

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

<p>Adesso il RAID 1 è completamente attivo. L&#8217;output rispetto alle operazioni precedenti è leggermente differente, infatti oltre alle informazioni relative al tipo di raid impiegato ed al numero di blocchi disponibili nella device <em>md0</em> esistono anche due voci che indicano lo stato dei dischi che fanno parte del RAID. La voce <em>[2/2]</em>  indica con il primo numero il totale dei dischi che fanno parte dell&#8217;array ed il secondo il numero di device attive nell&#8217;array. La voce <em>[UU]</em> indica invece che entrambi i dischi sono in stato “Up”. Come vedremo in seguito, se uno dei dischi entra in stato “Failure” la lettera “U” verrà rimpiazzata dal carattere “_”.</p>
<p><em>RAID 4</em></p>
<p>La creazione di un Raid4 implica che le partizioni impiegate debbano essere tre o più. Una di queste andrà dichiarata come “spare” e conterrà le informazioni di parità :</p>

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

<p>Osservando attraverso il filesystem <em>/proc</em> lo stato del RAID, si nota come le partizioni <em>hda6</em> ed <em>hda5</em> risultano entrambe in stato UP, mentre è in corso la sincronizzazione della partizione <em>hda7</em>, che presenta la dicitura “(S)” che sta ad indicare come questa sia la partizione di spare :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda7[2](S) hda6[1] hda5[0]
      249344 blocks level 4, 64k chunk, algorithm 0 [2/2] [UU]
      [=================&gt;...]  resync = 88.1% (220368/249344) finish=0.0min speed=6485K/sec
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>Quando l&#8217;operazione di sincronizzazione verrà completata lo stato del RAID sarà il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda7[2](S) hda6[1] hda5[0]
      249344 blocks level 4, 64k chunk, algorithm 0 [2/2] [UU]
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p><em>RAID 5</em></p>
<p>Anche nel caso di un Raid5 le partizioni impiegate devono essere tre o più di tre :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm --create /dev/md0 --level=5 --raid-disks=3 /dev/hda5 /dev/hda6 /dev/hda7
mdadm: array /dev/md0 started.</pre></div></div>

<p>A differenza delle precedenti operazioni di “resync”, la controller software  effettua un “recovery”. Questo perché il Raid5 non replica i dati in maniera lineare tra i dischi impiegati ma li divide gestendone la parità :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda7[3] hda6[1] hda5[0]
      498688 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
      [================&gt;....]  recovery = 84.0% (209920/249344) finish=0.1min speed=3463K/sec
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>Terminata la fase di “recovery” lo stato del Raid5 sarà il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda7[2] hda6[1] hda5[0]
      498688 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>I blocchi impiegati in questo livello sono  498688, corrispondenti a circa 500 Mb, come nell&#8217;esempio del Raid0, con la sola differenza che le partizioni impiegate in questo caso sono tre e che quindi il totale di spazio disponibile equivale a due terzi della somma delle dimensioni delle tre partizioni.<br />
La “chunk size” è la stessa, mentre viene indicato il tipo di algoritmo utilizzato dalla controller software che è 2 ed equivale al default. Se approfondendo i metodi di gestione della parità (che non verranno trattati nell&#8217;articolo) si volessero scegliere altri tipi di algoritmo implementabili, basterà in fase di creazione dell&#8217;array indicare con il parametro “&#8211;parity” il tipo di algoritmo desiderato.</p>
<p><strong>SET FAULTY o come simulare la sostituzione di un disco :</strong></p>
<p>Prima di procedere con la creazione del filesystem sulla device md0 creata, verrà simulato il crash di un disco all&#8217;interno del Raid5 appena creato, in modo da capire come agire in questo tipo di situazioni.<br />
Supponiamo infatti che anziché essere tre partizioni locali, queste siano divise in tre dischi distinti.<br />
Forziamo il malfunzionamento della prima partizione dell&#8217;array, hda5 :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm /dev/md0 --set-faulty /dev/hda5
mdadm: set /dev/hda5 faulty in /dev/md0</pre></div></div>

<p>Il RAID 5 è ancora attivo, ma sta funzionando con solo due partizioni su tre. In caso di rottura di un&#8217;ulteriore disco, cesserebbe di funzionare :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda7[2] hda6[1] hda5[3](F)
      498688 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p><em>[_UU]</em> indica che i dischi disponibili sono due su tre ed il primo di questi non sta funzionando.<br />
Procediamo quindi con la rimozione dall&#8217;array e successivamente con la rimozione fisica dalla macchina :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm /dev/md0 --remove /dev/hda5
mdadm: hot removed /dev/hda5</pre></div></div>

<p>A questo punto, una volta collegato il nuovo disco, questo andrà reintrodotto nell&#8217;array :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm /dev/md0 --add /dev/hda5
mdadm: hot added /dev/hda5</pre></div></div>

<p>La controller di sistema inizierà ad effettuare il “recovery” del nuovo disco introdotto ed al termine di questa operazione, l&#8217;array sarà nuovamente attivo :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda5[0] hda7[2] hda6[1]
      498688 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p><em>[UUU]</em> indica infatti che i tre dischi sono di nuovo attivi.</p>
<p><strong>Registrare la struttura del RAID</strong></p>
<p>Durante la creazione del RAID mdadm ha registrato su ogni disco facente parte dell&#8217;array il “Persistent SuperBlock”. Quest&#8217;area, posta all&#8217;inizio del disco, memorizza le informazioni di appartenenza del disco all&#8217;interno del RAID. Questo consente al kernel di rilevare la struttura del RAID in fase di boot senza doversi leggere le informazioni da un file di configurazione ed ovviamente facilita la possibilità di far risiedere la partizione root su RAID.<br />
Può succedere però che in caso di rottura di uno dei dischi si debba ricostruire la struttura senza le informazioni presenti nel “Persistent Superblock”.<br />
Per ovviare a questo inconveniente è consigliabile registrare le informazioni del RAID creato all&#8217;interno del file <em>/etc/mdadm.conf</em>, che verrà consultato solo all&#8217;occorrenza.<br />
I semplici passi da seguire sono questi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ echo 'DEVICE /dev/hda[567]' &gt; /etc/mdadm/mdadm.conf
$ mdadm  --examine  --scan --config=mdadm.conf &gt;&gt; /etc/mdadm/mdadm.conf</pre></div></div>

<p>A questo punto il file <em>mdadm.conf</em> conterrà quanto segue :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /etc/mdadm/mdadm.conf
DEVICE /dev/hda[567]
ARRAY /dev/md0 level=raid5 num-devices=3 UUID=59e81780:c30962ed:c4aa02bd:4dd9dcae</pre></div></div>

<p>Ovviamente il parametro “DEVICE” rispecchia gli esempi proposti sinora, se si impiegheranno dischi diversi questi andranno indicati con le stesse modalità. Se nell&#8217;array che si è costruito vengono utilizzate ad esempio le partizioni <em>hda1</em>, <em>hda2</em> e <em>hdb1</em> e <em>hdb2</em> e <em>hdc3</em>, il parametro “DEVICE” sarà il seguente  :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">DEVICE /dev/hd[ab][12] /dev/hdc3</pre></div></div>

<p><strong>Creare un filesystem sulla device /dev/md0</strong></p>
<p>L&#8217;ultimo passo da effettuare prima di cominciare ad utilizzare l&#8217;array per la registrazione di dati è quello di creare un filesystem sulla device <em>/dev/md0</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mke2fs -j /dev/md0
mke2fs 1.39-WIP (31-Dec-2005)
Etichetta del filesystem=
Tipo SO: Linux
Dimensione blocco=1024 (log=0)
Dimensione frammento=1024 (log=0)
124928 inode, 498688 blocchi
24934 blocchi (5.00%) riservati per l'utente root
Primo blocco dati=1
61 gruppi di blocchi
8192 blocchi per gruppo, 8192 frammenti per gruppo
2048 inode per gruppo
Backup del superblocco salvati nei blocchi:
        8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
...
...</pre></div></div>

<p>A questo punto, montando la device su una directory locale, il filesystem sarà disponibile per l&#8217;utilizzo nel sistema :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount /dev/md0 /raid5
$ df -h /raid5/
Filesystem         Dimens. Usati Disp. Uso% Montato su
/dev/md0              472M  8,1M  440M   2% /raid5</pre></div></div>

<p>Per rendere permanente la disponibilità del filesystem sarà necessario aggiungere la seguente riga in /etc/fstab :</p>

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

<p>Ad ogni riavvio del sistema, il RAID verrà montato nella directory /raid5.</p>
<p><strong>Monitorare i RAID</strong></p>
<p>In Debian, oltre ad avere un eseguibile richiamabile da linea di comando, il pacchetto mdadm contiene anche un demone che monitora lo stato dei RAID e segnala con una e-mail eventuali malfunzionamenti. La configurazione di questo demone è contenuta nel file /etc/default/mdadm :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">START_DAEMON=true
MAIL_TO=&quot;root&quot;
AUTOSTART=true</pre></div></div>

<p>I parametri sono auto esplicativi, si può scegliere se avviare mdadm come un demone, a quale mail segnalare malfunzionamenti ed infine se il demone si deve avviare durante il boot di sistema.<br />
Per le distribuzioni che non prevedono l&#8217;impiego di un demone per la gestione delle notifiche di malfunzionamento, è comunque possibile monitorare lo stato dei RAID passando il parametro “&#8211;monitor” al comando mdadm :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm --monitor –mail=casella@dominio.com --delay=1800 /dev/md0</pre></div></div>

<p><strong>Conclusioni</strong></p>
<p>Nel prossimo articolo verranno presentate diverse soluzioni per mettere in Raid la partizione / del filesystem.</p>
<p><strong>Note</strong></p>
<p>Questa serie di articoli è apparsa in origine nel libro edito da Duke Italia <a href="http://www.hitechshop.it/detail.asp?idT=&#038;idC=&#038;idP=1&#038;Pid=34483&#038;testo=clustering%20e%20raid%20software">Clustering e raid software</a> allegato all&#8217;edizione italiana di <em>Linux Journal</em> dell&#8217;Ottobre 2006.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-2-di-5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>RAID Software : Proteggere i dati con l&#8217;aiuto del kernel (1 di 5)</title>
		<link>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-laiuto-del-kernel-1-di-5/</link>
		<comments>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-laiuto-del-kernel-1-di-5/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 09:31:08 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Raid]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Protezione dati]]></category>
		<category><![CDATA[Sistema]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=543</guid>
		<description><![CDATA[In questo saggio verranno analizzate le diverse tipologie di RAID esistenti e come queste possano essere implementate in Linux attraverso il kernel ed il programma mdadm. Attraverso poi l&#8217;illustrazione di due storie di successo, verranno presentate delle soluzioni di RAID che permettano di gestire dei backup programmati e di avere sistemi ad alta affidabilità che [...]]]></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>In questo saggio verranno analizzate le diverse tipologie di RAID esistenti e come queste possano essere implementate in Linux attraverso il <em>kernel</em> ed il programma <em>mdadm</em>.<br />
Attraverso poi l&#8217;illustrazione di due storie di successo, verranno presentate delle soluzioni di RAID che permettano di gestire dei backup programmati e di avere sistemi ad alta affidabilità che gestiscano quantità di dati nell&#8217;ordine dei <em>TeraByte</em>.<br />
In questa prima parte verranno illustrate le diverse tipologie di RAID ed analizzati i concetti di parità per la gestione della ridondanza.</p>
<p><strong>RAID : Redundant Array of Inexpensive Disks</strong></p>
<p>Quando si parla di RAID, in italiano “batteria ridondante di dischi a basso costo”, si intende una collezione di due o più dischi sui quali vengono registrati dei dati secondo determinati livelli logici. Tali livelli sono generalmente gestiti attraverso hardware specifico, in alcuni casi integrato nelle schede madri ed in altri presente in schede esterne denominate <em>controller</em>.<br />
Meno frequente è l&#8217;impiego di sistemi RAID gestiti via software. Tali sistemi, grazie alla rapida evoluzione dei software non rappresentano più qualcosa di pionieristico e con l&#8217;abbassamento del costo dell&#8217;hardware, studiare soluzioni affidabili che impieghino RAID software è sicuramente una scelta vincente.<br />
Linux può funzionare da <em>controller</em> RAID software nella stessa maniera in cui funzionano quelle hardware. Tutto questo è reso possibile oltre che dalla struttura del <em>kernel</em>, anche dall&#8217;elevata potenza di calcolo dei moderni processori (anche di fascia medio-bassa) che consentono di gestire i dati registrati sui dischi non riducendo in maniera sensibile le performance del sistema.<br />
Ma lo sfruttamento delle potenzialità del <em>kernel</em> Linux non si ferma qui. Esistono progetti Opensource che consentono estendere le funzionalità di RAID verso obiettivi insperati. E&#8217; il caso del progetto “DRBD”, che consente la creazione di RAID su computer diversi connessi in rete (in soluzioni ad alta affidabilità).<br />
Come tutto questo sia applicabile alla realtà verrà illustrato nelle prossime pagine.</p>
<p><strong>I livelli di RAID disponibili in Linux</strong></p>
<p>I livelli di RAID implementabili via software attraverso il kernel Linux sono essenzialmente quattro. Quale livello utilizzare dipende essenzialmente da tre fattori che sono la disponibilità di dischi, la sicurezza e le prestazioni. Definita l&#8217;importanza di questi fattori, si potrà proseguire nell&#8217;analisi delle soluzioni disponibili.</p>
<p><em>RAID 0 (Striping)</em></p>
<p>Viene impiegato laddove si hanno a disposizione un minimo di due dischi approssimativamente della stessa grandezza. La capacità di memoria viene combinata tramite la suddivisione in blocchi dei dati su dischi diversi. L&#8217;accesso ai blocchi può avvenire parallelamente, garantendo performances ottimali. Inconveniente di questo tipo di RAID è che non esiste ridondanza, che significa perdita dei dati in caso di malfunzionamento di uno dei dischi.</p>
<div id="attachment_544" class="wp-caption alignnone" style="width: 265px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura1-255x300.png" alt="Figura1" title="raid-software_articolo_1-10-figura1" width="255" height="300" class="size-medium wp-image-544" /></a><p class="wp-caption-text">Figura1</p></div>
<p><em>RAID 1 (Mirroring)</em></p>
<p>Viene scelto generalmente quando non si può prescindere dall&#8217;integrità dei dati. La struttura prevede l&#8217;esistenza di due dischi, l&#8217;uno replica esatta dell&#8217;altro. Il dato viene scritto su entrambi i dischi e se uno dei due cessa di funzionare, l&#8217;informazione rimane comunque disponibile sull&#8217;altro. A sfavore di questa scelta sono la limitazione dello spazio disponibile (in pratica quello di un solo disco) e la perdita di performances in caso di massicce scritture.</p>
<div id="attachment_545" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura2.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura2-300x155.png" alt="Figura2" title="raid-software_articolo_1-10-figura2" width="300" height="155" class="size-medium wp-image-545" /></a><p class="wp-caption-text">Figura2</p></div>
<p><em>RAID 4 (Dedicated parity)</em></p>
<p>Questa tipologia di RAID si rifà al concetto di parità dedicata. Su uno dei tre, o più dischi impiegati, verranno registrate le informazioni di parità, ossia le informazioni che servono a preservare la ridondanza dei dati.<br />
Ad esempio utilizzando tre dischi (Figura3), i dati verranno distribuiti sui primi due mentre il terzo conterrà le parità. In caso di rottura di uno dei tre dischi, se questo è uno dei due contenente i dati, una volta sostituito, potrà essere ricostruito partendo dalle informazioni di parità. Se invece a rompersi sarà il disco di parità, i dati saranno ancora accessibili, ma nel nuovo disco andranno ricalcolate le stesse.<br />
La sicurezza è legata, quindi, all&#8217;affidabilità dei dischi ed in particolare al disco di parità, rotto quello, il RAID assume uno stato instabile. Le prestazioni sono elevate in quanto è possibile l&#8217;accesso parallelo a blocchi su dischi differenti. Lo spazio disponibile sarà la somma delle dimensioni di tutti i dischi escluso quello di parità.</p>
<div id="attachment_546" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura3.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura3-300x145.png" alt="Figura3" title="raid-software_articolo_1-10-figura3" width="300" height="145" class="size-medium wp-image-546" /></a><p class="wp-caption-text">Figura3</p></div>
<p><em>RAID 5 (Distributed parity)</em></p>
<p>Il RAID 5 differisce dal RAID 4 solo nel fatto che le informazioni di parità anziché essere registrate su di un disco a parte sono invece distribuite su tutti i dischi facenti parte dell&#8217;array. Anche in questo caso devono esserci un minimo di tre dischi, ed in caso di rottura di uno dei tre, i dati contenuti in questo saranno ricostruiti partendo dalle informazioni di parità presenti negli altri due (Figura4).<br />
Il livello garantisce sicurezza e performances, ma sono necessari un minimo di tre dischi per la sua realizzazione. Lo spazio disponibile sarà anche in questo caso la somma delle dimensioni di tutti i dischi meno uno (che rappresenta le parità distribuite tra i dischi).</p>
<div id="attachment_547" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura4.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura4-300x139.png" alt="Figura4" title="raid-software_articolo_1-10-figura4" width="300" height="139" class="size-medium wp-image-547" /></a><p class="wp-caption-text">Figura4</p></div>
<p>Oltre ai livelli illustrati, Linux rende disponibile anche il livello Linear che prevede la concatenazione dei dischi sulla linea del Raid 0 ma senza scritture parallele (in pratica quando un disco viene riempito, si passa al successivo) ed il livello 6, un livello 5 con parità raddoppiata. E&#8217; difficile vedere entrambi impiegati in ambienti di produzione e pertanto non verranno trattati negli esempi.</p>
<p><strong>Il calcolo delle parità</strong></p>
<p>Prima di proseguire è necessario approfondire il discorso relativo al calcolo delle parità.<br />
La parità viene ottenuta attraverso il risultato di un&#8217;operazione di XOR sui bit che fanno parte dell&#8217;informazione. Un&#8217;operazione di XOR tra due bit fornisce risultato 0 quando i due bit hanno uguale valore (cioè sono entrambi 1 o entrambi 0), mentre restituisce 1 quando i bit hanno valori opposti (il primo 1 ed il secondo 0, o viceversa).<br />
Si supponga che A, B, C e D rappresentino quattro dischi impiegati in un ipotetico Raid4 mentre “P” rappresenti il disco contenente le parità :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">A B C D  P
1 0 0 1  0
0 0 0 1  1
0 0 1 1  0
0 1 1 0  0</pre></div></div>

<p>Il valore contenuto nella colonna P è il risultato delle operazioni di XOR. Nella prima riga il bit di A è 0, in XOR con il bit di B 0 che risulta 1, che in XOR con il bit C 0 risulta 1, che in XOR con il bit di D 1 risulta 0. 0 è il bit di parità. La verifica immediata la si ottiene facendo il percorso inverso. Simulando cioè un disco in stato “failure” che viene rimpiazzato :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">A B C D  P
1 0 X 1  0
0 0 X 1  1
0 0 X 1  0
0 1 X 0  0</pre></div></div>

<p>il valore del bit C sarà il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">C = (((P XOR D) XOR B) XOR A)</pre></div></div>

<p>Per la prima riga ad esempio :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">C = (((0 XOR 1) XOR 0) XOR 1) = 0</pre></div></div>

<p>Compreso questo si capisce come l&#8217;informazione di parità consenta di ricostruire il dato presente sul disco guasto partendo dal confronto con il dato associato ancora presente.<br />
L&#8217;applicazione di quanto dimostrato è visibile in Figura3 e Figura4.</p>
<p><strong>Conclusioni</strong></p>
<p>Terminata la panoramica teorica delle soluzioni RAID, nel prossimo articolo queste verranno applicate alla realtà di Linux.</p>
<p><strong>Note</strong></p>
<p>Questa serie di articoli è apparsa in origine nel libro edito da Duke Italia <a href="http://www.hitechshop.it/detail.asp?idT=&#038;idC=&#038;idP=1&#038;Pid=34483&#038;testo=clustering%20e%20raid%20software">Clustering e raid software</a> allegato all&#8217;edizione italiana di <em>Linux Journal</em> dell&#8217;Ottobre 2006.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-laiuto-del-kernel-1-di-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (4 di 4)</title>
		<link>http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-4-di-4/</link>
		<comments>http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-4-di-4/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 06:32:45 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Linux Virtual Server]]></category>
		<category><![CDATA[Postfix]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Bilanciamento di carico]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Posta elettronica]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=272</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; L’ultima fase del progetto prevede l’installazione di Postfix su tutti i real server ed il loro bilanciamento attraverso ldirectord. Postfix verrà configurato in modo che le caselle risiedano in un’area condivisa ed i profili dei domini e delle caselle vengano registrati in maniera centralizzata all’interno di un database MySQL. Il tutto verrà gestito dall’interfaccia [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/postfix.png" alt="postfix" title="postfix" width="100" class="alignnone size-full wp-image-176" />&nbsp;&nbsp;&nbsp;&nbsp;<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/01/lvs.png" alt="lvs" title="lvs" width="100" height="100" class="alignnone size-full wp-image-260" /></p>
<p>L’ultima fase del progetto prevede l’installazione di Postfix su tutti i real server ed il loro bilanciamento attraverso ldirectord. Postfix verrà configurato in modo che le caselle risiedano in un’area condivisa ed i profili dei domini e delle caselle vengano registrati in maniera centralizzata all’interno di un database MySQL. Il tutto verrà gestito dall’interfaccia web offerta dal programma postfixadmin.</p>
<p>Requisito essenziale per la riuscita di questa fase del progetto è la disponibilità di un server per lo storage e di un database che siano condivisi ed accessibili da tutti i real server, così come illustrato nello schema riassuntivo presentato nel primo articolo di questa serie.</p>
<p><strong>Configurazione dello storage condiviso via NFS</strong></p>
<p>Ai fini della buona riuscita del progetto è essenziale che le caselle di posta che verranno servite dalla batteria di server risiedano fisicamente nella stessa posizione. Questo significa che la directory nella quale il servizio postfix di ciascun real server scriverà i messaggi monterà uno storage comune. Questo potrà essere uno share NFS (Network File System), un NAS (Network Attached Storage) o un qualsiasi altro supporto di memorizzazione che sia condivisibile.</p>
<p>Nel caso in oggetto, lo storage comune è di tipo NFS e condivide una cartella nominata “mail” erogata dal server 192.168.0.150. La directory locale nella quale sarà montato tale share è /usr/local/virtual e quindi la riga da aggiungere in ciascun real server nel file /etc/fstab è:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">192.168.0.150:<span style="color: #000000; font-weight: bold;">/</span>mail     <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>virtual    nfs    rw,<span style="color: #7a0874; font-weight: bold;">bg</span>,<span style="color: #007800;">vers</span>=<span style="color: #000000;">3</span>    <span style="color: #000000;">0</span> <span style="color: #000000;">0</span></pre></div></div>

<p>I questo modo ad ogni riavvio il filesystem NFS verrà automaticamente montato. Per effettuare il primo mount è sufficiente lanciare il comando come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>virtual</pre></div></div>

<p><strong>Configurazione del database condiviso con postfixadmin</strong></p>
<p>Per fare in modo che tutti i real server possano leggere i profili in maniera centralizzata sarà necessario predisporre un database MySQL con una struttura adeguata a supportare la registrazione di tutti i dati relativi al server di posta. Tale server non potrà essere uno dei real server (così come per lo storage condiviso), in quanto una situazione simile annullerebbe la ridondanza implicita nella soluzione sviluppata sinora.</p>
<p>Esiste un progetto Open Source denominato postfixadmin che consente di creare e gestire il database relativo ad un server di posta Postfix attraverso un’intuitiva interfaccia web. Tale software è disponibile presso l’indirizzo <a href="http://postfixadmin.sourceforge.net/" target="_blank">http://postfixadmin.sourceforge.net/</a> e può essere installato su una qualsiasi macchina che possieda un webserver apache installato (ad esempio uno dei real server configurati nello scorso articolo). Una volta reperito il pacchetto sarà sufficiente decomprimerlo nella cartella relativa alla document root del sito erogato da apache:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>kent.dl.sourceforge.net<span style="color: #000000; font-weight: bold;">/</span>sourceforge<span style="color: #000000; font-weight: bold;">/</span>postfixadmin<span style="color: #000000; font-weight: bold;">/</span>postfixadmin-2.2.1.1.tar.gz
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzvf</span> postfixadmin_2.2.1.1.tar.gz
<span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> postfixadmin-2.2.1.1 postfixadmin</pre></div></div>

<p>Sul server MySQL andrà creato il database relativo a postfix, attivando la console mysql:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mysql <span style="color: #660033;">-u</span> root <span style="color: #660033;">-p</span></pre></div></div>

<p>e lanciando i comandi SQL di creazione ed accesso relativi al database:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> postfix;
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">CREATE</span> USER <span style="color: #ff0000;">'postfix'</span>@<span style="color: #ff0000;">'localhost'</span> <span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">'password_scelta'</span>;
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">ALL</span> PRIVILEGES <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">`postfix`</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #ff0000;">'postfix'</span>@<span style="color: #ff0000;">'192.168.0.50'</span>;
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">ALL</span> PRIVILEGES <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">`postfix`</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #ff0000;">'postfix'</span>@<span style="color: #ff0000;">'192.168.0.51'</span>;
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">ALL</span> PRIVILEGES <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">`postfix`</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #ff0000;">'postfix'</span>@<span style="color: #ff0000;">'192.168.0.52'</span>;
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">FLUSH</span> PRIVILEGES;</pre></div></div>

<p>Da notare come per l’accesso vengono configurati TUTTI i real server, in quanto ciascuno di questi dovrà poter accedere al database per la gestione delle informazioni dei profili. Nel file config.inc.php andranno quindi configurate le informazioni d’accesso al database modificando le seguenti righe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">$CONF</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'configured'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> = <span style="color: #c20cb9; font-weight: bold;">true</span>;
<span style="color: #007800;">$CONF</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'database_type'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> = <span style="color: #ff0000;">'mysql'</span>;
<span style="color: #007800;">$CONF</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'database_host'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> = <span style="color: #ff0000;">'localhost'</span>;
<span style="color: #007800;">$CONF</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'database_user'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> = <span style="color: #ff0000;">'postfix'</span>;
<span style="color: #007800;">$CONF</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'database_password'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> = <span style="color: #ff0000;">'chosen_password'</span>;
<span style="color: #007800;">$CONF</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'database_name'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> = <span style="color: #ff0000;">'postfix'</span>;</pre></div></div>

<p>Collegandosi alla pagina di setup <em>http://192.168.0.50/postfixadmin/setup.php</em> verranno effettuati tutti i controlli sul sistema. Se questi avranno esito positivo, lo script creerà tutte le tabelle necessarie nel database postfix e consentirà di creare l’utente amministratore direttamente dall’interfaccia web. L’ultimo accorgimento necessario, prima di procedere con l’utilizzo dell’interfaccia, sarà quello di cancellare il file setup.php dalla directory di postfixadmin:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>postfixadmin
<span style="color: #c20cb9; font-weight: bold;">rm</span> setup.php</pre></div></div>

<p>La configurazione lato MySQL è così completa ed è accessibile attraverso l’interfaccia web. Da questa si potranno creare i domini, le caselle e gli alias che il server di posta dovrà gestire.</p>
<p><strong>Installazione e configurazione di Postfix</strong></p>
<p>L’installazione e la configurazione di Postfix deve essere effettuata su ciascuno dei server reali in maniera identica. Essa comprende il pacchetto base ed il modulo per l’integrazione con mysql:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> postfix postfix-mysql</pre></div></div>

<p>La directory in cui i file di configurazione vengono registrati è <em>/etc/postfix</em> ed il file essenziale per il funzionamento di postfix è mail.cf. All’interno di questo file andrà definito il metodo di accesso ai profili ed alle risorse. Nel dettaglio i parametri essenziali da configurare riguardano quali reti fanno parte del sistema e quindi potranno sfruttare il mailserver per l’invio dei messaggi:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mynetworks = 127.0.0.0<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8</span> 192.168.0.0<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">24</span></pre></div></div>

<p>Dove verranno archiviati i messaggini di posta ricevuti (mount NFS condiviso):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">use_mbox = no
home_mailbox = <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>virtual</pre></div></div>

<p>E dove potranno essere reperite le informazioni relative ai profili:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">virtual_alias_maps = mysql:<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>postfix<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span>virtual_alias_maps.cf
virtual_gid_maps = static:<span style="color: #000000;">106</span>
virtual_mailbox_base = <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>virtual
virtual_mailbox_domains = mysql:<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>postfix<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span>virtual_domains_maps.cf
virtual_mailbox_limit = <span style="color: #000000;">1151200000</span>
virtual_mailbox_maps = mysql:<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>postfix<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span>virtual_mailbox_maps.cf
virtual_minimum_uid = <span style="color: #000000;">105</span>
virtual_transport = virtual
virtual_uid_maps = static:<span style="color: #000000;">105</span></pre></div></div>

<p>La dicitura <em>mysql:
<percorso file .cf></em> indica che le informazioni relative al parametro sono contenute nel file con estensione cf indicato. Nel dettaglio i file indicati andranno creati nel path <em>/etc/postfix/mysql</em> come segue:</p>
<p><em>/etc/postfix/mysql/virtual_alias_maps.cf</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user = postfix
password = password_scelta
hosts = 192.168.0.200
dbname = postfix
table = <span style="color: #7a0874; font-weight: bold;">alias</span>
select_field = goto
where_field = address</pre></div></div>

<p><em>/etc/postfix/mysql/virtual_domains_maps.cf</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user = postfix
password = password_scelta
hosts = 192.168.0.200
dbname = postfix
table = domain
select_field = description
where_field = domain
additional_conditions = and backupmx = <span style="color: #ff0000;">'0'</span> and active = <span style="color: #ff0000;">'1'</span></pre></div></div>

<p><em>/etc/postfix/mysql/virtual_mailbox_maps.cf</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user = postfix
password = password_scelta
hosts = 192.168.0.200
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
additional_conditions = and active = <span style="color: #ff0000;">'1'</span></pre></div></div>

<p>Come è facilmente intuibile quanto indicato nei vari file sono i dati di accesso al database con i relativi nomi di tabella, di campo e le condizioni per estrapolare le informazioni relative ad alias, domini e mailbox servite da Postfix. Prima di avviare il servizio è necessaria un’ultima precisazione in merito ai permessi. Infatti Postfix scriverà nella cartella indicata nel parametro <em>home_mailbox</em> attraverso il suo utente, “postfix” appunto, che è stato creato durante l’installazione del pacchetto :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">id</span> postfix
<span style="color: #007800;">uid</span>=<span style="color: #000000;">105</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>postfix<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #007800;">gid</span>=<span style="color: #000000;">106</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>postfix<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #007800;">gruppi</span>=<span style="color: #000000;">106</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>postfix<span style="color: #7a0874; font-weight: bold;">&#41;</span>,<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>daemon<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>Questo comporta che l’utente postfix ed il gruppo postfix devono avere lo stesso uid di sistema su tutti i real server, poiché ciascuno di questi si troverà nella condizione di scrivere nell’area condivisa. Essenziale sarà quindi assegnare la cartella <em>/usr/local/virtual</em> all’utente postfix:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chown</span> postfix:postfix <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>virtual</pre></div></div>

<p>e che l’id dell’utente e del gruppo sia allineato su tutti i real server. Se le utenze hanno id disallineati  è possibile correggere la situazione con i seguenti comandi:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">groupmod <span style="color: #660033;">-g</span> <span style="color: #000000;">106</span> postfix
usermod <span style="color: #660033;">-u</span> <span style="color: #000000;">105</span> <span style="color: #660033;">-g</span> <span style="color: #000000;">106</span> postfix</pre></div></div>

<p>Terminati questi ultimi controlli sarà possibile avviare il servizio postfix su ciascun real server:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>postfix start</pre></div></div>

<p><strong>Aggiunta del servizio postfix ad ldirectord</strong></p>
<p>A completamento del progetto l’attenzione viene spostata sui server nei quali è configurato il servizio di bilanciamento in alta affidabilità. All’interno del file <em>/etc/ha.d/ldirectord.cf</em> andranno così aggiunte le righe relative al servizio smtp:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">virtual</span>=192.168.0.100:<span style="color: #000000;">25</span>
<span style="color: #007800;">real</span>=192.168.0.50:<span style="color: #000000;">25</span> gate
<span style="color: #007800;">real</span>=192.168.0.51:<span style="color: #000000;">25</span> gate
<span style="color: #007800;">real</span>=192.168.0.52:<span style="color: #000000;">25</span> gate
<span style="color: #007800;">service</span>=smtp
<span style="color: #007800;">scheduler</span>=wlc
<span style="color: #007800;">persistent</span>=<span style="color: #000000;">600</span>
<span style="color: #007800;">protocol</span>=tcp</pre></div></div>

<p>Rimandando all’articolo precedente per i dettagli relativi a ciascun parametro dichiarato va solamente precisato che il tipo di scheduler selezionato è quello di default, “wlc”, ossia Weighted Least-Connection, che assegna più lavori ai server con minor numero di lavori attivi ed in base al peso che è stato loro assegnato. La configurazione verrà automaticamente attivata al salvataggio del file per via delle impostazioni illustrate nello scorso articolo e dopo alcuni secondi sarà possibile verificare come le nuove regole siano attive:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>ipvsadm <span style="color: #660033;">-L</span> <span style="color: #660033;">-n</span>
IP Virtual Server version 1.2.1 <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;"><span style="color: #c20cb9; font-weight: bold;">size</span></span>=<span style="color: #000000;">4096</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
Prot LocalAddress:Port Scheduler Flags
-<span style="color: #000000; font-weight: bold;">&gt;</span> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.100:<span style="color: #000000;">80</span> rr
-<span style="color: #000000; font-weight: bold;">&gt;</span> 192.168.0.50:<span style="color: #000000;">80</span>              Route   <span style="color: #000000;">1</span>      <span style="color: #000000;">0</span>          <span style="color: #000000;">0</span>
-<span style="color: #000000; font-weight: bold;">&gt;</span> 192.168.0.51:<span style="color: #000000;">80</span>              Route   <span style="color: #000000;">1</span>      <span style="color: #000000;">0</span>          <span style="color: #000000;">0</span>
-<span style="color: #000000; font-weight: bold;">&gt;</span> 192.168.0.52:<span style="color: #000000;">80</span>              Route   <span style="color: #000000;">1</span>      <span style="color: #000000;">0</span>          <span style="color: #000000;">0</span>
TCP  192.168.0.100:<span style="color: #000000;">25</span> wlc persistent <span style="color: #000000;">600</span>
-<span style="color: #000000; font-weight: bold;">&gt;</span> 192.168.0.50:<span style="color: #000000;">25</span>              Route   <span style="color: #000000;">1</span>      <span style="color: #000000;">0</span>          <span style="color: #000000;">0</span>
-<span style="color: #000000; font-weight: bold;">&gt;</span> 192.168.0.51:<span style="color: #000000;">25</span>              Route   <span style="color: #000000;">1</span>      <span style="color: #000000;">0</span>          <span style="color: #000000;">0</span>
-<span style="color: #000000; font-weight: bold;">&gt;</span> 192.168.0.52:<span style="color: #000000;">25</span>              Route   <span style="color: #000000;">1</span>      <span style="color: #000000;">0</span>          <span style="color: #000000;">0</span></pre></div></div>

<p>Quanto visualizzato conferma che il bilanciamento sta avvenendo per la porta 25 su tutti e tre i server reali configurati.</p>
<p><strong>Test di funzionamento</strong></p>
<p>Così come per il servizio apache, la prima verifica effettuabile sui server reali è quella di mettersi in ascolto sui log di postfix e controllare che le richieste pervenute all’indirizzo bilanciato siano correttamente distribuite:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tail</span> <span style="color: #660033;">-f</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>mail.info</pre></div></div>

<p>Nei log scritti e visualizzati si dovranno distinguere due diverse tipologie di richieste pervenute, la prima rappresenta connessioni volte all’utilizzo del mail server per il ricevimento o la spedizione di un messaggio:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">...
...
Oct  <span style="color: #000000;">9</span> <span style="color: #000000;">12</span>:<span style="color: #000000;">32</span>:<span style="color: #000000;">33</span> real-server-<span style="color: #000000;">1</span> postfix<span style="color: #000000; font-weight: bold;">/</span>smtpd<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">30095</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: 9325D106103: <span style="color: #007800;">client</span>=mail.xxxxxxxx.xxx<span style="color: #7a0874; font-weight: bold;">&#91;</span>XX.XXX.XX.XXX<span style="color: #7a0874; font-weight: bold;">&#93;</span>
Oct  <span style="color: #000000;">9</span> <span style="color: #000000;">12</span>:<span style="color: #000000;">32</span>:<span style="color: #000000;">33</span> real-server-<span style="color: #000000;">1</span> postfix<span style="color: #000000; font-weight: bold;">/</span>cleanup<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">29792</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: 9325D106103: message-id=<span style="color: #000000; font-weight: bold;">&lt;</span>449745e7dc352554f0cc511e7cece2ce<span style="color: #000000; font-weight: bold;">@</span>localhost.localdomain<span style="color: #000000; font-weight: bold;">&gt;</span>
Oct  <span style="color: #000000;">9</span> <span style="color: #000000;">12</span>:<span style="color: #000000;">32</span>:<span style="color: #000000;">33</span> real-server-<span style="color: #000000;">1</span> postfix<span style="color: #000000; font-weight: bold;">/</span>qmgr<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">23253</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: 9325D106103: <span style="color: #007800;">from</span>=<span style="color: #000000; font-weight: bold;">&lt;</span>sender<span style="color: #000000; font-weight: bold;">@</span>xxxxxxxx.xxx<span style="color: #000000; font-weight: bold;">&gt;</span>, <span style="color: #007800;"><span style="color: #c20cb9; font-weight: bold;">size</span></span>=<span style="color: #000000;">1820</span>, <span style="color: #007800;">nrcpt</span>=<span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>queue active<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Oct  <span style="color: #000000;">9</span> <span style="color: #000000;">12</span>:<span style="color: #000000;">32</span>:<span style="color: #000000;">33</span> real-server-<span style="color: #000000;">1</span> postfix<span style="color: #000000; font-weight: bold;">/</span>smtpd<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">30095</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: disconnect from mail.xxxxxxxx.xxx<span style="color: #7a0874; font-weight: bold;">&#91;</span>XX.XXX.XX.XXX<span style="color: #7a0874; font-weight: bold;">&#93;</span>
...
...</pre></div></div>

<p>La seconda tipologia rappresenta le connessioni effettuate dal bilanciatore volte a capire se il real server è responsivo e può ricevere lavori:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">...
...
Oct  <span style="color: #000000;">9</span> <span style="color: #000000;">12</span>:<span style="color: #000000;">32</span>:<span style="color: #000000;">34</span> real-server-<span style="color: #000000;">1</span> postfix<span style="color: #000000; font-weight: bold;">/</span>smtpd<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">30099</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: connect from ha-balancer-<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>192.168.0.1<span style="color: #7a0874; font-weight: bold;">&#93;</span>
Oct  <span style="color: #000000;">9</span> <span style="color: #000000;">12</span>:<span style="color: #000000;">32</span>:<span style="color: #000000;">34</span> real-server-<span style="color: #000000;">1</span>  postfix<span style="color: #000000; font-weight: bold;">/</span>smtpd<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">30099</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: disconnect from ha-balancer-<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>192.168.0.1<span style="color: #7a0874; font-weight: bold;">&#93;</span>
...
...</pre></div></div>

<p>Chiaramente un ulteriore test consiste nello spedire dei messaggi attraverso il server e verificarne il corretto recapito.</p>
<p><strong>Conclusioni</strong></p>
<p>Il progetto presentato può chiaramente essere migliorato ed esteso attraverso l’introduzione di nuove funzionalità per Postfix come antispam e antivirus o con l’aggiunta di nuovi servizi bilanciati come pop3 e imap. Tali soluzioni non sono state descritte in questa serie in quanto oltre ad essere documentate in maniera esaustiva altrove non rappresentano l’obiettivo primario del progetto. La finalità primaria dei quattro articoli presentati è stata quella di dare una traccia piuttosto dettagliata di quelle che sono le potenzialità dei prodotti opensource nell’ambito di soluzioni in alta affidabilità.</p>
<p><strong>La serie comprende questi articoli :</strong></p>
<p>Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/09/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-1-di-4/">1 di 4</a>)<br />
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/09/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-2-di-4/">2 di 4</a>)<br />
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-3-di-4/">3 di 4</a>)<br />
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-4-di-4/">4 di 4</a>)</p>
<p><strong>Nota :</strong></p>
<p><em>Questo articolo è originariamente apparso su <a href="http://www.tuxjournal.net">Tux Journal</a> nell&#8217;Ottobre 2008.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-4-di-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (3 di 4)</title>
		<link>http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-3-di-4/</link>
		<comments>http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-3-di-4/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 07:05:12 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Linux Virtual Server]]></category>
		<category><![CDATA[Postfix]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Bilanciamento di carico]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Posta elettronica]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=269</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; La terza fase del progetto prevede la creazione di un servizio bilanciato su una batteria di real server. Verrà trattato il bilanciamento di un servizio di test (Apache 2) per verificare che il carico venga correttamente distribuito sui real server che fanno parte del Linux Virtual Server. Bilanciamento con Linux Il bilanciamento del carico [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/postfix.png" alt="postfix" title="postfix" width="100" class="alignnone size-full wp-image-176" />&nbsp;&nbsp;&nbsp;&nbsp;<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/01/lvs.png" alt="lvs" title="lvs" width="100" height="100" class="alignnone size-full wp-image-260" /></p>
<p>La terza fase del progetto prevede la creazione di un servizio bilanciato su una batteria di real server. Verrà trattato il bilanciamento di un servizio di test (Apache 2) per verificare che il carico venga correttamente distribuito sui real server che fanno parte del Linux Virtual Server.</p>
<p><strong>Bilanciamento con Linux</strong></p>
<p>Il bilanciamento del carico con Linux è possibile attraverso Linux Virtual Server, l’insieme di moduli del Kernel progettato per adempiere a questo scopo. Sebbene vi sia la possibilità di configurare il funzionamento di tali moduli attraverso il comando ipvsadm, esiste un programma chiamato ldirectord che consente di impostare regole per il load balancing in maniera automatica partendo da un file di configurazione. Oltre a poter essere configurato affinché effettui il monitoring delle risorse configurate sui real server ldirectord possiede un enorme altro vantaggio: è completamente integrato con heartbeat come risorsa del cluster. Questo significa che associando la risorsa ldirectord all’indirizzo IP virtuale (configurato nella <a href="http://www.tuxjournal.net/?p=4298" target="_self">puntata precedente</a>) si potrà avere il servizio di bilanciamento in alta affidabilità, eliminando di fatto lo SPOF (Single Point Of Failure) rappresentato dal bilanciatore operante su un singolo nodo.</p>
<p><strong>Installazione di ldirectord e apache2</strong></p>
<p>L’installazione del pacchetto ldirectord, che comprende tutti gli script necessari all’interfacciamento con heartbeat, può essere effettuata attraverso apt-get:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> ldirectord-<span style="color: #000000;">2</span></pre></div></div>

<p>tra i file installati insieme al pacchetto particolare attenzione va riservata allo script ldirectord nella cartella <em>/etc/ha.d/resource.d/</em>. Esso infatti è il fulcro dietro al quale opererà il bilanciamento software. Su ciascun real server invece andrà installato il pacchetto apache2 che servirà per i test di bilanciamento:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> apache2</pre></div></div>

<p>L’installazione attiverà il demone apache che si metterà in ascolto sulla porta TCP 80.</p>
<p><strong>Configurazione di ldirectord</strong></p>
<p>La configurazione del servizio per convenzione è contenuta nel fie <em>/etc/ha.d/ldirectord.cf</em> ed un esempio della composizione dello stesso si trova nel file <em>/usr/share/doc/ldirectord-2/ldirectord.cf.gz</em> installato con il pacchetto. All’interno del file devono essere presenti un’area generale contenente le direttive globali ed un’area specifica relativa al servizio che si vuole bilanciare. L’area globale contiene le seguenti direttive:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">checktimeout</span>=<span style="color: #000000;">3</span></pre></div></div>

<p>Rappresenta i secondi dopo i quali la risorsa non rispondendo viene dichiarata morta.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">checkinterval</span>=<span style="color: #000000;">1</span></pre></div></div>

<p>Rappresenta i secondi tra un check e l’altro.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">fallback</span>=127.0.0.1:<span style="color: #000000;">80</span></pre></div></div>

<p>Valido solo per i servizi http, indica quale server funzionerà da fallback in caso tutti i server reali vengano dichiarati morti.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">autoreload</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span></pre></div></div>

<p>Stabilisce se ldirectord deve continuamente rileggere il file di configurazione dal disco. Se tale campo è valorizzato a “yes” allora le modifiche effettuate al file di configurazione verranno istantaneamente messe in atto dal demone.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">logfile</span>=<span style="color: #ff0000;">&quot;/var/log/ldirectord.log&quot;</span>
<span style="color: #666666; font-style: italic;">#logfile=&quot;local0&quot;</span></pre></div></div>

<p>Indica dove verranno scritti i log, se in file predeterminato oppure nei log di sistema (syslog).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">quiescent</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span></pre></div></div>

<p>Permette di stabilire il comportamento di ldirectord di fronte ad un server dichiarato morto, se il valore è “yes” (che è il default), un real server morto non viene rimosso dalla tabella ipvs del kernel, ma il suo peso viene settato a zero, che comporta il non servire più le richieste pervenute al bilanciatore. Se il valore è “no” allora il real server morto viene completamente rimosso dalla tabella ipvs del kernel.</p>
<p>I parametri valorizzati rappresentano il dafult per i real server e possono essere modificati nelle singole dichiarazioni in modo da ottenere l’override degli stessi. Terminata la dichiarazione delle direttive globali l’attenzione è spostata sui servizi bilanciati, che sono dichiarati con una direttiva “virtual”:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">virtual</span>=192.168.0.100:<span style="color: #000000;">80</span>
<span style="color: #007800;">real</span>=192.168.0.50:<span style="color: #000000;">80</span> gate
<span style="color: #007800;">real</span>=192.168.0.51:<span style="color: #000000;">80</span> gate
<span style="color: #007800;">real</span>=192.168.0.52:<span style="color: #000000;">80</span> gate
<span style="color: #007800;">fallback</span>=127.0.0.1:<span style="color: #000000;">80</span> gate
<span style="color: #007800;">service</span>=http
<span style="color: #007800;">request</span>=<span style="color: #ff0000;">&quot;index.html&quot;</span>
<span style="color: #007800;">receive</span>=<span style="color: #ff0000;">&quot;It Works!”
virtualhost=www.esempio.com
scheduler=rr
protocol=tcp</span></pre></div></div>

<p>Nell’esempio ad essere bilanciato è un servizio http. Questo come ogni virtuale ha tre aspetti essenziali: il metodo con cui le richieste vengono inviate ai real server (parametro real, che definisce il packet forwarding method), il tipo di servizio erogato (parametro service) e la tipologia di bilanciamento (parametro scheduler).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">real</pre></div></div>

<p>Ad un server reale corrisponde un indirizzo IP, una porta ed il metodo con cui i pacchetti passano dal virtuale ai reali. Può essere indicato anche il peso di ciascun real server nel caso in cui se ne possiedano con caratteristiche diverse, tale valore di default è 1 e salvo casi particolari può essere omesso. Essenziale però è il “packet forwarding method” che può essere uno di questi valori:</p>
<ul>
<li>gate: che prevede l’utilizzo del direct routing in cui le richieste arrivano al server reale e questo risponde direttamente al client che ha contattato il servizio bilanciato.</li>
<li>masq: che prevede l’utilizzo della tecnica di masquerading (network address translation o NAT), dove le risposte dei server reali passano sempre dal bilanciatore che maschera il traffico in modo che appaia al client come proveniente da se stesso.</li>
<li>ipip: che prevede l’incapsulamento dei pacchetti arrivati al server bilanciato per la loro immissione all’interno di una sotto rete composta da interfacce virtuali.</li>
</ul>
<p>La tipologia prevista nel progetto descritto si rifà al metodo gate in quanto i real server risiedono tutti sulla stessa rete (<a href="http://www.tuxjournal.net/?p=4128" target="_self">vedi prima puntata</a>). masq è generalmente impiegato quando i real server ed il bilanciatore risiedono su reti differenti, mentre il metodo ipip è tra i tre il più particolare non verrà trattato in questa serie. Approfondimenti in merito agli argomenti descritti, che riguardano LVS nel dettaglio sono disponibili nell’LVS howto, in particolare ai seguenti link :</p>
<p>Direct routing (gate) : <a href="http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.LVS-DR.html">http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.LVS-DR.html</a></p>
<p>Tun (ipip) : <a href="http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.LVS-Tun.html">http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.LVS-Tun.html</a></p>
<p>Masquerade (masq): <a href="http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.LVS-NAT.html">http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.LVS-NAT.html</a></p>
<p><strong>Service</strong></p>
<p>Il tipo di servizio associato ad un servizio virtuale può essere uno fra ftp, smtp, http, pop, pops, nntp, imap, imaps, ldap, https, dns, mysql, pgsql, sip e none . Il nome di ogni servizio è autoesplicativo. Ldirectord come scritto in precedenza permette anche di effettuare il monitor dei servizi. Questo significa che un servizio oltre a rispondere alla porta associata (che nell’esempio illustrato è la 80) potrà essere interrogato per restituire dei risultati aspettati. Le quattro righe dell’esempio:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">service</span>=http
<span style="color: #007800;">request</span>=<span style="color: #ff0000;">&quot;index.html&quot;</span>
<span style="color: #007800;">receive</span>=<span style="color: #ff0000;">&quot;It Works!”
virtualhost=www.esempio.com</span></pre></div></div>

<p>definiscono che il servizio è di tipo http (service), che per i check dovrà essere contattata la pagina index.html (request) e che all’interno di questa dovrà essere contenuto il testo “It Works!” (receive). Il tutto sarà associato al virtual host www.esempio.com. Se questa richiesta non verrà esaudita, il real server verrà dichiarato morto ed escluso quindi dal bilanciamento.</p>
<p><strong>scheduler</strong></p>
<p>L’ultimo parametro da comprendere è quello dello scheduler che rappresenta la tipologia di bilanciamento adottata dall’indirizzo virtuale. I valori possibili per il tipo di scheduler sono i seguenti:</p>
<p><em>rr &#8211; Robin Robin</em>: Distribuisce i lavori equamente sui real server disponibili.</p>
<p><em>wrr &#8211; Weighted Round Robin</em>: assegna i lavori ai real server in base al loro peso. Ad un peso maggiore da parte del real server corrisponderanno più lavori assegnati. Se i server hanno tutti lo stesso peso allora i lavori saranno distribuiti in forma equa.</p>
<p><em>lc &#8211; Least-Connection</em>: assegna più lavori ai server con minor numero di lavori attivi.</p>
<p><em>wlc &#8211; Weighted Least-Connection</em>: assegna più lavori ai server con minor numero di lavori attivi ed in base al peso che è stato loro assegnato. Questo è il default.</p>
<p><em>lblc  &#8211; Locality-Based Least-Connection</em>: assegna lavori destinati allo stesso indirizzo IP al medesimo server se questo non è sovraccarico ed è disponibile, in alternativa assegna i lavori ai real server scarichi, ricordando l’associazione nei futuri assegnamenti.</p>
<p><em>lblcr &#8211; Locality-Based Least-Connection with Replication</em>: assegna i lavori destinati allo stesso indirizzo IP al nodo con il minor numero di lavori attivi nel gruppo di server creato per servire le richieste provenienti da questo. Se tutti i nodi del gruppo di server sono sovraccarichi, il lavoro viene accodato al nodo del cluster con il numero minore di lavori che diventa parte del gruppo di server. Se il gruppo di server non è stato modificato per un tempo specifico, allora il server più carico viene rimosso dal gruppo in modo che possa evadere le richieste in coda e garantire di essere replica alle future richieste.</p>
<p><em>dh &#8211; Destination Hashing</em>: assegna i lavori ai real server basandosi sul controllo di un valore di hash assegnato staticamente in base all’indirizzo IP di destinazione.</p>
<p><em>sh &#8211; Source Hashing</em>: assegna i lavori ai real server basandosi sul controllo di un valore di hash assegnato staticamente in base all’indirizzo IP sorgente.</p>
<p><em>sed &#8211; Shortest Expected Delay</em>: assegna un lavoro entrante al real server dal quale si aspetta il minor tempo di attesa. Il tempo di attesa per un lavoro è calcolato con la formula (Ci + 1) / Ui dove Ci è il numero di lavori sul server stesso e Ui è il peso (weight) di questo definito in configurazione.</p>
<p><em>nq  &#8211;  Never  Queue</em>: assegna un lavoro entrante ad un real server inattivo (se c’è) anziché attendere per un real server veloce. Se tutti i real server sono occupati, adotta la tecnica “sed” (vedi sopra) per assegnare il lavoro.</p>
<p>La scelta del tipo di scheduler dipenderà quindi dalla tipologia di servizi impiegati e del tipo di real server dei quali si dispone. Nel caso illustrato lo scheduler è il più semplice, cioè il round robin che assegnerà le richieste in maniera equa su tutti i real server.</p>
<p><strong>Aggiunta del servizio ldirectord a heartbeat</strong></p>
<p>Per fare in modo che heartbeat gestisca la risorsa ldirectord all’interno del file <em>/etc/ha.d/haresources</em> basterà apportare le seguenti modifiche per entrambi i nodi del cluster:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">ha-balancer-<span style="color: #000000;">1</span> Ipaddr::192.168.0.100<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">24</span><span style="color: #000000; font-weight: bold;">/</span>eth0 ldirectord::<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span>ldirectord.cf</pre></div></div>

<p>Quanto aggiunto comprende la dichiarazione della risorsa ed il relativo file di configurazione. Per attivare la nuova configurazione sarà sufficiente effettuare il reload del servizio, sempre su entrambi i nodi del cluster:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>heartbeat reload</pre></div></div>

<p>La verifica della corretta aggiunta delle regole relative ad LVS è ottenibile attraverso il comando ipvsadm:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>ipvsadm <span style="color: #660033;">-L</span> <span style="color: #660033;">-n</span>
IP Virtual Server version 1.2.1 <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;"><span style="color: #c20cb9; font-weight: bold;">size</span></span>=<span style="color: #000000;">4096</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
Prot LocalAddress:Port Scheduler Flags
-<span style="color: #000000; font-weight: bold;">&amp;</span>gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.100:<span style="color: #000000;">80</span> rr
-<span style="color: #000000; font-weight: bold;">&amp;</span>gt; 192.168.0.50:<span style="color: #000000;">80</span>              Route   <span style="color: #000000;">1</span>      <span style="color: #000000;">0</span>          <span style="color: #000000;">0</span>
-<span style="color: #000000; font-weight: bold;">&amp;</span>gt; 192.168.0.51:<span style="color: #000000;">80</span>              Route   <span style="color: #000000;">1</span>      <span style="color: #000000;">0</span>          <span style="color: #000000;">0</span>
-<span style="color: #000000; font-weight: bold;">&amp;</span>gt; 192.168.0.52:<span style="color: #000000;">80</span>              Route   <span style="color: #000000;">1</span>      <span style="color: #000000;">0</span>          <span style="color: #000000;">0</span></pre></div></div>

<p>Tale output conferma che esiste un indirizzo virtuale che bilancia su tre server reali alla porta 80. Tutti i server reali sono raggiungibili ed hanno perciò peso 1 (non avendo specificato preferenze di peso nella loro dichiarazione) che comporta un’eguale distribuzione dei lavori.</p>
<p><strong>Abilitazione del packet forwarding</strong></p>
<p>L’ultima operazione da svolgere sul bilanciatore è quella dell’abilitazione del packet forwarding, necessario affinché le richieste possano passare attraverso il server. Tale funzionalità si ottiene abilitando la seguente riga:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">net.ipv4.conf.default.forwarding=<span style="color: #000000;">1</span></pre></div></div>

<p>nel file <em>/etc/sysctl.conf</em> e forzando un nuovo caricamento di questo file, che trasferirà nel kernel quanto dichiarato:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">sysctl <span style="color: #660033;">-p</span></pre></div></div>

<p>Ovviamente le stesse operazioni dovranno essere effettuate sul nodo del cluster passivo.</p>
<p><strong>Modifiche sui server reali</strong></p>
<p>Prima di effettuare i test di funzionamento è necessario apportare le ultime modifiche ai server reali. Infatti questi devono essere configurati in modo da vedere il traffico diretto all’indirizzo virtuale come locale. Per fare ciò sarà necessario creare un alias dell’interfaccia di loopback che abbia l’indirizzo virtuale e che questo indirizzo non venga annunciato via ARP sulla rete. Per rendere possibile tutto questo nel file <em>/etc/sysctl.conf</em> è necessario aggiungere le seguenti righe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">net.ipv4.conf.all.arp_ignore = <span style="color: #000000;">1</span>
net.ipv4.conf.eth0.arp_ignore = <span style="color: #000000;">1</span>
net.ipv4.conf.all.arp_announce = <span style="color: #000000;">2</span>
net.ipv4.conf.eth0.arp_announce = <span style="color: #000000;">2</span></pre></div></div>

<p>Insieme alla dichiarazione della nuova interfaccia nel file <em>/etc/network/interfaces</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">auto lo:<span style="color: #000000;">0</span>
iface lo:<span style="color: #000000;">0</span> inet static
address 192.168.0.100
netmask 255.255.255.255
pre-up sysctl <span style="color: #660033;">-p</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null</pre></div></div>

<p>L’ultima riga, che effettua un nuovo caricamento delle regole relative a sysctl, attiva le variazioni sul comportamento ARP a livello di kernel. Tali regole saranno attivate con l’interfaccia, attraverso il comando ifup:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">ifup lo:<span style="color: #000000;">0</span></pre></div></div>

<p>Il motivo di queste variazioni è insito nella struttura del progetto: quando una richiesta arriva all’indirizzo virtuale e questo la dirige su un real server sarà il real server stesso a rispondere, per via del fatto di possedere lo stesso indirizzo (nell’interfaccia loopback), questo indirizzo però non dovrà essere annunciato sulla rete in modo da non confondere gli switch ed i router implicati nello smistamento dei pacchetti. Va sottolineato che queste variazioni andranno apportate a tutti i real server facenti parte dell’LVS.</p>
<p>Maggiori dettagli su questo tema che può risultare ostico sono ottenibili ai seguenti link:<br />
<a href="http://www.ultramonkey.org/3/topologies/hc-ha-lb-eg.html" target="_blank">http://www.ultramonkey.org/3/topologies/hc-ha-lb-eg.html</a> dove viene descritto un progetto simile.<br />
<a href="http://kb.linuxvirtualserver.org/wiki/Using_arp_announce/arp_ignore_to_disable_ARP" target="_blank">http://kb.linuxvirtualserver.org/wiki/Using_arp_announce/arp_ignore_to_disable_ARP</a> dove vengono descritte le configurazioni possibili per il comportamento degli annunci ARP.</p>
<p><strong>Test di funzionamento</strong></p>
<p>Il test di funzionamento dell’ambiente consiste nel controllo dei log del servizio apache2 su ciascun real server:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tail</span> <span style="color: #660033;">-f</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>apache2<span style="color: #000000; font-weight: bold;">/</span>access.log</pre></div></div>

<p>Inviando poi richieste al sito a mano oppure attraverso software specifici per i test di carico, come <a href="http://www.acme.com/software/http_load/" target="_blank">http_load</a> si potrà verificare come le richieste vengano correttamente distribuite sui tre server. Un’ulteriore verifica potrà essere effettuata sul bilanciatore dove l’output prodotto dal comando ipvsadm mostrerà per ciascun real server nei campi “ActiveConn” e “InActConn” un numero diverso da zero.</p>
<p><strong>Conclusioni</strong></p>
<p>Nel prossimo articolo, ultimo di questa serie, verrà infine trattata la configurazione di postfix sui real server e l’inclusione del servizio nel bilanciatore.</p>
<p><strong>La serie comprende questi articoli :</strong></p>
<p>Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/09/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-1-di-4/">1 di 4</a>)<br />
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/09/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-2-di-4/">2 di 4</a>)<br />
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-3-di-4/">3 di 4</a>)<br />
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-4-di-4/">4 di 4</a>)</p>
<p><strong>Nota :</strong></p>
<p><em>Questo articolo è originariamente apparso su <a href="http://www.tuxjournal.net">Tux Journal</a> nell&#8217;Ottobre 2008.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-3-di-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (2 di 4)</title>
		<link>http://www.miamammausalinux.org/2008/09/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-2-di-4/</link>
		<comments>http://www.miamammausalinux.org/2008/09/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-2-di-4/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 07:26:04 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Linux Virtual Server]]></category>
		<category><![CDATA[Postfix]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Bilanciamento di carico]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Posta elettronica]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=265</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Terminata l&#8217;introduzione al progetto le attenzioni vengono dirette alla messa in pratica, partendo dall&#8217;installazione di heartbeat che si occuperà di gestire in alta affidabilità l&#8217;indirizzo virtuale sul quale poi andrà bilanciato il servizio Postfix. I passi che verranno descritti fanno riferimento alla distribuzione Debian Etch e, fatta eccezione per la parti relative alle installazioni [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/postfix.png" alt="postfix" title="postfix" width="100" class="alignnone size-full wp-image-176" />&nbsp;&nbsp;&nbsp;&nbsp;<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/01/lvs.png" alt="lvs" title="lvs" width="100" height="100" class="alignnone size-full wp-image-260" /></p>
<p>Terminata l&#8217;introduzione al progetto le attenzioni vengono dirette alla messa in pratica, partendo dall&#8217;installazione di heartbeat che si occuperà di gestire in alta affidabilità l&#8217;indirizzo virtuale sul quale poi andrà bilanciato il servizio Postfix. I passi che verranno descritti fanno riferimento alla distribuzione Debian Etch e, fatta eccezione per la parti relative alle installazioni dei software che dipendono dal sistema di gestione pacchetti utilizzato, sono adattabili a tutte le maggiori distribuzioni.</p>
<p><strong>Requisiti hardware</strong></p>
<p>Il requisito minimo per avere un servizio in alta affidabilità è quello di due macchine, specularmente configurate e collegate l&#8217;una all&#8217;altra tramite una scheda di rete dedicata attraverso un cavo incrociato, definito &#8220;cross&#8221;. Le schede di rete dovranno quindi essere due per ciascuna macchina. Le prime collegate agli switch della LAN si occuperanno di erogare l&#8217;indirizzo virtuale, mentre le schede di rete secondarie saranno necessarie per comunicare il battito cardiaco (heartbeat, appunto) tra una macchina e l&#8217;altra. Questa struttura consente a ciascuna componente di carpire dati fondamentali sullo stato del sistema: se c&#8217;è comunicazione con la rete esterna e se c&#8217;è connettività tra le due macchine che compongono il cluster.</p>
<p><strong>Configurazione dei sistemi</strong></p>
<p>Presupponendo che in ciascuno dei sistemi scelti esista già un&#8217;interfaccia collegata alla rete locale, andrà configurata l&#8217;interfaccia per l&#8217;heartbeat, aggiungendo al file /etc/network/interfaces le seguenti linee :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">auto eth1
iface eth1 inet static
address 10.0.0.1
netmask 255.255.255.0</pre></div></div>

<p>Sul nodo secondario del cluster l&#8217;indirizzo dovrà ovviamente essere 10.0.0.2. Dopo aver attivato l&#8217;interfaccia attraverso il comando :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">ifup eth1</pre></div></div>

<p>sarà possibile testare la connettività attraverso un semplice ping :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ping</span> 10.0.0.2
PING 10.0.0.2 <span style="color: #7a0874; font-weight: bold;">&#40;</span>10.0.0.2<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">56</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">84</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> bytes of data.
<span style="color: #000000;">64</span> bytes from 10.0.0.2: <span style="color: #007800;">icmp_seq</span>=<span style="color: #000000;">1</span> <span style="color: #007800;">ttl</span>=<span style="color: #000000;">64</span> <span style="color: #007800;"><span style="color: #000000; font-weight: bold;">time</span></span>=<span style="color: #000000;">0.145</span> ms
<span style="color: #000000;">64</span> bytes from 10.0.0.2: <span style="color: #007800;">icmp_seq</span>=<span style="color: #000000;">2</span> <span style="color: #007800;">ttl</span>=<span style="color: #000000;">64</span> <span style="color: #007800;"><span style="color: #000000; font-weight: bold;">time</span></span>=<span style="color: #000000;">0.101</span> ms
<span style="color: #000000;">64</span> bytes from 10.0.0.2: <span style="color: #007800;">icmp_seq</span>=<span style="color: #000000;">3</span> <span style="color: #007800;">ttl</span>=<span style="color: #000000;">64</span> <span style="color: #007800;"><span style="color: #000000; font-weight: bold;">time</span></span>=<span style="color: #000000;">0.102</span> ms
<span style="color: #000000;">64</span> bytes from 10.0.0.2: <span style="color: #007800;">icmp_seq</span>=<span style="color: #000000;">4</span> <span style="color: #007800;">ttl</span>=<span style="color: #000000;">64</span> <span style="color: #007800;"><span style="color: #000000; font-weight: bold;">time</span></span>=<span style="color: #000000;">0.102</span> ms</pre></div></div>

<p>A titolo preventivo è bene inserire nel file /etc/hosts di ciascuna macchina le corrispondenze IP nome host relative ai server di modo che queste siano indipendenti dal DNS :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">192.168.0.1	ha-balancer-1.pgol.com	ha-balancer-<span style="color: #000000;">1</span>
192.168.0.2	ha-balancer-2.pgol.com	ha-balancer-<span style="color: #000000;">2</span></pre></div></div>

<p>Il sistema è quindi predisposto a procedere con l&#8217;installazione del pacchetto heartbeat :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> heartbeat-<span style="color: #000000;">2</span></pre></div></div>

<p>I file essenziali per la configurazione di heartbeat sono essenzialmente tre : ha.cf, haresources ed authkeys e si trovano nella directory /etc/ha.d/.</p>
<p><em>ha.cf</em></p>
<p>In ha.cf è necessario includere la configurazione relativa alla struttura del cluster per definire quali sono le sue componenti e come calcolare lo stato di salute del sistema. Ecco come viene compilato il file relativo al progetto, che per le ragioni che verranno spiegate avanti potrà essere identico su entrambe le macchine. Per ciascuna opzione è indicata la descrizione :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">keepalive <span style="color: #000000;">1</span></pre></div></div>

<p>Indica l&#8217;intervallo tra un heartbeat e l&#8217;altro (1 secondo).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">deadtime <span style="color: #000000;">14</span></pre></div></div>

<p>Indica il numero di secondi dopo i quali heartbeat considererà un nodo morto (14 secondi).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">warntime <span style="color: #000000;">7</span></pre></div></div>

<p>Indica il numero di secondi dopo i quali heartbeat allerterà per un ritardo nella comunicazione con un nodo (7 secondi).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">initdead <span style="color: #000000;">120</span></pre></div></div>

<p>Si riferisce al primo avvio e considera il numero di secondi dopo i quali heartbeat considererà un nodo morto (120 secondi, due minuti).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">udpport <span style="color: #000000;">694</span></pre></div></div>

<p>Indica la porta UDP utilizzata per gli scambi heartbeat.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">ucast eth1 10.0.0.1
ucast eth1 10.0.0.2
ucast eth0 192.168.0.1
ucast eth0 192.168.0.2</pre></div></div>

<p>Le quattro righe relative ad ucast indicano le interfacce locali e gli ip di destinazione che devono essere utilizzate per lo scambio di heartbeat. Nei controlli le interfacce locali ignorate, per questa ragione è possibile avere un file identico per entrambi i nodi specificando tutte le interfacce (ed i relativi ip da contattare) di entrambi i sistemi. In questo caso sono state configurate le interfacce collegate via cavo cross e quelle collegate alla LAN.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">auto_failback off</pre></div></div>

<p>Il parametro determina se una risorsa che è stata presa in carico da un nodo secondario (in seguito alla perdita del nodo primario) debba ritornare sul nodo originario una volta che questo torna attivo.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">node    ha-balancer-<span style="color: #000000;">1</span>
node    ha-balancer-<span style="color: #000000;">2</span></pre></div></div>

<p>Le due righe rappresentano l&#8217;elenco delle macchine che fanno parte del cluster, identificate come nodi.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">ping_group dmz 192.168.0.50 192.168.0.51 192.168.0.52</pre></div></div>

<p>Questa opzione è necessaria al cluster per capire se è collegato alla rete locale.  La connettività da parte del cluster ad almeno una delle macchine facenti parte del gruppo comporta la conferma che il cluster sia connesso alla rete locale.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">respawn hacluster <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>heartbeat<span style="color: #000000; font-weight: bold;">/</span>ipfail</pre></div></div>

<p>Indica il programma che lancia e controlla lo stato delle interfacce (ipfail è il default).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">apiauth ipfail <span style="color: #007800;">gid</span>=haclient <span style="color: #007800;">uid</span>=hacluster</pre></div></div>

<p>Specifica quali utenze possono collegarsi a quali API (in questo caso rimane ancora il default relativo ad ipfail, l&#8217;unico ad interessare il progetto in corso. Tali utenze sono create automaticamente dall&#8217;installazione di heartbeat.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">deadping <span style="color: #000000;">30</span></pre></div></div>

<p>Specifica il numero di secondi dopo i quali il gruppo di ping (definito dmz) verrà ritenuto morto e quindi assumerà la condizione disconnessa per il cluster.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">use_logd off
&nbsp;
logfile <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>ha.log</pre></div></div>

<p>Per facilità di debug e ordine nei log viene disabilitato l&#8217;utilizzo di logd (che avrebbe riempito i log di sistema) e dirottata la scrittura dei log nel file /var/log/ha.log. Chiaramente esistono numerose altre opzioni disponibili per la configurazione del cluster e sono tutte illustrate all’indirizzo <a href="http://www.linux-ha.org/ha.cf" target="_blank">http://www.linux-ha.org/ha.cf</a>.</p>
<p><em>haresources</em></p>
<p>Il secondo file che completa la configurazione di heartbeat è quello relativo alle risorse, haresources. Ciascuna riga contenuta in questo file rappresenta una risorsa ed il formato della stessa  è:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;</span>nodo preferito<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>risorsa <span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">&gt;</span> ... <span style="color: #000000; font-weight: bold;">&lt;</span>risorsa n<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>nel caso relativo al nostro progetto durante la fase iniziale utilizzeremo solo la risorsa &#8220;IpAddr&#8221; che controllerà l&#8217;attivazione di un indirizzo virtuale associato ad un interfaccia reale (con la relativa classe), che nel proseguo diventerà l&#8217;indirizzo bilanciato del servizio Postfix :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">ha-balancer-<span style="color: #000000;">1</span> IPaddr::192.168.0.100<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">24</span><span style="color: #000000; font-weight: bold;">/</span>eth0</pre></div></div>

<p><em>authkeys</em></p>
<p>Prima di avviare il servizio cluster è necessario effettuare un ultimo ulteriore passo che consiste nella creazione della chiave che verrà utilizzata da heartbeat per autenticare i nodi che faranno parte del cluster. Le informazioni relative alla chiave sono contenute nel file authkeys, la chiave è ottenibile attraverso questo comando (che sfrutta il generatore casuale di numeri del kernel ed il comando md5sum):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">dd</span> <span style="color: #007800;"><span style="color: #000000; font-weight: bold;">if</span></span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>urandom <span style="color: #007800;">count</span>=<span style="color: #000000;">4</span> <span style="color: #000000;">2</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000; font-weight: bold;">|</span> md5sum <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-c1-32</span>
aea572119260bbe6b87c0386c3cc0f75</pre></div></div>

<p>tale valore va posto nel file authkeys in questa forma :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">auth <span style="color: #000000;">1</span>
<span style="color: #000000;">1</span> sha1 aea572119260bbe6b87c0386c3cc0f75</pre></div></div>

<p>La prima riga indica l&#8217;identificativo della chiave utilizzata, mentre nella seconda questa viene definita attraverso l&#8217;identificativo, il tipo (sha1) ed il valore. Questo file deve essere leggibile dal solo utente di root :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">600</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span>authkeys
<span style="color: #c20cb9; font-weight: bold;">chown</span> root:root <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span>authkeys</pre></div></div>

<p><strong>Avvio dei servizi</strong></p>
<p>Terminata la configurazione dei tre file, che dovranno essere identici su ciascuno dei due nodi, è possibile avviare il servizio heartbeat :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>heartbeat start</pre></div></div>

<p>è possibile seguire l&#8217;evoluzione dell&#8217;avvio monitorando il file di log ha.log al cui interno, se i file sono stati compilati a dovere, verranno scritte righe come questa :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">heartbeat<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">4271</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span>01_09:<span style="color: #000000;">50</span>:<span style="color: #000000;">37</span> info: <span style="color: #000000; font-weight: bold;">**************************</span>
heartbeat<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">4271</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span>01_09:<span style="color: #000000;">50</span>:<span style="color: #000000;">37</span> info: Configuration validated. Starting heartbeat 2.0.7
...</pre></div></div>

<p>In breve, dopo i controlli sullo stato dei nodi e la loro connettività, si arriverà all&#8217;avvio della risorsa definita :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">ResourceManager<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">4445</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>:  <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span>01_09:<span style="color: #000000;">50</span>:<span style="color: #000000;">53</span> info: Running <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span>resource.d<span style="color: #000000; font-weight: bold;">/</span>IPaddr 192.168.0.100<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">24</span><span style="color: #000000; font-weight: bold;">/</span>eth0 start
IPaddr<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">4663</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>:   <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span>01_09:<span style="color: #000000;">50</span>:<span style="color: #000000;">53</span> INFO: <span style="color: #7a0874; font-weight: bold;">eval</span> <span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">ifconfig</span> eth0:<span style="color: #000000;">0</span> 192.168.0.100 netmask 255.255.255.224 broadcast 192.168.0.255
IPaddr<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">4663</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>:   <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span>01_09:<span style="color: #000000;">50</span>:<span style="color: #000000;">53</span> INFO: Sending Gratuitous Arp <span style="color: #000000; font-weight: bold;">for</span> 192.168.0.100 on eth0:<span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>eth0<span style="color: #7a0874; font-weight: bold;">&#93;</span>
IPaddr<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">4663</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>:   <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span>01_09:<span style="color: #000000;">50</span>:<span style="color: #000000;">53</span> INFO: <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>heartbeat<span style="color: #000000; font-weight: bold;">/</span>send_arp <span style="color: #660033;">-i</span> <span style="color: #000000;">500</span> <span style="color: #660033;">-r</span> <span style="color: #000000;">10</span> <span style="color: #660033;">-p</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<span style="color: #000000; font-weight: bold;">/</span>heartbeat<span style="color: #000000; font-weight: bold;">/</span>rsctmp<span style="color: #000000; font-weight: bold;">/</span>send_arp<span style="color: #000000; font-weight: bold;">/</span>send_arp-192.168.0.100 eth0 192.168.0.100 auto 192.168.0.100 ffffffffffff
IPaddr<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">4581</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>:   <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span>01_09:<span style="color: #000000;">50</span>:<span style="color: #000000;">53</span> INFO: IPaddr Success</pre></div></div>

<p>Il riscontro dell&#8217;effettivo funzionamento può essere effettuato sul nodo master relativo al servizio tramite il comando ifconfig :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">...
eth0:<span style="color: #000000;">0</span>    Link encap:Ethernet  HWaddr 00:0F:1F:<span style="color: #000000;">67</span>:CF:C1
inet addr:192.168.0.100  Bcast:212.48.3.255  Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST  MTU:<span style="color: #000000;">1500</span>  Metric:<span style="color: #000000;">1</span>
Interrupt:<span style="color: #000000;">177</span>
...</pre></div></div>

<p>che conferma come l&#8217;indirizzo virtuale sia correttamente attivo. Effettuando dei ping sull&#8217;indirizzo virtuale da macchine diverse dal nodo master si otterrà un&#8217;ulteriore conferma dell&#8217;effettivo funzionamento del sistema.</p>
<p><strong>Test di failover</strong></p>
<p>Per controllare l&#8217;effettivo funzionamento della struttura del cluster andranno effettuati tre diversi test.</p>
<p><em>Primo test</em></p>
<p>Il primo test consiste nell&#8217;acquisizione da parte delle risorse da parte del secondo nodo attraverso il seguente comando, da eseguire appunto sul nodo che non detiene la risorsa:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>heartbeat<span style="color: #000000; font-weight: bold;">/</span>hb_takeover foreign</pre></div></div>

<p>questo provocherà lo switch della risorsa sul secondo nodo in maniera trasparente per il sistema:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">heartbeat: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>_10:<span style="color: #000000;">38</span>:<span style="color: #000000;">27</span> info: acquire foreign HA resources <span style="color: #7a0874; font-weight: bold;">&#40;</span>standby<span style="color: #7a0874; font-weight: bold;">&#41;</span>.
...
...
heartbeat: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>_10:<span style="color: #000000;">38</span>:<span style="color: #000000;">31</span> info: foreign HA resource acquisition completed <span style="color: #7a0874; font-weight: bold;">&#40;</span>standby<span style="color: #7a0874; font-weight: bold;">&#41;</span>.
heartbeat: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>_10:<span style="color: #000000;">38</span>:<span style="color: #000000;">31</span> info: Standby resource acquisition <span style="color: #000000; font-weight: bold;">done</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">local</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>.
heartbeat: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>_10:<span style="color: #000000;">38</span>:<span style="color: #000000;">31</span> info: remote resource transition completed.</pre></div></div>

<p>I log dimostrano come la risorsa risieda ora sul nodo secondario.</p>
<p><em>Secondo test</em></p>
<p>Il secondo test consiste nel restart del servizio heartbeat sulla macchina in cui è attivo il servizio e la verifica che questo sia correttamente acquisito dal nodo ancora attivo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>heartbeat restart</pre></div></div>

<p>Ancora una volta, attraverso i log si ottiene conferma della corretta esecuzione delle operazioni:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">heartbeat: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>_10:<span style="color: #000000;">44</span>:<span style="color: #000000;">16</span> info: Received shutdown notice from <span style="color: #ff0000;">'ha-balancer-2'</span>.
heartbeat: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>_10:<span style="color: #000000;">44</span>:<span style="color: #000000;">16</span> info: Resources being acquired from <span style="color: #ff0000;">'ha-balancer-2'</span>.
heartbeat: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>_10:<span style="color: #000000;">44</span>:<span style="color: #000000;">16</span> info: acquire all HA resources <span style="color: #7a0874; font-weight: bold;">&#40;</span>standby<span style="color: #7a0874; font-weight: bold;">&#41;</span>.
heartbeat: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>_10:<span style="color: #000000;">44</span>:<span style="color: #000000;">16</span> info: Acquiring resource group: from <span style="color: #ff0000;">'ha-balancer-1'</span>
....
....
heartbeat: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>_10:<span style="color: #000000;">44</span>:<span style="color: #000000;">43</span> info: remote resource transition completed.</pre></div></div>

<p><em>Terzo test</em></p>
<p>Il terzo test consiste nello spegnimento improvviso della macchina su cui risiede la risorsa e la verifica che l&#8217;unico nodo attivo acquisisca la risorsa. Il comportamento dovrebbe risultare del tutto simile a quello degli altri test, con l&#8217;identificazione all&#8217;interno dei log delle notifica sulla perdita del nodo che deteneva la risorsa:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">heartbeat: <span style="color: #000000;">2008</span><span style="color: #000000; font-weight: bold;">/</span>09<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>_10:<span style="color: #000000;">48</span>:<span style="color: #000000;">31</span> WARN: node ha-balancer-<span style="color: #000000;">1</span>: is dead</pre></div></div>

<p><strong>Conclusioni</strong></p>
<p>Il prossimo articolo tratterà dell&#8217;implementazione del servizio di bilanciamento via LVS gestito dalla risorsa ldirectord.</p>
<p><strong>La serie comprende questi articoli :</strong></p>
<p>Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/09/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-1-di-4/">1 di 4</a>)<br />
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/09/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-2-di-4/">2 di 4</a>)<br />
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-3-di-4/">3 di 4</a>)<br />
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (<a href="http://www.miamammausalinux.org/2008/10/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-4-di-4/">4 di 4</a>)</p>
<p><strong>Nota :</strong></p>
<p><em>Questo articolo è originariamente apparso su <a href="http://www.tuxjournal.net">Tux Journal</a> nel Settembre 2008.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2008/09/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-2-di-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
