Inspiré d'un article de GNU/Linux Magazine qui parlait de ce sujet, mais qui à mon goût comporte plusieurs erreurs et imprécision.

Voici donc un tuto from scratch pour se monter un système Master-Master (comme le faisait à l'époque mysql-mmm) intégré à MySQL 5.6.

Environnement

Il nous faut 2 machines :

  • ''jessie1'', dont l'IP est ''192.168.56.1''
  • ''jessie2'', dont l'IP est ''192.168.56.2''

Toutes deux sont des Debian Jessie à jour.

Installation des outils

Installons le serveur MySQL 5.6 de Percona, en ajoutant les sources apt, puis en installant les bons paquets.

Sur les 2 machines :

# Ajout de la clé du repository
apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
echo "deb http://repo.percona.com/apt jessie main" | tee /etc/apt/sources.list.d/percona.list
apt-get update
apt-get install -V percona-server-server-5.6 percona-xtrabackup mysql-utilities

Configuration de MySQL

Sur chaque serveur, dans le fichier ''/etc/mysql/my.cnf'' :

  • On commente le paramètre de configuration "bind-address" car l'autre serveur doit pouvoir se connecter.
    #bind-address            = 127.0.0.1

:!: N'hésitez pas à regarder le log ''/var/log/mysql/error.log'' et à y fixer les warnings, afin d'avoir un log plus propre, et surtout pour éviter des complications lors des futures upgrades (passage à MySQL 5.7 par exemple).

  • On active la réplication.

    log_bin = mysql-bin
    server_id = 1 # ou "2" pour jessie2
    binlog_format = MIXED
    log_slave_updates = ON
    enforce_gtid_consistency = ON
    gtid_mode = ON
    master_info_repository = TABLE
    report_host = jessie1 # ou "jessie2" pour jessie2
  • Puis nous redémarrons MySQL pour activer ces paramètres

    service mysql restart

Ajout de l'utilisateur de réplication

Sur ''jessie1'' seulement, car la DB sera copié sur ''jessie2'' par la suite.

mysql -u root -p
CREATE USER 'repl-user'@'192.168.56.1' IDENTIFIED BY 's3cr3tp4ss';
CREATE USER 'repl-user'@'192.168.56.2' IDENTIFIED BY 's3cr3tp4ss';
CREATE USER 'repl-user'@'jessie1' IDENTIFIED BY 's3cr3tp4ss';
CREATE USER 'repl-user'@'jessie2' IDENTIFIED BY 's3cr3tp4ss';
CREATE USER 'repl-user'@'localhost' IDENTIFIED BY 's3cr3tp4ss';

GRANT ALL ON *.* 'repl-user'@'192.168.56.1' WITH GRANT OPTION;
GRANT ALL ON *.* 'repl-user'@'192.168.56.2' WITH GRANT OPTION;
GRANT ALL ON *.* 'repl-user'@'jessie1' WITH GRANT OPTION;
GRANT ALL ON *.* 'repl-user'@'jessie2' WITH GRANT OPTION;
GRANT ALL ON *.* 'repl-user'@'localhost' WITH GRANT OPTION;

Insertion de quelques données sur jessie1

CREATE DATABASE IF NOT EXISTS test;
CREATE TABLE test.clients (id INT AUTO_INCREMENT PRIMARY KEY, name TEXT NOT NULL);
INSERT INTO test.clients (name) VALUES ('plouf');

Initialisation du slave jessie2

Sur ''jessie1'' :

mkdir -p /srv/backups
innobackupex /srv/backups/
innobackupex --apply-log /srv/backups/2016-02-28_11-54-37/

Sur ''jessie2'' :

service mysql stop
rm -rf /var/lib/mysql
rsync -avprP -e ssh jessie1:/srv/backups/2016-02-28_11-54-37/ /var/lib/mysql
chown -R mysql. /var/lib/mysql
service mysql start

cat /var/lib/mysql/xtrabackup_binlog_info

Dans mon cas, le ''cat'' me retourne :

mysql-bin.000001    654 52c75c02-ddff-11e5-b521-080027b94ff0:1-2

Le GTID est la troisième partie (''52c75c02-ddff-11e5-b521-080027b94ff0:1-2'')

mysql -u root -p
SET GLOBAL gtid_purged="52c75c02-ddff-11e5-b521-080027b94ff0:1-2";
CHANGE MASTER TO MASTER_HOST="192.168.56.1", MASTER_USER="repl-user", MASTER_PASSWORD="s3cr3tp4ss", MASTER_AUTO_POSITION = 1;
START SLAVE;
SHOW SLAVE STATUS;

S'il n'y a pas d'erreur dans la colonne ''Last_IO_Error'' et que ''Executed_Gtid_Set'' est le même que sur ''jessie1'', alors la réplication est en route.

L'ultime vérification consiste à ajouter une ligne dans la table ''test.clients'' de ''jessie1'' et de voir si elle est répliquée sur ''jessie2''.

Sur ''jessie1'' :

INSERT INTO test.clients (name) VALUES ('plouf-bis');

SHOW MASTER STATUS;

Puis sur ''jessie2'' :

SELECT * FROM test.clients;

SHOW SLAVE STATUS;

Mise en place du failover

Sur les 2 serveurs :

On déclare aux mysql-utilities que jessie1 est le master et jessie2 est le slave :

mysqlreplicate --master=repl-user:s3cr3tp4ss@192.168.56.1 --slave=repl-user:s3cr3tp4ss@192.168.56.2

On check l'état de la réplication.

mysqlfailover --master=repl-user:s3cr3tp4ss@192.168.56.1 --slaves=repl-user:s3cr3tp4ss@192.168.56.2 check

Sources

Sources :

  • GNU/Linux Magazine 191 : http://www.gnulinuxmag.com/?p=441
  • XtraBackup pour créer un nouveau slave : https://www.percona.com/doc/percona-xtrabackup/2.4/howtos/recipes_ibkx_gtid.html
  • Manuel de mysqlfailover : https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqlfailover.html

Previous Post Next Post