<?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; MySQL</title>
	<atom:link href="http://www.miamammausalinux.org/category/database/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.miamammausalinux.org</link>
	<description>Perché niente è impossibile da capire... Se lo spieghi bene !</description>
	<lastBuildDate>Tue, 27 Jul 2010 12:03:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>MySQL Cluster, un database ad alta affidabilità : Parte 3</title>
		<link>http://www.miamammausalinux.org/2006/03/mysql-cluster-un-database-ad-alta-affidabilita-parte-3/</link>
		<comments>http://www.miamammausalinux.org/2006/03/mysql-cluster-un-database-ad-alta-affidabilita-parte-3/#comments</comments>
		<pubDate>Wed, 01 Mar 2006 11:30:15 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[MySQL Cluster]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=149</guid>
		<description><![CDATA[In questo terzo ed ultimo articolo completeremo il discorso sul cluster MySQL imparando a consultare i log, a capire le fasi di avvio ed i meccanismi di registrazione. Infine effettueremo il backup ed il restore delle basi dati registrate. Consultare i log Prima di effettuare qualsiasi tipo di operazione per comprendere la gestione dei log, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/mysql.png" alt="mysql" title="mysql" width="100" class="alignnone size-full wp-image-173" /></p>
<p>In questo terzo ed ultimo articolo completeremo il discorso sul cluster MySQL imparando a consultare i log, a capire le fasi di avvio ed i meccanismi di registrazione. Infine effettueremo il backup ed il restore delle basi dati registrate.</p>
<p><strong>Consultare i log</strong></p>
<p>Prima di effettuare qualsiasi tipo di operazione per comprendere la gestione dei log, è necessario avviare il cluster.<br />
Partendo dal presupposto che tutti i file sono configurati come illustrato negli scorsi numeri, dal management server è necessario lanciare il comando :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ndb_mgmd --config-file=/mysql/config.ini</pre></div></div>

<p>E su ciascuno dei nodi dati :</p>

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

<p>L&#8217;opzione “-n”, come già spiegato, inizializza i nodi dati senza avviarli. L&#8217;avvio effettivo dei nodi dati andrà forzato attraverso la shell <em>ndb_mgm</em> e consentirà di controllare attraverso i log le fasi di avvio. Sempre attraverso questa shell, è possibile verificare lo stato attuale del cluster :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm&gt; show
Connected to Management Server at: management.mycluster.local:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @192.168.0.2  (Version: 5.0.12, not started)
id=3    @192.168.0.3  (Version: 5.0.12, not started)
&nbsp;
[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.0.1  (Version: 5.0.12)
&nbsp;
[mysqld(API)]   1 node(s)
id=4 (not connected, accepting connect from any host)</pre></div></div>

<p>Quanto visualizzato, conferma che stiamo operando su di un cluster che comprende due nodi dati (in stato “not started”), un nodo di management ed un nodo client, al momento non connesso.<br />
I nodi dati ed il nodo di management registrano i log nella cartella che è stata dichiarata nella sezione <em>DataDir</em> all&#8217;interno del file <em>config.ini</em> del management server.<br />
Nel nostro caso, la <em>DataDir</em> dei nostri nodi è <em>/mysql/</em>. Al di sotto di questa, su ciascun nodo, si trovano file denominati <em>ndb_ID_out.log</em>, dove “ID” rappresenta l&#8217;identificativo del nodo, quindi ad esempio, il nodo di management scriverà i log all&#8217;interno del file <em>ndb_1_out.log</em>.<br />
Visualizzando il contenuto di questi file, ci si può fare una chiara idea di ciò che i vari nodi stanno facendo.<br />
Partendo dalla macchina di management, il contenuto del file sarà questo :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tail /mysql/ndb_1_out.log
NDB Cluster Management Server. Version 5.0.12 (beta)
Id: 1, Command port: 1186</pre></div></div>

<p>Questo conferma che il management è stato avviato ed è in ascolto sulla porta 1186.<br />
Sul nodo due, il file conterrà :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tail /mysql/ndb_2_out.log
2005-10-28 10:10:54 [NDB] INFO     -- Angel pid: 11026 ndb pid: 11027
2005-10-28 10:10:54 [NDB] INFO     -- NDB Cluster -- DB node 2
2005-10-28 10:10:54 [NDB] INFO     -- Version 5.0.12 (beta) --
2005-10-28 10:10:54 [NDB] INFO     -- Configuration fetched at management.mycluster.local port 1186</pre></div></div>

<p>Mentre nel nodo tre, il file avrà questo contenuto :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tail /mysql/ndb_3_out.log
2005-10-28 10:10:59 [NDB] INFO     -- Angel pid: 11061 ndb pid: 11062
2005-10-28 10:10:59 [NDB] INFO     -- NDB Cluster -- DB node 3
2005-10-28 10:10:59 [NDB] INFO     -- Version 5.0.12 (beta) --
2005-10-28 10:10:59 [NDB] INFO     -- Configuration fetched at management.mycluster.local port 1186</pre></div></div>

<p>In entrambi i casi, abbiamo la conferma che i nodi dati si sono avviati nella maniera corretta e sono collegati al management server tramite la porta 1186.<br />
Da notare come vengano indicati anche i pid (ossia i numeri identificativi) dei DUE processi relativi al nodo dati : quello angelo, che consente il controllo dei processi dalla console remota <em>ndb_mgm</em>, e quello effettivo, che si occupa della gestione dell&#8217;interscambio dati.<br />
Le informazioni relative allo stato generale del cluster sono memorizzate sul management server nel file denominato <em>ndb_1_cluster.log</em>. In questo file vengono registrati tutti gli eventi che riguardano il cluster. Appena avviato ed una volta effettuate le connessioni da parte dei nodi dati e client, il suo contenuto dovrebbe essere simile al seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tail /mysql/ndb_1_cluster.log
2005-10-28 10:10:47 [MgmSrvr] INFO     -- NDB Cluster Management Server. Version 5.0.12 (beta)
2005-10-28 10:10:47 [MgmSrvr] INFO     -- Id: 1, Command port: 1186
2005-10-28 10:10:54 [MgmSrvr] INFO     -- Mgmt server state: nodeid 2 reserved for ip 192.168.0.2, m_reserved_nodes 0000000000000006.
2005-10-28 10:10:54 [MgmSrvr] INFO     -- Node 1: Node 2 Connected
2005-10-28 10:10:55 [MgmSrvr] INFO     -- Mgmt server state: nodeid 2 freed, m_reserved_nodes 0000000000000002.
2005-10-28 10:10:59 [MgmSrvr] INFO     -- Mgmt server state: nodeid 3 reserved for ip 192.168.0.3, m_reserved_nodes 000000000000000a.
2005-10-28 10:10:59 [MgmSrvr] INFO     -- Node 1: Node 3 Connected
2005-10-28 10:11:00 [MgmSrvr] INFO     -- Mgmt server state: nodeid 3 freed, m_reserved_nodes 0000000000000002.</pre></div></div>

<p>I nodi 2 e 3 sono stati inizializzati e tramite la connessione al management node, hanno ottenuto il proprio “Node ID” e la configurazione del cluster. Questa fase preliminare dell&#8217;avvio dei nodi prevede  l&#8217;allocazione delle porte che verranno usate per la comunicazione inter-nodo ed infine l&#8217;allocazione della memoria in relazione a quanto dichiarato nella configurazione.</p>
<p><strong>Log e Checkpoints</strong></p>
<p>Per studiare le fasi di avvio del cluster attraverso i Log, è necessario comprendere i meccanismi con cui i dati vengono registrati su disco.<br />
MySQL Cluster è un database distribuito su più nodi e le informazioni in esso contenute sono replicate in maniera sincrona. Questo significa che un&#8217;operazione di aggiornamento, definita “transazione”, prima di essere registrata nel database, cioè prima di raggiungere lo stato “commited”, deve essere effettuata sulla replica primaria e su ciascuna delle secondarie.<br />
Anche se il database risiede completamente nella memoria del cluster, è ovvio che ciascun nodo possiede un filesystem nel quale vengono fisicamente memorizzati i dati. Sarebbe altrimenti impossibile recuperare i dati una volta spente le macchine, visto che il contenuto della RAM è svuotato ad ogni avvio del computer. Questo filesystem si trova su ogni nodo nella directory dichiarata come DataDir nel file di configurazione. Ad esempio, per il nodo con id 2, il filesystem verrà memorizzato all&#8217;interno della directory <em>/mysql/ndb_2_fs</em>.<br />
Ciascun nodo, tiene traccia delle transazioni all&#8217;interno del “REDO log”. La funzione del REDO log è quella di fornire un backup in caso l&#8217;intero cluster cada. I log sono controllati in maniera centralizzata, ma vengono effettuati localmente, sul filesystem di ciascun nodo.<br />
Il <em>REDO log</em> è registrato in memoria e ad intervalli regolari (di default ogni 2 secondi) scritto su disco. Ogni volta che il <em>REDO log</em> viene scritto, viene effettuato un “Global Checkpoint” o “GCP” :</p>
<div id="attachment_152" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2006/03/mysql-cluster_articolo_3-10-figura1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2006/03/mysql-cluster_articolo_3-10-figura1-300x204.png" alt="Figura 1" title="mysql-cluster_articolo_3-10-figura1" width="300" height="204" class="size-medium wp-image-152" /></a><p class="wp-caption-text">Figura 1</p></div>
<p>La frequenza con cui i <em>GCP</em> vengono eseguiti può essere variata all&#8217;interno del file di configurazione del management server, indicando per l&#8217;opzione <em>TimeBetweenGlobalCheckpoints</em> un valore in millisecondi fra 10 e  32000.<br />
Per alleggerire il carico di informazioni registrate nei <em>REDO log</em> (che è un file incrementale e che quindi continua ad ingrandirsi) e consentire una rapida ricostruzione in caso di totale caduta del cluster, MySQL effettua, sempre ad intervalli regolari, dei “Local Checkpoints” o “LCP”.<br />
Durante un <em>LCP</em> viene creata una copia su disco, definita “Snapshot”, di tutto il database e viene alleggerito il <em>Redo Log</em> al quale viene rimossa la coda delle operazioni svolte sino a quel momento :</p>
<div id="attachment_153" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2006/03/mysql-cluster_articolo_3-10-figura2.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2006/03/mysql-cluster_articolo_3-10-figura2-300x204.png" alt="Figura 2" title="mysql-cluster_articolo_3-10-figura2" width="300" height="204" class="size-medium wp-image-153" /></a><p class="wp-caption-text">Figura 2</p></div>
<p>Un <em>LCP</em> impiega parecchio tempo a completarsi e viene effettuato mentre il database viene aggiornato. Quanto viene scritto quindi, è da considerarsi inconsistente, in quanto potrebbero esserci delle transazioni non concluse, delle tabelle su cui persiste un lock e così via. Per questo motivo, al momento dell&#8217;avvio di un <em>LCP</em>, viene creato un <em>UNDO log</em>, ossia un registro delle operazioni effettuate dal database durante il <em>LCP</em>.<br />
L&#8217;<em>UNDO log</em> consente di rendere lo snapshot del database, una volta terminato il <em>LCP</em>, di nuovo consistente :</p>
<div id="attachment_154" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2006/03/mysql-cluster_articolo_3-10-figura3.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2006/03/mysql-cluster_articolo_3-10-figura3-300x204.png" alt="Figura 3" title="mysql-cluster_articolo_3-10-figura3" width="300" height="204" class="size-medium wp-image-154" /></a><p class="wp-caption-text">Figura 3</p></div>
<p>Anche in questo caso la frequenza degli <em>LCP</em> può variare in funzione alle esigenze, settando nel file di configurazione l&#8217;opzione <em>TimeBetweenLocalCheckpoints</em>.<br />
Riassumendo, se un solo nodo per qualsiasi ragione cade, si ricostruirà seguendo queste fasi :</p>
<ul>
<li>Riconnessione al server di management e segnalazione della propria presenza agli altri membri;</li>
<li>Copia dei metadata, ossia tabelle, indici ed informazioni del cluster dal management server;</li>
<li>Copia dei dati dal nodo primario;</li>
<li>Riassunzione dello stato di nodo primario;</li>
</ul>
<p>Se invece sarà tutto il sistema a cadere, allora il database verrà ricostruito partendo dall&#8217;ultimo <em>LCP</em> e dalle parti di <em>REDO Log</em> che sono state registrate su disco dall&#8217;ultimo <em>GCP</em>. Le transazioni registrate DOPO l&#8217;ultimo <em>GCP</em> verranno perse. Questa serie di operazioni è definita “System recovery”.</p>
<p><strong>Le fasi di avvio del Cluster</strong></p>
<p>A questo punto possiamo seguire le fasi di avvio del cluster direttamente dal file di log della macchina di management, lanciando il comando</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tail -f /mysql/ndb_1_cluster.log</pre></div></div>

<p>e forzando da una nuova shell della macchina di management l&#8217;avvio dei nodi dati tramite il programma <em>ndb_mgm</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm&gt; all start
Connected to Management Server at: management.mycluster.local:1186
NDB Cluster is being started.
NDB Cluster is being started.</pre></div></div>

<p>Nel file di <em>ndb_1_cluster.log</em> si potranno seguire le operazioni preliminari di avvio del cluster :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">2005-10-28 11:06:59 [MgmSrvr] INFO     -- Node 2: Start initiated (version 5.0.12)
2005-10-28 11:06:59 [MgmSrvr] INFO     -- Node 3: Start initiated (version 5.0.12)
2005-10-28 11:06:59 [MgmSrvr] INFO     -- Node 2: Start phase 0 completed
2005-10-28 11:06:59 [MgmSrvr] INFO     -- Node 2: Communication to Node 3 opened
2005-10-28 11:06:59 [MgmSrvr] INFO     -- Node 3: Start phase 0 completed
2005-10-28 11:06:59 [MgmSrvr] INFO     -- Node 3: Communication to Node 2 opened
2005-10-28 11:06:59 [MgmSrvr] INFO     -- Node 2: Node 3 Connected
2005-10-28 11:06:59 [MgmSrvr] INFO     -- Node 3: Node 2 Connected</pre></div></div>

<p>Da questo punto in poi, i nodi attraverseranno le varie fasi che porteranno all&#8217;avvio effettivo del cluster.  Queste, definite stage, sono 12 e partono da 0 :</p>
<ul>
<li>Stage 0 : Se il processo ndbd è stato avviato tramite un “initial start”, cioè con l&#8217;opzione &#8211;initial (si veda l&#8217;articolo precedente), viene pulito il filesystem del nodo relativo.</li>
<li>Stage 1 : E&#8217; la prima vera fase di avvio in cui vengono stabilite le connessioni tra i nodi ed avviati gli heartbeat (letteralmente “battito cardiaco”), ossia i processi di controllo esistenza di ciascun nodo verso gli altri.<br />
Una comunicazione heartbeat prevede uno scambio di messaggi come “Io ci sono. Tu ci sei ?” che consentono ad ogni nodo di decidere come agire in caso di problemi. Ad esempio, una mancata risposta ad un heartbeat  da parte di un nodo primario imporrebbe al nodo contenente la replica secondaria di far diventare la sua copia di dati primaria.</li>
<li>Stage 2 : In questa fase viene eletto il nodo bilanciatore, che può essere o il management node o uno dei nodi sql client. La funzione del nodo bilanciatore sarà quella di decidere come distribuire il carico delle richieste sui nodi dati. </li>
<li>Stage 3 : Vengono inizializzate alcune variabili interne del cluster. </li>
<li>Stage 4 : Se viene forzata la pulitura del filesystem relativo a tutto il cluster o al singolo nodo,  viene creato il “REDO log”.</li>
<li>Stage 5 : In questa fase, un nodo che è stato riavviato (e deve quindi reinserirsi nel cluster)  viene sincronizzato con il nodo master ed incluso nelle transazioni.</li>
<li>Stage 6 e 7 : Viene effettuato l&#8217;aggiornamento di variabili interne.</li>
<li>Stage 8 : Vengono ricostruiti tutti gli indici.</li>
<li>Stage 9 : Viene effettuato l&#8217;aggiornamento di variabili interne.</li>
<li>Stage 10 : Le applicazioni possono connettersi ai nodi ed incominciare ad effettuare interscambio dati.</li>
<li>Stage 11 : Un nodo immesso all&#8217;interno del cluster assume il ruolo di replica primaria ed effettua l&#8217;invio della replica allo slave associato.</li>
</ul>
<p>Il passaggio da una fase all&#8217;altra è segnalato all&#8217;interno dei log con il messaggio “Start phase <numero> completed” :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
2005-10-28 11:06:59 [MgmSrvr] INFO     -- Node 2: Start phase 1 completed
...</pre></div></div>

<p>Chiaramente, non avendo ancora collegato un client e non avendo effettuato alcun riavvio, al termine della fase 9 il nostro cluster è avviato :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
2005-10-28 11:07:05 [MgmSrvr] INFO     -- Node 2: Started (version 5.0.12)
2005-10-28 11:07:05 [MgmSrvr] INFO     -- Node 3: Communication to Node 4 opened
2005-10-28 11:07:05 [MgmSrvr] INFO     -- Node 3: Communication to Node 5 opened
2005-10-28 11:07:05 [MgmSrvr] INFO     -- Node 3: Communication to Node 0 opened
2005-10-28 11:07:05 [MgmSrvr] INFO     -- Node 3: Start phase 8 completed (initial start)
2005-10-28 11:07:05 [MgmSrvr] INFO     -- Node 3: Start phase 9 completed (initial start)
2005-10-28 11:07:05 [MgmSrvr] INFO     -- Node 3: Started (version 5.0.12)
2005-10-28 11:07:06 [MgmSrvr] INFO     -- Node 3: Node 1: API version 5.0.12
2005-10-28 11:07:06 [MgmSrvr] INFO     -- Node 2: Node 1: API version 5.0.12
2005-10-28 11:07:06 [MgmSrvr] INFO     -- Node 3: Prepare arbitrator node 1 [ticket=399a0001367af1d4]
2005-10-28 11:07:06 [MgmSrvr] INFO     -- Node 2: Started arbitrator node 1 [ticket=399a0001367af1d4]</pre></div></div>

<p>E&#8217; da notare come l&#8217;ultimo messaggio indichi chi sia l&#8217;arbitrator node (il bilanciatore del carico), cioè il management server.<br />
A questo punto, per completare l&#8217;avvio del Cluster ed iniziare ad accedere alle tabelle, possiamo avviare il server mysqld che si collegherà al cluster</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mysqld --defaults-file=/mysql/my.cnf &amp;</pre></div></div>

<p>ed osservare quanto viene scritto nei log :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">2005-10-28 15:57:26 [MgmSrvr] INFO     -- Mgmt server state: nodeid 4 reserved for ip 192.168.0.4, m_reserved_nodes 0000000000000012.
2005-10-28 15:57:27 [MgmSrvr] INFO     -- Node 3: Node 4 Connected
2005-10-28 15:57:27 [MgmSrvr] INFO     -- Node 2: Node 4 Connected
2005-10-28 15:57:27 [MgmSrvr] INFO     -- Node 2: Node 4: API version 5.0.12
2005-10-28 15:57:27 [MgmSrvr] INFO     -- Node 3: Node 4: API version 5.0.12</pre></div></div>

<p>Il client mysqld si è collegato al server di management, ha scaricato la configurazione e si è collegato direttamente ai nodi dati del cluster con cui effettuerà interscambio dati.<br />
Un&#8217;ultima nota riguardo ai log del cluster riguarda l&#8217;esecuzione dei <em>Local Checkpoints</em> che verrà segnalata all&#8217;interno del file <em>/mysql/ndb_1_cluster.log</em> sulla macchina di management con righe simili a quella che segue :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">2005-10-28 11:07:05 [MgmSrvr] INFO     -- Node 2: Local checkpoint 1 started. Keep GCI = 1 oldest restorable GCI = 1</pre></div></div>

<p>Questa riga indica che è stato avviato il <em>LCP</em> con identificativo 1 sul Nodo 2 e che l&#8217;ultimo <em>GCP</em> ripristinabile è quello con identificativo 1.<br />
Ovviamente, mano a mano che passerà il tempo, altre indicazioni di questo tipo seguiranno :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
...
2005-10-28 12:01:43 [MgmSrvr] INFO     -- Node 2: Local checkpoint 2 started. Keep GCI = 1 oldest restorable GCI = 2
2005-10-28 12:56:21 [MgmSrvr] INFO     -- Node 2: Local checkpoint 3 started. Keep GCI = 1609 oldest restorable GCI = 3
...
...
2005-11-01 04:16:15 [MgmSrvr] INFO     -- Node 2: Local checkpoint 100 started. Keep GCI = 157530 oldest restorable GCI = 8890
2005-11-01 05:10:53 [MgmSrvr] INFO     -- Node 2: Local checkpoint 101 started. Keep GCI = 159138 oldest restorable GCI = 8890
...
...</pre></div></div>

<p>Come si può osservare, la frequenza tra un <em>Local Checkpoint</em> ed un altro è di circa un ora.</p>
<p><strong>Backup e Restore</strong></p>
<p>Terminata la spiegazione relativa ai log, concludiamo il discorso relativo al Cluster MySQL con le operazioni di Backup e Restore.</p>
<p><em>Backup</em></p>
<p>Effettuare backup periodici di una base dati è essenziale per svariate ragioni : riparare ad errori causati dalle applicazioni, effettuare un aggiornamento del cluster (che non è possibile eseguire in linea) e ripristinare l&#8217;intera base dati in seguito ad un totale crash del sistema.<br />
I metodi di backup sono essenzialmente due : logico e fisico.</p>
<p><em>Backup logici</em> : I backup logici riguardano l&#8217;esportazione della struttura logica del database in file sql. Tali backup possono essere effettuati attraverso gli strumenti canonici di mysql quali ad esempio il programma mysqldump.<br />
Questi si rivelano utili per il trasferimento dell&#8217;intera base dati ad un altro tipo di database, essendo scritti nel linguaggio sql standard, universalmente comprensibile.<br />
Un esempio di come effettuare un backup tramite mysqldump è il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mysqldump  ndb_test &gt; ndb_test_BACKUP.sql</pre></div></div>

<p>Questo comando creerà un file denominato <em>ndb_test_BACKUP.sql</em> nella directory corrente che conterrà tutti gli statement sql necessari alla totale ricostruzione del database ndb_test che abbiamo creato nel precedente articolo.<br />
Questo metodo di backup risulta comodo se si ha la necessità di esportare database dalle dimensioni ridotte o semplicemente singole tabelle, ma su basi dati dalle dimensioni sostenute, non risulta una scelta vincente.</p>
<p><em>Backup fisici</em> : I backup fisici riguardano le copie fisiche dei filesystem dei nodi. Questo tipo di backup è realizzabile unicamente attraverso l&#8217;utilizzo degli strumenti offerti dalla suite mysql-max e proprio per questo, su basi dati di grandezza notevole, è più performante di un backup logico.<br />
Per avviare un backup è sufficiente avviare la console di management e digitare il comando “start backup” :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">ndb_mgm&gt; start backup
Waiting for completed, this may take several minutes
Node 2: Backup 1 started from node 1
Node 2: Backup 1 started from node 1 completed
StartGCP: 300415 StopGCP: 300418
 #Records: 4098 #LogRecords: 0
 Data: 65688 bytes Log: 0 bytes</pre></div></div>

<p>Quanto visualizzato, conferma la corretta esecuzione del backup : nella directory /mysql di ciascun nodo, è stata creata una sottodirectory denominata BACKUP che conterrà a sua volta tante sottodirectory quanti saranno i backup che effettueremo. Per il nodo 2 ad esempio, questa sarà la struttura delle directory :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ pwd
/mysql/BACKUP/BACKUP-1
$ ls
BACKUP-1-0.2.Data  BACKUP-1.2.ctl  BACKUP-1.2.log</pre></div></div>

<p>I file creati sono tre. Questo perché la struttura dei backup <em>MySQL Cluster</em> è composta da tre parti : i metadata (ossia le informazioni sulla struttura del database), i dati delle tabelle ed il log relativo alle transazioni.<br />
I tre file creati hanno quindi le seguenti corrispondenze :</p>
<ul>
<li>BACKUP-<id del backup>.<id del nodo>.ctl contenente i metadata;</li>
<li>BACKUP-<id del backup>-<id del file>.<id del nodo>.Data contenente i metadata;</li>
<li>BACKUP-<id del backup>.<id del nodo>.log contenente i log delle transazioni;</li>
</ul>
<p><strong>Restore</strong></p>
<p>Per effettuare il restore di backup logici è sufficiente eseguire gli statement sql presenti nel file creato con il comando mysqldump.<br />
Discorso a parte va fatto per i backup fisici, il cui restore si può effettuare solo tramite l&#8217;utilizzo del programma <em>ndb_restore</em>.<br />
Anche se il backup è stato effettuato in maniera centralizzata, ossia attraverso la console di management, i file di backup effettivi risiedono su ciascun nodo, pertanto il restore va lanciato tante volte quanti sono i nodi dati presenti nel cluster.<br />
Per prima cosa quindi, considerando come le tabelle che verranno ripristinate non dovranno esistere, è necessario rimuoverle dal database di test creato nello scorso articolo :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mysql
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 1 to server version: 5.0.12-beta-max
&nbsp;
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
&nbsp;
mysql&gt; drop table ndb_test.test;
Query OK, 1 row affected (0.22 sec)
&nbsp;
mysql&gt; quit
Bye</pre></div></div>

<p>Successivamente, va considerato che il programma <em>ndb_restore</em> agisce come un nodo sql e per connettersi al server di management necessita di un node id disponibile.<br />
La configurazione del cluster a cui il management node fa riferimento prevede la connessione di un solo nodo client, che quindi non deve essere occupato dal server <em>mysqld</em>. Prima di lanciare le operazioni di backup è necessario stoppare dalla macchina di management il server mysqld, ad esempio in questo modo :</p>

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

<p>a questo punto è possibile avviare il test di restore recandosi sul nodo 2 e lanciando questo comando :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ndb_restore --connect=&quot;nodeid=4;host=management.mycluster.local:1186&quot; --nodeid=2 --backupid=1 --restore_meta --restore_data /mysql/BACKUP/BACKUP-1/
Ndb version in backup files: Version 5.0.12
Connected to ndb!!
Successfully restored table ndb_test/def/test
_____________________________________________________
Processing data in table: ndb_test/def/test(2) fragment 0
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 0
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(0) fragment 0
Restored 0 tuples and 0 log entries</pre></div></div>

<p>Il comando eseguito è autoesplicativo, vengono passati i parametri di connessione (<em>&#8211;connect</em>), l&#8217;identificativo del nodo a cui appartiene il backup (<em>&#8211;nodeid</em>), l&#8217;identificativo del backup (<em>&#8211;backupid</em>), cosa ripristinare (<em>&#8211;restore_meta</em> e <em>-–restore_date</em>) ed infine la directory in cui risiede il backup.<br />
Successivamente, la stessa operazione andrà lanciata dal nodo 3 con le dovute modifiche :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ndb_restore --connect=&quot;nodeid=4;host=management.mycluster.local:1186&quot; --nodeid=3 --backupid=1 --restore_data /mysql/BACKUP/BACKUP-1/
Ndb version in backup files: Version 5.0.12
Connected to ndb!!
_____________________________________________________
Processing data in table: ndb_test/def/test(2) fragment 1
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 1
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(0) fragment 1
Restored 0 tuples and 0 log entries</pre></div></div>

<p>Da notare come non sia presente l&#8217;opzione <em>&#8211;restore-meta</em> in quanto essendo i metadati già stati ripristinati nel precedente restore, tale operazione non è più necessaria.<br />
Una volta riavviato dalla macchina di management il server mysqld :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mysqld --defaults-file=/mysql/my.cnf &amp;</pre></div></div>

<p>Potremo verificare il corretto ripristino della tabella test attraverso la shell del comando mysql :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">mysql&gt; use ndb_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
&nbsp;
Database changed
mysql&gt; show tables;
+--------------------+
| Tables_in_ndb_test |
+--------------------+
| test               |
+--------------------+
1 row in set (0.01 sec)</pre></div></div>

<p><strong>Conclusioni</strong></p>
<p>Ovviamente la tabella di test considerata, non contenendo alcun record, risulta poco attendibile per un test significativo, ma è più che sufficiente per comprendere le meccaniche del funzionamento di questo prodotto. Ciò che si è voluto illustrare è come MySQL Cluster possa rappresentare, una volta debitamente configurato, un&#8217;alternativa gratuita, valida e soprattutto ad alta affidabilità rispetto ad altri costosi concorrenti commerciali.<br />
Segnalo alcuni link da cui ho tratto parte delle informazioni presentate in questi articoli :<br />
Il manuale ufficiale di MySQL Cluster : <a href="http://dev.mysql.com/doc/refman/5.0/en/ndbcluster.html">http://dev.mysql.com/doc/refman/5.0/en/ndbcluster.html</a><br />
Un esempio su come realizzare un cluster a due nodi : <a href="http://www.davz.net/static/howto/mysqlcluster">http://www.davz.net/static/howto/mysqlcluster</a><br />
Dell&#8217;altra ottima documentazione : <a href="http://www.browardphp.com/mysql_manual_en/manual_NDBCluster.html">http://www.browardphp.com/mysql_manual_en/manual_NDBCluster.html</a></p>
<p><strong>La serie comprende questi articoli :</strong></p>
<p>MySQL cluster, un database ad alta affidabilità : <a href="http://www.miamammausalinux.org/2005/12/mysql-cluster-un-database-ad-alta-affidabilita-parte-1/">Parte 1</a><br />
MySQL cluster, un database ad alta affidabilità : <a href="http://www.miamammausalinux.org/2006/02/mysql-cluster-un-database-ad-alta-affidabilita-parte-2/">Parte 2</a><br />
MySQL cluster, un database ad alta affidabilità : <a href="http://www.miamammausalinux.org/2006/03/mysql-cluster-un-database-ad-alta-affidabilita-parte-3/">Parte 3</a></p>
<p><strong>Nota :</strong></p>
<p><em>Questo articolo è originariamente apparso nell&#8217;edizione italiana di Linux Journal nel Dicembre 2005/Gennaio 2006.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2006/03/mysql-cluster-un-database-ad-alta-affidabilita-parte-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL cluster, un database ad alta affidabilità : Parte 2</title>
		<link>http://www.miamammausalinux.org/2006/02/mysql-cluster-un-database-ad-alta-affidabilita-parte-2/</link>
		<comments>http://www.miamammausalinux.org/2006/02/mysql-cluster-un-database-ad-alta-affidabilita-parte-2/#comments</comments>
		<pubDate>Wed, 01 Feb 2006 11:30:19 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[MySQL Cluster]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=139</guid>
		<description><![CDATA[In questo secondo articolo cercheremo di capire come si installa e configura il cluster MySQL sulla base dei concetti esposti nel precedente, che ne è l&#8217;ideale introduzione. Preparare l&#8217;ambiente Nel preparare l&#8217;ambiente per il primo test sul cluster MySQL, dobbiamo tenere in considerazione i discorsi affrontati nello scorso articolo sull&#8217;argomento Single Point Of Failure (o [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/mysql.png" alt="mysql" title="mysql" width="100" class="alignnone size-full wp-image-173" /></p>
<p>In questo secondo articolo cercheremo di capire come si installa e configura il cluster MySQL sulla base dei concetti esposti nel precedente, che ne è l&#8217;ideale introduzione.</p>
<p><strong>Preparare l&#8217;ambiente</strong></p>
<p>Nel preparare l&#8217;ambiente per il primo test sul cluster MySQL, dobbiamo tenere in considerazione i discorsi affrontati nello scorso articolo sull&#8217;argomento <em>Single Point Of Failure</em> (o <em>SPOF</em>) e soprattutto, su come questi vadano evitati cercando di ridondare le risorse critiche il cui malfunzionamento potrebbe compromettere la stabilità del sistema.<br />
E&#8217; quindi impensabile, seppur possibile, effettuare dei test su una singola macchina. Il numero minimo di macchine su cui si dovrà lavorare sarà tre. Due nodi di storage ed uno di management.<br />
Sui nodi storage faremo in modo di configurare delle repliche incrociate dei dati per testare, in caso di perdita di un nodo, come il sistema rimanga accessibile. Sul terzo nodo configureremo, oltre al demone per il management al quale i nodi di storage si collegheranno per ricevere le impostazioni di configurazione, anche un demone MySQL server in ascolto per poter manipolare i dati e permettere ad eventuali altre applicazioni di connettersi al cluster.<br />
La struttura del nostro progetto è riassunta in figura1</p>
<div id="attachment_142" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2006/02/mysql-cluster_articolo_2-11-figura1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2006/02/mysql-cluster_articolo_2-11-figura1-300x194.png" alt="Figura 1" title="mysql-cluster_articolo_2-11-figura1" width="300" height="194" class="size-medium wp-image-142" /></a><p class="wp-caption-text">Figura 1</p></div>
<p>Nella figura, fra parentesi viene indicato il nome host. Tale nome verrà indicato nelle configurazioni che effettueremo. Se però non si dispone di un DNS, indicare l&#8217;indirizzo IP sarà comunque corretto.<br />
Un&#8217;utile scappatoia potrebbe essere quella di aggiungere al file <em>/etc/hosts</em> presente in ogni macchina, le righe relative a ciascuna macchina facente parte del nostro cluster, in questa forma :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">127.0.0.1	localhost.localdomain		localhost
192.168.0.1	management.mycluster.local	management
192.168.0.2	storage_a.mycluster.local	storage_a
192.168.0.3	storage_b.mycluster.local	storage_b</pre></div></div>

<p>Certo il progetto non rispetta in pieno le rigide regole anti-SPOF elencate nello scorso articolo, ma trattandosi di un ambiente di test e non di produzione, risulta più che sufficiente.<br />
Nel momento in cui si vorrà portare in produzione il progetto, allora ci si dovrà preoccupare di aumentare il numero di nodi di <em>storage</em> (sempre in numero pari), dividere management e MySQL server e ridondare ciascuno.</p>
<p><strong>Scegliere il corretto software</strong></p>
<p>Abbiamo già spiegato nel precedente articolo come i binari di MySQL che si trovano nelle comuni distribuzioni non abbiano le funzionalità HA. Per ottenere dei binari che soddisfino queste esigenze esistono due metodi : il primo sta nel ricompilare con apposite opzioni i sorgenti, il secondo nell&#8217;utilizzare il pacchetto binario mysql-max.<br />
Salvo esigenze specifiche, utilizzare il pacchetto <em>mysql-max-5.0.12-beta-linux-i686.tar.gz</em> scaricabile da questo indirizzo <a href="http://dev.mysql.com/downloads/mysql/5.0.html">http://dev.mysql.com/downloads/mysql/5.0.html</a> risulta una scelta vincente, mentre per sistemi con architetture differenti come ia64 o amd64, esistono le versioni di mysql-max relative.<br />
Il link indicato porta non a caso alla versione 5.0 del pacchetto, che viene indicata come <em>BETA</em>. Infatti, anche se al momento la versione stabile è la 4.1, nel corso dell&#8217;articolo ci concentreremo sulla 5.0. Per prima cosa perché non manca molto affinché diventi la release ufficiale ad essere distribuita ed inoltre presenta notevoli miglioramenti che vale la pena vedere in funzione.<br />
Un elenco delle funzionalità aggiuntive presenti nella versione 5.0 lo si osserva in figura 2. </p>
<div id="attachment_143" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2006/02/mysql-cluster_articolo_2-11-figura2.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2006/02/mysql-cluster_articolo_2-11-figura2-300x208.png" alt="Figura 2" title="mysql-cluster_articolo_2-11-figura2" width="300" height="208" class="size-medium wp-image-143" /></a><p class="wp-caption-text">Figura 2</p></div>
<p>Sempre all&#8217;indirizzo indicato per i download esiste la possibilità di scaricare anche i pacchetti rpm, convertibili senza problemi per le distribuzioni Debian in pacchetti deb tramite il software alien.<br />
In tutto i pacchetti di binari sono quattro : <em>MySQL-ndb-management</em>, che contiene gli eseguibili per il nodo di management, <em>MySQL-ndb-storage</em>, contenente quelli per i nodi storage ed infine i pacchetti <em>MySQL-ndb-tools</em> e <em>MySQL-ndb-extra</em> contenenti programmi di utilità.<br />
Esiste anche la possibilità di ricompilare manualmente i sorgenti scaricandosi il pacchetto <em>.tar.gz</em> ed indicando in fase di configurazione l&#8217;opzione <em>&#8211;with-ndb-cluster</em>. Tale operazione è però sconsigliata dagli stessi sviluppatori per ragioni di ottimizzazione e stabilità.<br />
Nel corso dell&#8217;articolo utilizzeremo il pacchetto di binari tar.gz su tutte le macchine del cluster, poiché contiene tutti gli eseguibili necessari per far funzionare i nodi di storage, quello di management ed il server MySQL oltre a numerosi programmi di utilità e parecchi esempi.<br />
Nulla vieta, una volta compresi i ruoli dei vari programmi, di utilizzare i pacchetti rpm per le installazioni in modo da ridurre il carico di spazio occupato dall&#8217;installazione.</p>
<p><strong>Installazione</strong></p>
<p>Utilizzando come stabilito i binari precompilati nel pacchetto <em>.tar.gz</em>, l&#8217;installazione è quanto di più semplice possa esservi. Basterà, su ciascuna macchina, scompattare il file in una directory stabilita, ad esempio <em>/usr/local</em>.<br />
Essendo il nome della neo creata directory piuttosto lungo, converrà creare anche un link simbolico che ne faciliti l&#8217;accesso :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cd /usr/local/
$ tar -xzvf /&lt;directory del file&gt;/mysql-max-5.0.12-beta-linux-i686.tar.gz
$ ln -s  mysql-max-5.0.12-beta-linux-i686 mysql</pre></div></div>

<p>All&#8217;interno di questa directory si trova tutto il necessario per la costruzione del cluster.<br />
Sarà utile creare, sempre su ciascuna macchina, anche una cartella <em>/mysql</em> sotto la quale verranno posti i file di configurazione ed i dati stessi.<br />
Infine, per non dover lanciare i comandi ricorrendo tutte le volte ai path completi, possiamo aggiungere la directory dei binari <em>/usr/local/mysql/bin/</em> alla variabile d&#8217;ambiente <em>$PATH</em>, inserendo questa riga all&#8217;interno del file <em>/etc/profile</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ export PATH=$PATH:/usr/local/mysql/bin/</pre></div></div>

<p>In questo modo tutti gli eseguibili del pacchetto mysql-max saranno disponibili senza che sia necessario indicarne tutto il path.</p>
<p><strong>Configurare il Management server</strong></p>
<p>La configurazione del server di Management risiede in un singolo file, denominato config.ini.<br />
Tale file andrà creato nella directory <em>/mysql</em> del management server con questo contenuto :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[NDB_MGMD]
id=1
HostName=management
&nbsp;
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=1950M
IndexMemory=450M
&nbsp;
[NDBD]
id=2
HostName=storage_a
DataDir=/mysql/
&nbsp;
[NDBD]
id=3
HostName=storage_b
DataDir=/mysql/
&nbsp;
[MYSQLD]</pre></div></div>

<p>Come si può notare, il file è diviso in sezioni, ciascuna delle quali inizia con una direttiva tra parentesi quadre. Ogni sezione termina quando inizia l&#8217;altra.<br />
Prima di analizzare nel dettaglio ogni riga inserita, va detto che la configurazione indicata risulta ridotta, nel senso che esistono moltissime direttive per esigenze specifiche e sono tutte documentate da MySQL a questo indirizzo : http://dev.mysql.com/doc/mysql/en/mysql-cluster-config-file.html.</p>
<ul>
<li>[NDB_MGMD] : Contiene le impostazioni relative al management server, nel nostro caso abbiamo dichiarato che tale nodo avrà identificativo 1 e che l&#8217;hostname relativo sarà “management”. Ancora una volta va sottolineato che tale nome deve essere risolto dal DNS, altrimenti il cluster non potrà<br />
funzionare. In alternativa, si può inserire l&#8217;indirizzo IP.</li>
<li>[NDBD_DEFAULT] : Contiene le impostazioni comuni a tutti i nodi dati (NDBD). In questo caso sono stati indicati il numero di repliche (due secondo la struttura illustrata in figura1) e la quantità riservata alla memoria dati e indici.<br />
Tale cifra è ottenibile con questa operazione </p>
<p><em>DataMemory = Node RAM * Total Nodes / Replicas</em></p>
<p>La quantità di memoria degli indici va stabilita in base alle esigenze, un buon compromesso può essere circa il 20% della DataMemory.<br />
I valori indicati nell&#8217;esempio sopra, sono quindi del tutto indicativi, poiché dipendono dalle macchine utilizzate per effettuare i test.</li>
<li>[NDBD] : Ciascuna di queste sezioni contiene le impostazioni del singolo nodo dati, per il quale vengono indicati l&#8217;identificativo numerico, il nome host (o l&#8217;indirizzo IP) e la directory nella quale verranno memorizzati i dati.<br />
Le sezioni NDBD dovranno essere tante quante i nodi dati.</li>
<li>[MYSQLD] : Ciascuna di queste sezioni contiene le impostazioni dei singoli nodi sql. Per nodi sql si intendono server mysql, applicazioni che si basano sulle MySQL cluster API (di cui abbiamo parlato nello scorso articolo) o le stesse applicazioni della suite di mysql-max.<br />
In questo caso è stato previsto quindi un solo client collegabile.</li>
</ul>
<p>La configurazione del nodo di management termina qui, il file config.ini dovrà essere letto dal file eseguibile <em>ndb_mgmd</em>. Questo file eseguibile agirà da demone e rimarrà in ascolto per le connessioni dei nodi dati.</p>
<p><strong>Configurare i nodi storage</strong></p>
<p>Tutte le impostazioni dei nodi dati risiedono sul management server ed ognuno di essi prima di fare qualsiasi cosa vi si connette per capire come è composto il cluster e quale ruolo deve svolgere all&#8217;interno di questo.<br />
Anche in questo caso esiste un file eseguibile che agisce da demone e che consente di effettuare il collegamento, “scaricare” la configurazione dal management server e comunicare con gli altri nodi dati per creare l&#8217;NDB Cluster, questo file è <em>ndbd</em>.<br />
L&#8217;unica cosa da configurare è l&#8217;accesso al server di management, e ciò si ottiene creando un file denominato <em>/etc/my.cnf</em>  che conterrà le impostazioni di configurazione lette da <em>ndbd</em>.<br />
E&#8217; comunque possibile passare all&#8217;eseguibile i dati di connessione direttamente a riga di comando.<br />
Il file <em>/etc/my.cnf</em> conterrà quanto segue :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[MYSQL_CLUSTER]
ndbcluster
ndb-connectstring=management.mycluster.local</pre></div></div>

<p>Chiaramente quanto scritto andrà ripetuto anche sul secondo nodo dati <em>storage_b</em>.<br />
La configurazione dei nodi storage è così completata.</p>
<p><strong>Configurare il server MySQL</strong></p>
<p>L&#8217;ultima parte della configurazione riguarda il MySQL server che nel nostro caso abbiamo deciso di configurare sulla stessa macchina del management (ma che potrebbe risiedere su di una a se stante).<br />
Per prima cosa, è necessario creare l&#8217;utenza <em>mysql</em> (gruppo <em>mysql</em>) con cui verrà eseguito il server :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ groupadd mysql
$ useradd -g mysql mysql</pre></div></div>

<p>Fatto questo, si può procedere all&#8217;installazione dei database di sistema, utilizzando il file<br />
 contenuto nella cartella <em>scritps/</em> che si trova nell&#8217;alberatura creata dell&#8217;installazione del file <em>tar.gz</em> descritta poco sopra :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cd /usr/local/mysql/
$ scripts/mysql_install_db -–user=mysql</pre></div></div>

<p>Chiaramente si è forzata l&#8217;utenza mysql per l&#8217;esecuzione delle operazioni per ovvie ragioni di sicurezza.<br />
Una volta completata questa operazione, non rimane che settare i permessi delle directory relative :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ chown -R root:mysql .
$ chown -R mysql data/</pre></div></div>

<p>Come ultima cosa, è necessario creare un file denominato <em>my.cnf</em> ad esempio sotto la cartella <em>/mysql</em> contenente, oltre ad alcune opzioni per il server stesso, le impostazioni di connessione al cluster :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[MYSQLD]
user=mysql
port=3306
socket=/tmp/mysql.sock
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
&nbsp;
[MYSQL_CLUSTER]
ndbcluster
ndb-connectstring=management.mycluster.local</pre></div></div>

<p>Le opzioni relative al server MySQL rispecchiano la nostra installazione : l&#8217;utente con cui verrà eseguito il server sarà “mysql”, la porta su cui sarà in ascolto sarà quella standard “3306”, il file di socket per le connessioni sarà /tmp/mysql.sock, le directory dei dati e del server saranno rispettivamente <em>/usr/local/mysql/data</em> e <em>/usr/local/mysql</em>.<br />
Le altre opzioni presenti nell&#8217;area <em>[MYSQL_CLUSTER]</em> sono le stesse dei due nodi storage. Si riferiscono infatti al server di management.<br />
La configurazione del MySQL server è quindi completa.</p>
<p><strong>Avviare il nodo di management</strong></p>
<p>La sequenza in cui le varie componenti del cluster verranno andranno sarà la seguente : server di management, nodi storage ed infine server MySQL.<br />
Come osservato in fase di configurazione, il programma demone che rimarrà in ascolto come management server è <em>ndb_mgmd</em>, questo significa che sulla macchina <em>management.mycluster.local</em> andrà eseguito il seguente comando :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ndb_mgmd --config-file=/mysql/config.ini</pre></div></div>

<p>Il parametro passato è ovviamente il file di configurazione da noi creato.<br />
La porta <em>TCP</em> su cui il demone rimane in ascolto è la <em>1186</em>, per verificare quindi che questa sia aperta è possibile lanciare il seguente comando :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ netstat -natp | grep ndb
tcp        0      0 0.0.0.0:1186            0.0.0.0:*               LISTEN     10303/ndb_mgmd
tcp        0      0 192.168.0.1:35563       192.168.0.1:1186          ESTABLISHED10303/ndb_mgmd
tcp        0      0 192.168.0.1:1186        192.168.0.1:35565         ESTABLISHED10303/ndb_mgmd
tcp        0      0 192.168.0.1:1186        192.168.0.1:35563         ESTABLISHED10303/ndb_mgmd</pre></div></div>

<p>Un output simile quello riportato, indica che il processo è in esecuzione ed in ascolto.<br />
Da questo punto in avanti, per gestire il cluster utilizzeremo il programma <em>ndb_mgm</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm&gt;</pre></div></div>

<p>All&#8217;interno della shell <em>ndb_mgm</em>, è possibile osservare lo stato del cluster, avviare e stoppare i nodi, modificare i metodi di logging e così via. Una panoramica dei comandi disponibili si ottiene digitando help e premendo invio, per il momento, limitiamoci a digitare show e premere invio :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">ndb_mgm&gt; show
Connected to Management Server at: management.mycluster.local:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2 (not connected, accepting connect from storage_a)
id=3 (not connected, accepting connect from storage_b)
&nbsp;
[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.0.1  (Version: 5.0.12)
&nbsp;
[mysqld(API)]   1 node(s)
id=4 (not connected, accepting connect from any host)</pre></div></div>

<p>Si può osservare come sia stata visualizzata tutta la configurazione del cluster : Il management server <em>ndb_mgmd(MGM)</em> è in attesa di connessioni da parte dei due nodi dati <em>ndbd(NDB)</em> (ciascuno dei quali associato alla rispettiva macchina, storage a o b) e di un server MySQL mysqld(API).</p>
<p><strong>Avviare i nodi dati</strong></p>
<p>Per avviare i nodi dati che costituiranno l&#8217;<em>NDB Cluster</em>, dobbiamo recarci su ciascuna delle macchine storage ed avviare il programma ndbd :</p>

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

<p>Per verificare che il processo sia in esecuzione, possiamo filtrare l&#8217;output del comando ps come segue :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ps aux | grep ndbd
root      3845  0.0  0.0  6476 2872 ?        S    12:41   0:00 ndbd
root      3846  3.5  6.1 1930968 251212 ?    S    12:41   0:00 ndbd
root      3878  0.0  0.0  3692  668 pts/0    S    12:41   0:00 grep ndbd</pre></div></div>

<p>Come si noterà dall&#8217;output, pur avendo lanciato solo una volta il comando, nell&#8217;elenco dei processi si trovano due processi ndbd. Non c&#8217;è nulla di sbagliato in questo, infatti il demone ndbd prevede che esista un processo base che si occupi dei dati ed un processo “angelo custode” che consenta al nodo dati di essere gestito da remoto.<br />
Il concetto si può capire pensando alle operazioni di restart di un nodo che prevedono il kill del processo ndbd ed il suo nuovo avvio. Se dal management server si volesse effettuare un&#8217;operazione come quella descritta ed esistesse un unico processo ndbd sul nodo dati, sarebbe impossibile farlo ripartire una volta stoppato. Vi è quindi la necessità che a guidare le operazioni del processo ndbd principale vi sia un angelo custode.<br />
A questo punto se ritorniamo sul management server e sempre dalla shell ndb_mgm lanciamo il comando show, otterremo quanto segue :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm&gt; show
Connected to Management Server at: management.mycluster.local:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @192.168.0.2  (Version: 5.0.12, Nodegroup: 0, Master)
id=3    @192.168.0.3  (Version: 5.0.12, Nodegroup: 0)
&nbsp;
[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.18.0.1 (Version: 5.0.12)
&nbsp;
[mysqld(API)]   1 node(s)
id=4 (not connected, accepting connect from any host)</pre></div></div>

<p>Quanto visualizzato conferma che i due nodi dati sono correttamente avviati, appartengono ad un unico <em>Nodegroup</em> e che il nodo nodo con id 2 è <em>Master</em>.<br />
Fra tutte le opzioni passabili da riga di comando all&#8217;eseguibile ndbd, due in particolare meritano una spiegazione “-n” e “&#8211;initial”.<br />
“-n” o “&#8211;nostart” sta per “Don&#8217;t start ndbd immediately”, questo significa che il nodo dati diverrà attivo solo quando riceverà il comando start dal management node. Il nodo dati sarà quindi in stato “not started”. Supponiamo di aver avviato a questo punto il nodo dati 3 con il comando “ndbd -n”. Un comando show dalla console di ndb_mgm produrrà quindi tra le altre questa riga :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[...]
id=3    @192.168.0.3 (Version: 5.0.12, not started)
[...]</pre></div></div>

<p>Il nodo dati 3 rimarrà in stato “not started” sino a che dalla shell di <em>ndb_mgm</em> non verrà forzato lo start del nodo :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">ndb_mgm&gt; 3 start
Database node 3 is being started.</pre></div></div>

<p>Fatto questo, il nodo dati 3 sarà “online” :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[...]
id=3    @192.168.0.3 (Version: 5.0.12, Nodegroup: 0)
[...]</pre></div></div>

<p>L&#8217;altra importante opzione passabile ad <em>ndbd</em> è “&#8211;initial”. Passare questa opzione significa forzare la pulizia del filesystem relativo al nodo dati. Se l&#8217;initial start è effettuato su di un solo nodo, allora i dati verranno ricostruiti in base alle repliche presenti sull&#8217;altro, mentre se l&#8217;operazione viene effettuata su tutti i nodi, allora l&#8217;intera base dati viene ripulita.<br />
Questa opzione torna utile quando vengono effettuate delle modifiche strutturali al cluster come ad esempio la modifica della memoria disponibile.<br />
Vedremo nel prossimo articolo come sfruttare questo parametro.</p>
<p><strong>Avviare il mysqld</strong></p>
<p>Per avviare il mysqld basterà lanciare il comando mysqld a cui andrà passato il percorso del file di configurazione creato poco sopra tramite l&#8217;opzione “&#8211;defaults-file=” :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mysqld --defaults-file=/mysql/my.cnf &amp;</pre></div></div>

<p>Il carattere &#038; alla fine del comando consente di mettere il processo in background per poter continuare a lavorare nella console.<br />
E&#8217; possibile inoltre verificare che il processo mysqld sia in ascolto sulla porta configurata :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ netstat -natp | grep mysqld
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      15129/mysqld
tcp        0      0 192.168.0.1:34398          192.168.0.1:1186           ESTABLISHED 15129/mysqld
tcp        0      0 192.168.0.1:34402          192.168.0.2:32782          ESTABLISHED 15129/mysqld
tcp        0      0 192.168.0.1:34401          192.168.0.3:32779          ESTABLISHED 15129/mysqld</pre></div></div>

<p>A questo punto l&#8217;avvio del cluster può dirsi completato, infatti <em>ndb_mgm</em> conferma che tutte le componenti sono operative :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm&gt; show
Connected to Management Server at: management.mycluster.local:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
&nbsp;
&nbsp;
&nbsp;
&nbsp;
id=2    @192.168.0.2  (Version: 5.0.12, Nodegroup: 0)
id=3    @192.168.0.3  (Version: 5.0.12, Nodegroup: 0, Master)
&nbsp;
[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.0.1  (Version: 5.0.12)
&nbsp;
[mysqld(API)]   1 node(s)
id=4    @192.168.0.1  (Version: 5.0.12)</pre></div></div>

<p><strong>Utilizzo del motore NDB</strong></p>
<p>Per effettuare dei test di funzionamento del motore cluster, utilizzeremo il programma client MySQL  dalla macchina di management :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ /usr/local/mysql/bin/mysql
&nbsp;
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 2 to server version: 5.0.12-beta-max
&nbsp;
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
&nbsp;
mysql&gt;</pre></div></div>

<p>Per prima cosa verificheremo che nell&#8217;elenco dei motori MySQL disponibili sia presente anche quello del cluster <em>NDB</em>, con questo comando :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">mysql&gt; show engines;
+------------+---------+----------------------------------------------------------------+
| Engine     | Support | Comment                                                        |
+------------+---------+----------------------------------------------------------------+
...
|
| NDBCLUSTER | YES     | Clustered, fault-tolerant, memory-based tables                 |
| NDB        | YES     | Alias for NDBCLUSTER                                           |
...
+------------+---------+----------------------------------------------------------------+
18 rows in set (0.00 sec)</pre></div></div>

<p>Se tra le righe risultanti appariranno anche quelle relative ad <em>NDBCLUSTER</em>, avremo la conferma del supporto al motore cluster da parte del server MySQL installato sulla macchina di management.<br />
Occorre però un chiarimento. Tale server possiede le medesime funzionalità di un comune server MySQL ed anzi, se non si sfruttano direttive particolari in fase di creazione delle tabelle, queste verranno gestite dal motore di default, che si chiama MyISAM, e non dal motore NDB.<br />
Per capire meglio questo concetto, procediamo col creare un database di test :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">mysql&gt; CREATE DATABASE ndb_test;
Query OK, 1 row affected (0.00 sec)</pre></div></div>

<p>All&#8217;interno creeremo una semplice tabella da un campo di tipo integer contenente un singolo valore :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">mysql&gt; USE ndb_test;
Database changed
mysql&gt; CREATE TABLE test (i INT);
Query OK, 0 rows affected (0.02 sec)
&nbsp;
mysql&gt; INSERT INTO test (i) VALUES (1);
Query OK, 1 row affected (0.00 sec)
&nbsp;
mysql&gt; SELECT * FROM test;
+------+
| i    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)</pre></div></div>

<p>Al momento la tabella NON è ancora gestita dal motore <em>NDB</em>, e ciò è confermato da questo comando :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">mysql&gt; SHOW CREATE TABLE test;
+-------+-----------------------------------------------------------------------------------------+
| Table | Create Table                                                                            |
+-------+-----------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `i` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+-------+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)</pre></div></div>

<p><em>ENGINE=MyISAM</em> indica infatti che la tabella viene gestita localmente dal motore <em>MyISAM</em>.<br />
Per fare in modo di porre sotto motore <em>NDB</em> la tabella, è necessario forzare il motore da usare in fase di creazione, aggiungendo alla fine del comando <em>CREATE TABLE</em> la clausola <em>ENGINE=NDBCLUSTER</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">mysql&gt; CREATE TABLE test (i INT) ENGINE=NDBCLUSTER;</pre></div></div>

<p>oppure modificare la tabella appena creata come segue :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">mysql&gt; ALTER TABLE test ENGINE=NDBCLUSTER;
Query OK, 1 row affected (0.44 sec)
Records: 1  Duplicates: 0  Warnings: 0</pre></div></div>

<p>A questo punto i dati della tabella (una sola, importantissima riga !) sono replicati sui nodi del cluster e sono raggiungibili attraverso il server <em>mysqld</em> da qualsiasi applicazione :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">mysql&gt; SHOW CREATE TABLE test;
+-------+---------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                |
+-------+---------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `i` int(11) default NULL
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 |
+-------+---------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)</pre></div></div>

<p>Un ultimo importante chiarimento riguarda eventuali altri server MySQL che potranno essere collegati al <em>cluster NDB</em>. Infatti il motore <em>NDB</em> agisce a livello di tabelle non di database. Questo significa che non è il database ad essere replicato, ma solo le tabelle. Su ciascun ulteriore server MySQL collegato dovranno quindi esistere i database relativi. Nel nostro caso ad esempio, se volessimo accedere alla tabella test da un&#8217;altro server MySQL configurato nel management server, dovremmo prima creare il database <em>ndb_test</em> al cui interno, senza fare nient&#8217;altro, troveremo le tabelle del cluster.</p>
<p><strong>Conclusioni</strong></p>
<p>Abbiamo visto in questo articolo come configurare ed avviare il cluster MySQL creando al suo interno una tabella di test.<br />
Nel prossimo impareremo a consultare i log, effettueremo dei test di funzionamento simulando dei crash sui singoli nodi per accertarci che non esistano SPOF ed effettueremo modifiche sulla struttura del database. Infine impareremo ad effettuare backup e restore dei dati in modo da poter approfondire tutte le funzionalità di questo interessante progetto.</p>
<p><strong>La serie comprende questi articoli :</strong></p>
<p>MySQL cluster, un database ad alta affidabilità : <a href="http://www.miamammausalinux.org/2005/12/mysql-cluster-un-database-ad-alta-affidabilita-parte-1/">Parte 1</a><br />
MySQL cluster, un database ad alta affidabilità : <a href="http://www.miamammausalinux.org/2006/02/mysql-cluster-un-database-ad-alta-affidabilita-parte-2/">Parte 2</a><br />
MySQL cluster, un database ad alta affidabilità : <a href="http://www.miamammausalinux.org/2006/03/mysql-cluster-un-database-ad-alta-affidabilita-parte-3/">Parte 3</a></p>
<p><strong>Nota :</strong></p>
<p><em>Questo articolo è originariamente apparso nell&#8217;edizione italiana di Linux Journal nel Dicembre 2005/Gennaio 2006.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2006/02/mysql-cluster-un-database-ad-alta-affidabilita-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL cluster, un database ad alta affidabilità : Parte 1</title>
		<link>http://www.miamammausalinux.org/2005/12/mysql-cluster-un-database-ad-alta-affidabilita-parte-1/</link>
		<comments>http://www.miamammausalinux.org/2005/12/mysql-cluster-un-database-ad-alta-affidabilita-parte-1/#comments</comments>
		<pubDate>Thu, 01 Dec 2005 11:30:22 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[MySQL Cluster]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=127</guid>
		<description><![CDATA[Cerchiamo di capire con questa serie di articoli come sia possibile impiegare il più famoso database utilizzato per applicazioni web in soluzioni di alta affidabilità. MySQL : Solo un server SQL ? Quanti non hanno sentito parlare almeno una volta di MySQL ? MySQL è il database più diffuso sul web per una svariata serie [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/mysql.png" alt="mysql" title="mysql" width="100" class="alignnone size-full wp-image-173" /></p>
<p>Cerchiamo di capire con questa serie di articoli come sia possibile impiegare il più famoso database utilizzato per applicazioni web in soluzioni di alta affidabilità.</p>
<p><strong>MySQL : Solo un server SQL ?</strong></p>
<p>Quanti non hanno sentito parlare almeno una volta di MySQL ? MySQL è il database più diffuso sul web per una svariata serie motivi, la velocità, la facilità d&#8217;impiego, la semplicità di accesso ed il supporto per i sistemi operativi più utilizzati. E&#8217; inoltre un progetto Opensource che pur avendo alla base una reale azienda che deve produrre profitto, la svedese MySQL AB, distribuisce il proprio software liberamente.<br />
Il database infatti è liberamente scaricabile dal sito ufficiale <a href="http://www.mysql.com">http://www.mysql.com</a> nelle versioni per i sistemi operativi Linux, Solaris, Mac OSX, FreeBSD e tantissimi altri. Un elenco completo delle piattaforme supportate si trova a questo indirizzo : <a href="http://dev.mysql.com/downloads/mysql/5.0.html">http://dev.mysql.com/downloads/mysql/5.0.html</a>.<br />
Detto questo, quello che molti non sanno è che MySQL AB sta sviluppando in parallelo al motore database standard anche una versione cluster, quello che viene definito un database ad alta affidabilità. Il progetto originale partì dalla necessità di un&#8217;importante azienda di telefonia di avere un motore database ad alta affidabilità che permettesse ricerche estremamente rapide.<br />
La struttura relativamente semplice degli archivi dell&#8217;azienda si coniugava alla perfezione con le funzionalità offerte da MySQL, a cui mancava soltanto il supporto per l&#8217;alta affidabilità. Il prodotto finale di questi studi fu appunto MySQL cluster che da allora MySQL AB continua a far crescere in parallelo al motore standard.<br />
Cercheremo di capire nel corso di questo articolo (e dei successivi) come funzioni e quali siano le potenzialità di questo progetto.</p>
<p><strong>Cos&#8217;è un database ad alta affidabilità ?</strong></p>
<p>Un database ad alta affidabilità (o <em>HA</em>, <em>High Available</em>) è semplicemente quello che dice di essere : una base dati sempre disponibile, che presenta ridondanza di processi e di dati, che non ha cioè singoli punti di rottura (o <em>SPOF</em>, <em>Single Point Of Failure</em>).<br />
All&#8217;interno di un&#8217;architettura senza SPOF tutte le componenti presenti (Hardware e Software) sono ridondate. Se una componente smette di funzionare, l&#8217;integrità del sistema non è compromessa.<br />
Tale concetto viene applicato a tutti i tipici cluster di servizi, come nel caso di uno share di rete <em>NFS</em> o un Web server debbano essere ridondati al fine di garantire che, in caso di interruzione dei processi principali, i servizi continuino ad essere erogati.<br />
In un database, avere ridondanza di processi significa che se per una qualsiasi ragione, il processo Master (ossia quello a cui le applicazioni client fanno solitamente riferimento) dovesse cadere, il database rimarrebbe comunque accessibile (grazie ad un secondo processo, che diventerebbe a sua volta Master).<br />
Avere ridondanza di dati invece, significa che il dato non è registrato in una singola posizione. Se questo si corrompe quindi, si ha la possibilità di ripristinarne il contenuto in base alla sua copia che risiede in una diversa posizione.<br />
Tutte queste funzionalità permettono di avere un database senza SPOF : se si dovesse danneggiare una qualsiasi componente, logica o fisica, il sistema non risulterebbe compromesso.</p>
<p><strong>Come ottenere un database ad alta affidabilità ?</strong></p>
<p>Definito quindi il concetto di database HA, va capito nella realtà come sia possibile ottenerne uno, ovvero come si possano eliminare tutti i potenziali <em>SPOF</em>.<br />
Il discorso <em>SPOF</em> non va sottovalutato, ma è necessario porsi dei limiti nella considerazione di tutti i possibili punti di rottura. Questo significa che se una singola macchina risulta essere un unico <em>SPOF</em>, ed è quindi necessario averne due, allora anche la stanza in cui saranno presenti le due macchine sarà uno <em>SPOF</em> e quindi sarebbe bene separare in stanze diverse le due macchine, ma a quel punto l&#8217;edificio stesso diventerebbe uno <em>SPOF</em> e proseguendo di questo passo si arriverebbe ben presto a capire come l&#8217;universo stesso sia un unico immenso <em>SPOF</em> !<br />
Quindi, senza tirare in ballo la meccanica quantistica per creare un database cluster, è chiaro come sia necessario trovare il giusto equilibrio tra affidabilità e funzionalità.<br />
Separare su macchine diverse le componenti del database è un buon compromesso : i processi, ossia la parte software che permette l&#8217;accesso al dato ed i dati stessi saranno su macchine distinte.<br />
Questa logica, divide il cluster in due livelli : quello SQL, inerente ai processi, e quello Storage, inerente ai dati. Entrambi i livelli devono essere esenti da <em>SPOF</em> e devono quindi prevedere ridondanza.</p>
<p><strong>La ridondanza di processi (livello SQL)</strong></p>
<p>E&#8217; necessario che il motore Sql che gestisce le richieste di accesso e le operazioni di lettura/scrittura sia sempre disponibile. Ad un motore Sql generalmente corrisponde un processo in ascolto presso un determinato indirizzo IP su una particolare porta. Rendere questa situazione ridondata, significa avere più di un motore Sql. Ciascuno di questi motori, idealmente, dovrebbe essere posto dietro ad un bilanciatore, cioè un software che renda disponibile un solo indirizzo IP di riferimento ma che distribuisca il carico delle richieste effettuate attraverso tutti i motori che sono stati configurati. Esistono diversi software adatti a questo scopo, ma una discussione in merito andrebbe oltre gli scopi del presente articolo. Per il momento, si può concludere dicendo che questa situazione eliminerebbe il <em>SPOF</em> legato al motore Sql.</p>
<p><strong>La ridondanza dei dati (livello Storage)</strong></p>
<p>Al pari della ridondanza dei processi, che riguarda più che altro l&#8217;alta affidabilità dell&#8217;accesso alla base dati, c&#8217;è la ridondanza dei dati stessi, che si può ottenere sostanzialmente in due modi o con  una combinazione di entrambi : la ridondanza fisica e la ridondanza logica.<br />
Per ottenere ridondanza fisica è sufficiente avere hardware dedicato a questo scopo, ad esempio  controller <em>RAID</em> che gestiscano la duplicazione dei dati su due o più dischi in maniera trasparente. In caso di rottura fisica del disco, questa viene segnalata in modo da poter essere corretta (con la sostituzione del disco), ma l&#8217;accesso ai dati rimane comunque garantito.<br />
Un po&#8217; più complicato è il discorso relativo alla ridondanza logica. Per capire questo concetto, è necessario comprendere il significato di replica. Il numero di repliche all&#8217;interno di un database   indica il numero copie multiple dello stesso dato. Le operazioni effettuate sul dato sono replicate su tutte le copie e fino a che questa operazione non è completata, la transazione che ha generato la modifica non è considerata conclusa. E&#8217; chiaro quindi come esistano repliche primarie (le prime ad essere utilizzate) e repliche secondarie (le copie effettive) ed è altrettanto logico che avere due repliche del medesimo dato sullo stesso sistema non rispetti il principio dell&#8217;assenza di <em>SPOF</em>.<br />
La soluzione ideale quindi sarebbe quella di avere come minimo due repliche distribuite su due diversi sistemi, come in figura 1.</p>
<div id="attachment_128" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura1-300x245.png" alt="Figura 1" title="mysql-cluster_articolo_1-11-figura1" width="300" height="245" class="size-medium wp-image-128" /></a><p class="wp-caption-text">Figura 1</p></div>
<p>Qui l&#8217;intero database è diviso in due partizioni. Nel primo sistema abbiamo la replica primaria della prima partizione e la replica secondaria della seconda partizione, mentre nel secondo, viceversa, è presente la replica primaria della seconda partizione e quella secondaria della prima. In questo modo in caso di rottura, blocco o qualsiasi evento comprometta il funzionamento di uno dei due sistemi, l&#8217;intera base dati è ricostruibile e l&#8217;accesso ai dati sempre disponibile.</p>
<p>La situazione ideale quindi, prevede che esista una base dati distribuita su almeno due sistemi, ciascuno dei quali contenente la propria replica primaria e la secondaria dell&#8217;altro sistema.  L&#8217;accesso ai dati sarà reso disponibile da due motori Sql attraverso un unico indirizzo <em>IP</em>, gestito dal bilanciatore che distribuirà il carico delle richieste. In tutta questa struttura esiste un solo <em>SPOF</em> che è rappresentato dal bilanciatore stesso, che quindi a sua volta andrebbe ridondato.<br />
Questa è la situazione perfetta (forse paranoica !) ed è illustrata in figura 2.</p>
<div id="attachment_129" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura2.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura2-300x248.png" alt="Figura 2" title="mysql-cluster_articolo_1-11-figura2" width="300" height="248" class="size-medium wp-image-129" /></a><p class="wp-caption-text">Figura 2</p></div>
<p><strong>MySQL cluster</strong></p>
<p>Definita quindi la struttura generale dei database cluster, possiamo spostare la nostra attenzione su come è composto un cluster MySQL.<br />
Come tutti i database cluster, anche quello MySQL presenta la consueta architettura a due livelli : il livello SQL ed il livello Storage, denominato anche NDB Cluster, dove l&#8217;acronimo NDB sta per Network DataBase.<br />
Ciascuna componente presente in un livello, è definita Nodo. Esisteranno quindi nodi client, ossia componenti appartenenti al livello SQL e nodi dati, cioè componenti del livello storage. Esiste anche una terza tipologia di nodo, denominato di management (gestione) che rappresenta il fulcro intorno al quale ruota il MySQL cluster e sul quale verrà fatto un discorso a parte.</p>
<p><strong>I nodi client</strong></p>
<p>I nodi client sono ciò che permettono alle utenze di effettuare operazioni sui dati e si dividono essenzialmente in tre categorie :</p>
<ol>
<li>Istanze dei server MySQL : la maggioranza dei casi, veri e propri server MySQL che si connettono alla base dati e si interfacciano all&#8217;esterno attraverso i classici processi demone mysqld.</li>
<li>Applicazioni esterne che utilizzano l&#8217;accesso nativo ai dati : si tratta di applicazioni che non usano l&#8217;intermediario MySQL per accedere al database, ma lo fanno direttamente utilizzando quelle che vengono definite NDB API. Questi client effettuano l&#8217;accesso ai dati direttamente dal codice del programma costruito.</li>
<li>Client nativi del cluster MySQL : ossia le applicazioni stesse del cluster, programmi cioè che consentono l&#8217;accesso e la manutenzione del cluster attraverso ad esempio operazioni di backup o restore. Tali applicazioni sono denominate NDB clients.</li>
</ol>
<p>Tutti e tre i casi illustrati consentono all&#8217;utente di avere un interfaccia di accesso ai dati, in alcuni casi “consueta” (Il tipico server MySQL) ed in altri meno (le NDB API, delle quali bisogna avere una conoscenza piuttosto approfondita della programmazione database a basso livello).</p>
<p><strong>I nodi dati</strong></p>
<p>I nodi dati sono la struttura che si occupa della memorizzazione effettiva dei dati e compongono il già citato NDB Cluster.<br />
Tutta quest&#8217;area lavora in maniera trasparente rispetto ai client. Il modo e la posizione in cui i dati vengono frammentati e la gestione delle repliche non sono conosciute dai client. Essi accedono, con i metodi illustrati poco sopra, solo all&#8221;entità NDB cluster.<br />
A ciascuno dei nodi dati è associato un processo demone denominato ndbd.<br />
Una cosa importante da capire è la sostanziale differenza di NDB cluster dagli altri prodotti database cluster in commercio, come ad esempio Oracle RAC. In questi infatti, l&#8217;alta affidabilità è garantita da una totale ridondanza. Questo significa che esistono due macchine identiche, ma una sola è attiva e si preoccupa di tenere allineata la seconda che rimane pronta a subentrare in caso di guasto.<br />
All&#8217;interno di NDB cluster, tutti i nodi che fanno parte del sistema pur rispettando le regole di ridondanza e assenza di SPOF, contribuiscono al funzionamento del cluster incrementandone notevolmente le prestazioni.</p>
<p><strong>Il nodo management</strong></p>
<p>La parte più importante del cluster MySQL è rappresentata dal nodo di management, il nodo al quale tutte le componenti del cluster si connettono appena avviate per conoscere il resto del sistema.<br />
In questo nodo è configurata la struttura del cluster : quanti e quali sono i nodi dati, quante repliche avranno le partizioni del sistema, quanta memoria sarà disponibile e così via.<br />
Dal nodo di management è possibile avviare e stoppare i nodi dati, verificare lo stato del loro funzionamento, effettuare backup e restore, settare la tipologia dei log di ciascun client e stoppare l&#8217;intero cluster.<br />
E&#8217; interessante notare che, una volta che il cluster sia stato avviato, il nodo di management potrebbe tranquillamente smettere di funzionare. Tutti i nodi del cluster infatti, una volta ricevuti i parametri di configurazione dal nodo di management, iniziano a comunicare direttamente fra loro. Certo è che se si dovesse interrompere il processo del nodo di management sarebbe impossibile effettuare le altre operazioni descritte sopra, ma è importante capire che il cluster stesso, una volta che sia completamente avviato, sia indipendente dal nodo di management.<br />
Il nodo di management è un processo demone, avviato tramite un file eseguibile chiamato ndb_mgmd che rimane in ascolto su una porta alle richieste dei nodi client.</p>
<p>In figura 3 viene illustrata la struttura logica del cluster MySQL.</p>
<div id="attachment_130" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura3.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura3-300x245.png" alt="Figura 3" title="mysql-cluster_articolo_1-11-figura3" width="300" height="245" class="size-medium wp-image-130" /></a><p class="wp-caption-text">Figura 3</p></div>
<p><strong>Replicazione e frammentazione dei dati nel cluster MySQL</strong></p>
<p>Ora che abbiamo capito la logica del cluster MySQL cerchiamo di concentrarci su come esso tratti la distribuzione dei dati. Questa è divisa in due parti : la frammentazione dei dati e la replicazione degli stessi.<br />
La frammentazione dei dati consiste nel partizionare una tabella in un numero pari di frammenti che vengono divisi all&#8217;interno di un numero pari di nodi. La replicazione consiste nella duplicazione dei frammenti all&#8217;interno dei nodi.<br />
Osserviamo la figura 4 :</p>
<div id="attachment_131" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura4.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura4-300x178.png" alt="Figura 4" title="mysql-cluster_articolo_1-11-figura4" width="300" height="178" class="size-medium wp-image-131" /></a><p class="wp-caption-text">Figura 4</p></div>
<p>In questo esempio, il database è organizzato in due nodi e due repliche. Tutto si rifà alla teoria dei cluster di database che abbiamo precedentemente spiegato ed illustrato in figura1. Qui ciò che veniva chiamato partizione è chiamato frammento ma il concetto non cambia : ciascun frammento di tabella è presente su entrambi i nodi, in un nodo come frammento primario e nell&#8217;altro come replica di questo. Il danneggiamento di un nodo non compromette l&#8217;intero sistema in quanto ogni sistema possiede le informazioni necessarie a ricostruire il totale delle informazioni presente nel sistema.<br />
Si noterà come nella figura venga menzionato il “Nodegroup”.<br />
All&#8217;interno del cluster MySQL il numero di Nodegroup si ottiene con questa semplice equazione :</p>
<p><em>Numero di Nodegroup = Numero di data nodes / Numero di repliche</em></p>
<p>Nel caso di figura4 quindi con due nodi dati e due repliche avremo un solo Nodegroup. Se invece avessimo a disposizione quattro macchine, potremmo organizzare il carico come illustrato in figura5, dove esistono 4 nodi dati con due repliche e quindi due NodeGroups.<br />
Le tabelle in questo esempio sono frammentate in quattro partizioni e sono divise a coppie nei Nodegroup : ciascun Nodegroup contiene metà delle informazioni del database e ciascun nodo dati possiede un frammento primario dei quattro in cui è divisa la tabella.<br />
Anche questa struttura non possiede SPOF.</p>
<div id="attachment_132" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura5.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura5-300x128.png" alt="Figura 5" title="mysql-cluster_articolo_1-11-figura5" width="300" height="128" class="size-medium wp-image-132" /></a><p class="wp-caption-text">Figura 5</p></div>
<p>Le combinazioni possibili del numero di repliche, dati e nodi non devono superare i limiti del cluster MySQL che sono di un massimo di : 4 repliche dei dati, 48 nodi dati, 64 nodi totali. Lavorando per coerenza con un numero pari di repliche e nodi dati, si possono ottenere situazioni che partono da due nodi con due repliche fino a quarantotto nodi con quattro repliche.<br />
E&#8217; chiaro che maggiore sarà il numero di repliche, minori saranno le performance in quanto le transazioni di scrittura non saranno completate sino a che l&#8217;informazione non verrà scritta in tutte le sue repliche.</p>
<p><strong>Come organizzare CPU e Memoria sui nodi dati</strong></p>
<p>L&#8217;organizzazione delle risorse fisiche del database è abbastanza semplice, nel senso che esistono delle regole precise su cui basarsi. </p>
<p><em>CPU</em></p>
<p>Ogni nodo dati deve essere associato ad una CPU, quindi è perciò sconsigliato configurare un sistema a singola CPU affinché esegua più di un processo ndbd (ossia il processo nodo dati del cluster). Per eseguire più di un nodo dati su una singola macchina è necessario usare sistemi Multi CPU, ma bisogna ricordarsi di eliminare lo SPOF macchina singola, pertanto, è necessario predisporre un minimo di due macchine con dual CPU.<br />
Anche dal punto di vista logico, nel momento in cui si decide di mettere sulla stessa macchina due nodi data, è bene separare le risorse in modo che se una macchina va in crash il sistema non risulta compromesso : quindi nel caso in cui si decida di avere un database con quattro nodi data distribuiti su due macchine dual CPU sarà bene organizzare i Nodegroup come in figura 6 :</p>
<div id="attachment_133" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura6.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2005/12/mysql-cluster_articolo_1-11-figura6-300x126.png" alt="Figura 6" title="mysql-cluster_articolo_1-11-figura6" width="300" height="126" class="size-medium wp-image-133" /></a><p class="wp-caption-text">Figura 6</p></div>
<p>Con questa organizzazione, se anche una macchina va in crash, il sistema non è compromesso.</p>
<p><em>Memoria</em></p>
<p>La quantità di memoria disponibile nel cluster, viene calcolata con questa semplice equazione :</p>
<p><em>Memoria totale cluster = Memoria RAM Nodo dati * Numero totale di nodi / Numero di repliche</em></p>
<p>Quindi se avremo quattro gigabyte di memoria su ogni nodo dati, quattro nodi dati totali e due repliche, il nostro cluster avrà otto gibabyte di memoria disponibile.</p>
<p><strong>Conclusioni</strong></p>
<p>Abbiamo visto in questo articolo come è strutturato logicamente e come funziona il cluster MySQL. Nel prossimo eseguiremo una prova effettiva, configurando un cluster a due nodi ed imparando a gestire il tutto dal Management server.</p>
<p><strong>La serie comprende questi articoli :</strong></p>
<p>MySQL cluster, un database ad alta affidabilità : <a href="http://www.miamammausalinux.org/2005/12/mysql-cluster-un-database-ad-alta-affidabilita-parte-1/">Parte 1</a><br />
MySQL cluster, un database ad alta affidabilità : <a href="http://www.miamammausalinux.org/2006/02/mysql-cluster-un-database-ad-alta-affidabilita-parte-2/">Parte 2</a><br />
MySQL cluster, un database ad alta affidabilità : <a href="http://www.miamammausalinux.org/2006/03/mysql-cluster-un-database-ad-alta-affidabilita-parte-3/">Parte 3</a></p>
<p><strong>Nota :</strong></p>
<p><em>Questo articolo è originariamente apparso nell&#8217;edizione italiana di Linux Journal nel Dicembre 2005/Gennaio 2006.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2005/12/mysql-cluster-un-database-ad-alta-affidabilita-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
