Replicatie met MySQL / MariaDB

By | 18 november 2013

Aan de hand van deze uitleg kan een eenvoudige database replicatie worden opgezet. Er wordt uitgegaan standaard master – slave opzet.

Configuratie van de master

De databaseserver moet een uniek id krijgen. Daarnaast moet een logfile worden aangegeven (de log_bin) en wordt aangegeven welke database moet worden gerepliceerd. Meerdere databases kunnen worden opgegeven door de regel binlog_do_db te herhalen met een andere databasenaam. Deze instellingen komen onder het [mysqld] gedeelte.

Voorbeeld:

server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
binlog_do_db            = mydatabase1

Er moet een gebruik worden aangemaakt die rechten heeft om de replicatie uit te voeren:

grant replication slave on *.* to 'replicatieuser'@'slavehost.example.com' identified by 'mypass';

Na het wijzigen van de my.cnf en het aanmaken van de replicatie-user moet MySQL herstart worden; service mysqld restart

Op de slave is de te repliceren database nog niet aanwezig. Om ervoor te zorgen dat er geen wijzigingen tussentijds in de database gemaakt worden locken we de betreffende database. Daarna wordt met mysqldump een dump gemaakt van de database. Daarna wordt de database aangemaakt en de dump ingelezen op de slave server. Zodra dit gebeurd is, kan de lock worden opgeheven. Wijzigingen die dan worden gemaakt worden na het configureren en opstarten van de slave server automatisch gesyncroniseerd.

USE mydatabase1;
FLUSH TABLES WITH READ LOCK;

Maak met code>mysqldump een dump van de database en hef de lock op de database weer op:

USE mydatabase1;
UNLOCK TABLES;

Configuratie van de slave

Maak op de slave databaseserver de database aan die gerepliceerd moet worden:

create database mydatabase1;

Hierna moet de my.cnf van de MySQL slave server worden aangepast:

relay-log               = /var/lib/mysql/mysql-relay-bin.log
log_bin                 = /var/lib/mysql/mysql-bin.log
binlog_do_db            = mydatabase1

Hierna moet MySQL herstart worden: service mysqld restart

Op de master server moet worden gekeken welke logfile in gebruik is en wat de positie is:

show master status\G;
*************************** 1. row ***************************
            File: mysql-bin.000002
        Position: 240310

Op de slave kan dan worden gegeven:

CHANGE MASTER TO MASTER_HOST='master.example.com', MASTER_USER='replicatieuser', MASTER_PASSWORD='mypass', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=240310;
start slave;

De replicatie is nu opgezet en zou nu moeten werken. Dit kan gecontroleerd worden door:

show slave status\G;

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: master.example.com
                  Master_User: replicationuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 240569
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 240853
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

Waarbij de regels Slave_IO_Running en Slave_SQL_Running belangrijk zijn. Die moeten beide Yes aangeven.