A/I Orange Book (1.0): Un how-to sulla replicazione e distribuzione di una rete resistente di server autogestiti | ||
---|---|---|
Indietro | Capitolo 8. Il Web | Avanti |
MySQL è usato principalmente per i vari database dei siti, e dunque, non ha bisogno di configurazioni particolari a parte l'esistenza di uno script in grado di leggere dal database LDAP quali db MySQL devono essere presenti su una determinata macchina ed eventualmente crearli.
Sono però presenti alcuni database che è utile condividere tra le varie macchine, e dato che sono prevalentemente sbilanciati verso la lettura (un esempio è un blog delle attività dell'organizzazione che gestisce i server) ha senso utilizzare le funzionalità di replicazione di MySQL.
Nella nostra situazione attuale l'unica soluzione attuabile è quella di una replicazione master-slave. il master su cui avvengono letture-scritture, e lo slave che replica (in tempo reale, o in differita se vogliamo). Lo slave ha la sola funzione di backup, in caso di caduta del master contiene già tutti i dati.
Il progetto di avere una soluzione, non solo di backup, ma anche di distribuzione del carico, significherebbe avere i server in modalità master-master, ove entrambi permettono lettura-scrittura, in equilibrio col carico; questa soluzione richiede tanta banda, e sopratutto banda stabile. Per server geograficamente lontani come i nostri non è attuabile.
Fate riferimento a "MySQL Reference Manual: Chapter 6, Replication in MySQL".
I passi da seguire per mettere su la replicazione sono:
configurazione my.cnf sul master:
log-bin #binlog-do-db=(se si vuole limitare a un singolo db) server-id = 1questo abilita il logbin, è un file in /var/lib/mysql (può essere grosso). in debian va modificato anche /etc/mysql/debian-log-rotate.conf aumentando KEEP_BINARY_LOGS= - bisogna tenerne un numero sufficiente alto, in caso di caduta della replicazione lo slave per ricominciare deve avere a disposizione i vecchi log.
configurazione my.cnf sullo slave:
server-id = 2 master-host = xxx.xxx.xxx.xxx master-user = repl master-password = xxxxxxxx master-port = 3306 #replicate-do-db = #skip-slave-startl'utente repl va creato sul master, con i seguenti permessi:
GRANT REPLICATION SUPER RELOAD ON *.* TO REPL@IP_SLAVE IDENTIFIED BY 'PASSWORD';I privilegi SUPER e RELOAD servono nel caso si voglia usare dallo slave il comando LOAD TABLE FROM MASTER per il caricamento dello snapshot del db. Per grandi database questo metodo è assolutamente sconsigliato.
copia dello snapshot del db:
interrompere temporaneamente le scritture sul master:
FLUSH TABLES WITH READ LOCK;
lasciando aperta la console mysql (con i processi di scrittura bloccati) si può procedere alla copia del db:
cd /var/lib/mysql tar cvf /tmp/database.tar ./ --exclude mysql scp /tmp/database.tar utente@slave
si prende nota dello status del master al momento dello snapshot: nome del *file* e *position*
SHOW MASTER STATUS; +----------------+-----------+--------------+------------------+ | File | Position | Binlog_do_db | Binlog_ignore_db | +----------------+-----------+--------------+------------------+ | FILE-bin.011 | 117646022 | borsa | | +----------------+-----------+--------------+------------------+
rimozione del lock:
UNLOCK TABLES;
copia dello snapshot sullo slave:
cd /var/lib/mysql tar xvf database.tar
si informa lo slave sulla posizione da cui inziare la replicazione:
mysql> CHANGE MASTER TO MASTER_LOG_FILE='FILE-BIN.00X', MASTER_LOG_POS=XXXXXXXXX;
si lancia lo slave:
SLAVE START;
per monitorare lo stato della replicazione:
SHOW MASTER STATUS \G; SHOW MASTER LOGS