<?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; LVS &#8211; Linux Virtual Server</title>
	<atom:link href="http://www.miamammausalinux.org/category/clustering/linux-virtual-server/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.miamammausalinux.org</link>
	<description>Perché niente è impossibile da capire... Se lo spieghi bene !</description>
	<lastBuildDate>Mon, 02 Jan 2012 11:31:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>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[LVS - 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> <span style="color: #993333; font-weight: bold;">USER</span> <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;">size</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;">size</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[LVS - 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;">size</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;"><span style="color: #c20cb9; font-weight: bold;">ifup</span> 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[LVS - 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;"><span style="color: #c20cb9; font-weight: bold;">ifup</span> 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;">time</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;">time</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;">time</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;">time</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-<span style="color: #000000;">1</span>.pgol.com	ha-balancer-<span style="color: #000000;">1</span>
192.168.0.2	ha-balancer-<span style="color: #000000;">2</span>.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;">if</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>
		<item>
		<title>Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (1 di 4)</title>
		<link>http://www.miamammausalinux.org/2008/09/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-1-di-4/</link>
		<comments>http://www.miamammausalinux.org/2008/09/postfix-in-alta-affidabilita-e-massima-performance-con-heartbeat-lvs-ed-ldirectord-1-di-4/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 07:17:41 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[LVS - 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=258</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Postfix è uno fra i più diffusi software per la creazione di server di posta in ambito Linux. Sebbene le performance di questo software su carichi normali siano sempre rispettabili, nelle situazioni in cui è necessario gestire grandi quantitativi di caselle (ad esempio in server multi dominio) talvolta un solo server non basta ed [...]]]></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>Postfix è uno fra i più diffusi software per la creazione di server di posta in ambito Linux. Sebbene le performance di questo software su carichi normali siano sempre rispettabili, nelle situazioni in cui è necessario gestire grandi quantitativi di caselle (ad esempio in server multi dominio) talvolta un solo server non basta ed è inoltre necessario garantire al sistema un&#8217;alta affidabilità, eliminando quelli che vengono definiti SPOF (Single Point Of Failure), componenti la cui rottura rende inusabile il sistema. Questa serie di articoli descrive una soluzione per creare una batteria di server di posta il cui carico viene distribuito via software attraverso un bilanciatore, il tutto in alta affidabilità.</p>
<p><strong>Le componenti impiegate : LVS, heartbeat ed ldirectord</strong></p>
<p><strong>LVS</strong></p>
<p>La definizione fornita dalla documentazione ufficiale di <a href="http://www.linuxvirtualserver.org" target="_blank">LVS</a> è la seguente: un LVS è un gruppo di server che appaiono al client come un unico grande, veloce ed affidabile server (altamente disponibile).<br />
Questa definizione si traduce nella pratica in una serie di moduli del Kernel Linux che agiscono a livello IP, in una via simile a quella di iptables, il firewall di Linux. Il comando ipvsadm, infatti, permette di inserire delle regole relative alle interfacce di rete del sistema specifiche per il bilanciamento. Queste regole vengono processate ad ogni richiesta pervenuta alla relativa interfaccia. Un funzionamento a così basso livello garantisce le massime performance ed una facilità implementativa notevole.<br />
LVS agisce quindi da bilanciatore di carico (load balancer): rappresenta virtualmente tutti (uno o più) server in maniera trasparente all&#8217;utente che effettua le richieste, accogliendo le stesse e distribuendole attraverso i server reali.<br />
La scalabilità di questa soluzione è evidente, infatti in presenza della necessità di aumentare performance, è sufficiente aumentare il numero di server reali senza cambiare il modo in cui l’utente effettua le richieste ai servizi erogati da LVS. In presenza di un numero maggiore di uno di server reali la soluzione è anche altamente affidabile, in quanto la perdita di un singolo nodo reale non comporta l’interruzione del servizio.</p>
<p><strong>Heartbeat</strong></p>
<p>Ciò che però appare altrettanto evidente è che il bilanciatore è un grosso SPOF. Se infatti lo strato virtuale rappresentato da questo dovesse crollare tutti i server reali sarebbero di fatto inutili.<br />
Si rende necessario quindi rendere lo stesso bilanciatore altamente affidabile. Tutto questo è possibile attraverso heartbeat, il software prodotto dal gruppo <a href="http://www.linux-ha.org/" target="_blank">Linux-HA</a>. Heartbeat consente di configurare due macchine in modalità attiva-passiva che erogano risorse come l’indirizzo IP virtuale al quale vanno associate le regole LVS.<br />
In caso di malfunzionamento della macchina attiva, la passiva in maniera automatica ne prenderà il posto.</p>
<p><strong>Ldirectord</strong></p>
<p>Pensare di gestire a mano la configurazione delle regole LVS attraverso il comando ipvsadm è certamente possibile, ma senza una buona conoscenza dell’ambiente potrebbe risultare problematico. Inoltre le regole relative ai server reali richiederebbero un costante monitoraggio per avere la certezza che tutti i servizi vengano erogati dalle relative macchine. Sarebbe impensabile infatti configurare un bilanciatore di servizi che distribuisca gli stessi su macchine che in realtà non rispondono a dovere, si creerebbe un disservizio. Per risolvere queste problematiche esiste un ottimo software chiamato <a href="http://www.vergenet.net/linux/ldirectord/" target="_blank">ldirectord</a>.<br />
Ldirectord è un demone tipicamente usato come risorsa di heartbeat che si preoccupa di definire le regole LVS relative alle risorse impiegate ed effettuare il monitoraggio delle stesse.</p>
<p><strong>Struttura del progetto</strong></p>
<p>Quanto esposto sinora è riassumibile dal seguente schema:</p>
<div id="attachment_262" class="wp-caption alignnone" style="width: 221px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2008/09/postifix-ha-bilanciato-simple.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2008/09/postifix-ha-bilanciato-simple-211x300.png" alt="Figura 1" title="postifix-ha-bilanciato-simple" width="211" height="300" class="size-medium wp-image-262" /></a><p class="wp-caption-text">Figura 1</p></div>
<p>Le regole per il bilanciamento sono dichiarate nelle due macchine <em>192.168.0.1</em> e <em>192.168.0.2</em> in alta affidabilità su cui è installato heartbeat con la risorsa ldirectord. Tale struttura eroga l’IP virtuale <em>192.168.0.100</em> che accoglie le richieste per i servizi dichiarati sui real server (nel nostro caso Postfix).</p>
<p>L’impiego o meno di uno storage comune è dipendente dal tipo di servizio che viene bilanciato. Postfix gestisce delle caselle di posta registrate su disco e per questo tutti i real server dovranno scrivere i dati relativi a queste, nello specifico i messaggi, nella stessa area. Nello schema riassuntivo tale storage è rappresentato da un filesystem NFS (erogato da un server Linux o da un NAS) ma questo potrebbe essere uno storage in fibra collegato o una qualsiasi altra soluzione che permetta di condividere lo spazio tra tutti i real server.<br />
Sul database MySQL risiederanno i profili virtuali di tutte le utenze del server di posta.</p>
<p><strong>Realizzazione del progetto</strong></p>
<p>Definite le basi del progetto, la sua realizzazione si potrà strutturare in queste fasi:</p>
<ul>
<li>Installazione di heartbeat e test di failover sull’indirizzo virtuale;</li>
<li>Installazione di ldirectord e test di bilanciamento su un servizio test;</li>
<li>Installazione di Postfix e prove di bilanciamento;</li>
</ul>
<p><strong>Conclusioni</strong></p>
<p>Nel prossimo articolo verrà affrontata la prima fase del progetto comprendente l’installazione di heartbeat ed i primi test di failover sull’indirizzo bilanciato.</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-1-di-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

