Replicazione Database MySQL

Ven, 01/04/2005 - 15:13

Replicazione Database MySQL

Inviato da Incubus 8 commenti
SCOPO

Replicare tutti o alcuni dabase gestiti da un server MySQL su almeno un pc anche se tale pc non è sempre collegato alla rete.

COME FUNZIONA

Un master server (quello dove vengono eseguire le scritture dei dati) e N slave che hanno una copia di tutto o alcuni database.
Master e slave sono identifcati da un numero che, nella stessa "rete di replicazione", deve essere univoco.

Nel mio caso, ho un master server e uno slave (un portatile): il master è sempre accesso, lo slave ogni tot giorni viene colegato alla rete domestica.

Quando lo slave è collegato alla rete domestica, esegue una connessione al master e sincronizza i database così da averne una copia esatta.

Dalle prove fatte fino ad ora, se sul master viene fatta una modifica a un database repliacato e uno o tutti gli slave sono disponibili, tale modifica viene immeditamente replicata anche su di loro.
TOOLS

MySQL server, MySQL client, tail

tail non è indispensabile ma nal mio caso è stato molto utile per il "debugging": consiglio di avre una shell in primo piano con in esecuzione questa istanza di tail, sia per il master che per lo slave:
# tail -f /var/log/mysql/mysql.log

La versione di MySQL Server usata è la 4.0.X

INSTALLAZIONE

Come di consueto apt ci viene in aiuto:

# apt-get install mysql-server mysql-client mysql-common

Vi verrà chiesto se, quando verrà rimosso mysql-server, dovranno essere cancellati anche i database

Lo sconsiglio caldamente
CONFIGURAZIONE DEL MASTER

Come sempre il file di configurazione principale è in /etc/mysql e si chiama my.cnf, quindi apriamolo con l'editor preferito e modifichiamolo:
La prima cosa da fare è COMMENTARE la riga "skip-networking" che avvia mysql solo con socket ovvero nn apre la porta 3306 (standard) per accettare connessioni da rete.

Decommentiamo poi la riga "server-id" e indichiamo un numero positivo maggiore di 0 (1 ad esempio) che sarà ovviamente l'id del server.
Decommentiamo anche "log-bin" e lasciamo il path già indicato (/var/log/mysql/mysql-bin.log)

A questo punto riavviamo il server MySQL per far appliacre le modifiche.

Ora creiamo l'utente che si occuperà della replicazione, accediamo alla shell sql con:

# mysql -u root -p
>GRANT SUPER,REPLICATION CLIENT,REPLICATION SLAVE,RELOAD ON *.* TO 'replicatore'@'%.miodominio.estensione' IDENTIFIED BY 'password';
ATTENZIONE!La password NON deve più lunga di 16 caratteri altrimenti, anche se corretta, non verrà accettata!

In questo modo abbiamo creato l'utente "replicatore" con password "password" che ha privilegi di "SUPER,REPLICATION CLIENT,REPLICATION SLAVE,RELOAD" su tutto il database e che può collegarsi SOLO da un ip appartente al dominio ".miodominio.estensione".

ESEMPIO
Nel mio caso la query è stata:

> GRANT SUPER,REPLICATION CLIENT,REPLICATION SLAVE,RELOAD ON *.* TO 'replicatore'@'caspar.valhalla.lan' IDENTIFIED BY 'my_pwd';

In questo modo "replicatore" può accedere SOLO se si collega dal pc che ha ip `host caspar.valhalla.lan` (che ha una lease riservata sul mio dhcp). Al posto del nome specifico della macchina è possibile indicare l'ip.

Usciamo dalla shell sql con semplice

> quit;
CONFIGURAZIONE DELLO SLAVE

Per come è settato l'utente "replicatore", egli ha accesso a tutti i database per cui è necessario indicare allo slave quali database replicare.

Come fatto per il master, apriamo il file /etc/mysql/my.cnf, commentiamo "skip-networking" e arriviamo alla riga "server-id":


# Identificatore dello slave: deve essere diverso da quello del master e di tutti gli altri slave
server-id = 2
# Ip o nome del master (deve essere risolvibile in un indirizzo ip)
master-host = services.valhalla.lan
# Nome con cui lo slave si presenta al master
report-host = caspar.valhalla.lan
# Utente da usare per la replicazione
master-user = replicatore
# Password dell'utente per la replicazione
master-password = my_pwd
# Indichiamo i database che intendiamo replicare, uno per riga
replicate-do-db = postfix
replicate-do-db = proftpd
replicate-do-db = phpmyadmin
# Tempo di attesa in secondi prima di ritentare la connessione in caso di fallimento
master-connect-retry = 60
# Log "verboso"
log-warnings


A questo punto riavviamo anche il server MySQL dello slave aprimo la shell MySQL:

# mysql -u root -p
> load data from master;

Se non vengono restituiti errori, tutto è ok e avrete la replicazione dei databse indicati sullo/sugli slave.

CREDITS

Autore: Incubus
E-Mail: incubus@gl-como.net
Membro del Gruppo Linux Como: http://www.gl-como.net


In:



Commenti

Ritratto di paolo
#1

Inviato da paolo il Ven, 01/04/2005 - 18:32.

Bella Guida.

Oramai hai preso la mano!! Come al solito un'ottima guida ben dettagliata e formattata alla perfezione.

Tra l'altro è un argomento molto interessante, sarebbe carino sviluppare una Guida sulle varie conigurazione e ottimizzazioni del Server Mysql, cosa che in questo periodo è il mio pane quotidiano.

Thx! Wink

Paolo Mainardi
CTO Twinbit http://www.twinbit.it
Vice Presidente -- ILDN - Italian Linux DIstro Network



Ritratto di fbrisa
#2

Inviato da fbrisa il Ven, 01/04/2005 - 19:15.

Complimenti

Mitico !
Una guida semplice, ben fatta e di grande utilità !

Veramente un grande, posso andare in giro a dire che sono un tuo amico ? Wink



Ritratto di Stefano
#3

Inviato da Stefano il Ven, 01/04/2005 - 21:51.

Re: Complimenti

Ottima ottima guida!

Complimenti....ti metto un bel 9!

Stefano Mainardi - Founder of ILDN & CEO of Twinbit



Ritratto di cheis
#4

Inviato da cheis il Ven, 01/04/2005 - 22:03.

Re: Complimenti

Grande: utile e chiara. 9 anche per me. Wink

[=x-small]Knowledge is power: SHARE IT BABY!!![/]
_____________________________________________



Ritratto di Incubus
#5

Inviato da Incubus il Sab, 02/04/2005 - 20:08.

Versione

Scusate ma ho dimenticato di indicare che la versione di MySQL usata è la 4.0.X (4.0.24 per essere precisi, della debian testing)

Ringrazio per i commenti Big Grin

Sorry Laughing



Ritratto di madbrains
#6

Inviato da madbrains il Dom, 03/04/2005 - 13:53.

Re: Versione

Bella guida veramente, credo che prenderò spunto per un progetto che sto portando avanti, una specie di rubrica con indirizzi e contatti da fare gestire ad un master e fare utilizzare a determinati slave, grazie ancora per avermi risparmiato del lavoro e del tempo Big Grin



Ritratto di Incubus
#7

Inviato da Incubus il Lun, 04/04/2005 - 10:48.

Re: Versione

Se la mole di carico è alta puoi distribuire in qualche modo le read sugli slave ma le write DEVONO essere fatte sul master: attenzione a non confondere la replicazione con il clustering.
Con la replicazione hai N copie del/i db/s ma le write DEVONO essere fatte sul master mentre con un cluster puoi fare read e write su ogni nodo.



Ritratto di cosmy
#8

Inviato da cosmy il Ven, 15/09/2006 - 16:54.

Re: Versione

Guida molto chiara e semplice.
Vogliamo parlare un po' degli utilizzi pratici della replicazione?
Mettiamo di avere master e slave su due server sempre connessi, con connessione ethernet tra loro diretta per un update dello slave continuo veloce e sicuro.
Se per caso mi si schianta il database Master come faccio a sfruttare lo Slave?
E se volessi alleggerire il carico di select sul master, girando qualche query allo slave, dove devo agire?

O Tempora, O Mores!