8.2. MySQL

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.

8.2.1. Replicazione

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:

  1. configurazione my.cnf sul master:

    log-bin 
    #binlog-do-db=(se si vuole limitare a un singolo db)
    server-id       = 1
    questo 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.

  2. 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-start
    l'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.

  3. copia dello snapshot del db:

    1. interrompere temporaneamente le scritture sul master:

      FLUSH TABLES WITH READ LOCK;

    2. 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

    3. 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        |                  | 
      +----------------+-----------+--------------+------------------+ 

    4. rimozione del lock:

      UNLOCK TABLES;

  4. copia dello snapshot sullo slave:

    cd /var/lib/mysql 
    tar xvf database.tar

  5. 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;

  6. si lancia lo slave:

    SLAVE START;

  7. per monitorare lo stato della replicazione:

    SHOW MASTER STATUS \G;
    SHOW MASTER LOGS