Outils pour utilisateurs

Outils du site


informatique:sgbd:mysql:replication

mysql replication

Des questions:

  • vérifier automatiquement que la réplication fonctionne
  • le slave est désynchroniser car il ne pouvait pas communiquer avec le master
  • le fichier bin_log est trop petit pour contenir les requêtes le temps que le slave les récupère

Wording / Vocabulaire : master & slave → primary & replica.

Voir MySql.

Quelques configs & manips

    • Lui donner un nom –log-basename pour qu'il ne soit pas dépendant du hostname.
    • Définissez expire_logs_days plus long que tout décalage possible du replica.
    • max_binlog_size : default & max = 1GB
    • max_relay_log_size : default = 0

Safely Purging Binary Log Files While Replicating

To be sure replication is not broken while deleting log files, perform the following steps:

  • Get a listing of binary log files on the primary by running SHOW BINARY LOGS.
  • Go to each replica server and run SHOW SLAVE STATUS to check which binary log file each replica is currently reading.
  • Find the earliest log file still being read by a replica. No log files before this one will be needed.
  • If you wish, make a backup of the log files to be deleted
  • Purge all log files before (not including) the file identified above.

Essais de réplication

Environnement: Docker

Avec MariaDB 10.3 (défault on deian 10.8).

Un p'tit docker-compose pour se créer un environnement virtuel:

#
# Use root/secret as user/password credentials
#
# mariadb official image: https://hub.docker.com/_/mariadb/
#
version: '3.1'

services:

  db-master:
    image: mariadb:10.3
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: secret
    ports:
      - 3308:3306
    volumes:
      - ./master.cnf.d:/etc/mysql/conf.d

  db-slave:
    image: mariadb:10.3
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: secret
    ports:
      - 3309:3306
    volumes:
      - ./slave.cnf.d:/etc/mysql/conf.d

Configuration mysql

Pour le master:

#./master.cnf.d/master.cnf
[server]
server_id=1
# activer le log des requêtes pour la réplication
log-bin
# default
#binlog-format=row

# N'exporter que la table test
binlog-do-db=test

#report-host=the-master
#log-basename=the-master

Pour le slave:

# ./slave.cnf.d/slave.cnf
[server]
server_id=2

report-host=the-slave

# TODO:
#relay_log=master-default

Documentation

binlog-do-db

Sans autre précision, tout sera répliqué, par exemple un conflit de PRIMARY KEY sur la table mysql.user peut arrêter la réplication [ERROR] Slave SQL: Could not execute Write_rows_v1 event on table mysql.user; Duplicate entry 'localhost-root' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysqld-bin.000001, end_log_pos 26196, Gtid 0-1-36, Internal MariaDB error code: 1062

Démarrer le tout

On lance les services

docker-compose up

Comme d'hab avec docker, si besoin:

# la liste des container actifs
docker ps
# Ouvrir un shell dans un container
docker exec -it <container id or name> bash
# Voir le log docker d'un container
docker logs <container id or name>

On a donc le master sur la port 3308 et le slave sur le post 3309.

Et on peut s'y connecter avec un client Mysql.

# forcer le protocole sinon mysql va essayer d'utiliser la socket si un serveur est installé localement.
# le host par défaut est localhost, pas besoin de le préciser
# master (port 3308):
mysql -u root -psecret --protocol=TCP -P 3308
# slave (port 3309):
mysql -u root -psecret --protocol=TCP -P 3309

Activer le réplication Master/Slave

Sur le master

CREATE USER 'replication-slave' IDENTIFIED BY 'secret';
GRANT REPLICATION SLAVE ON *.* TO 'replication-slave';
FLUSH PRIVILEGES;

Sur le slave

Déclarer le master.

Attention à changer MASTER_HOST='192.168.0.21' par l'ip de votre machine.

STOP SLAVE ;
CHANGE MASTER TO MASTER_LOG_POS=<XXX>, MASTER_HOST='192.168.0.21', MASTER_PORT=3308, MASTER_USER='replication-slave', MASTER_PASSWORD='secret';
START SLAVE ;

db-slave_1 [Warning] Neither –relay-log nor –relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '–log-basename=#' or '–relay-log=mysqld-relay-bin' to avoid this problem.

Documentation

  • syntaxe CHANGE MASTER
    • notamment pour MASTER_CONNECT_RETRY, MASTER_RETRY_COUNT

MASTER_USE_GTID=slave_pos;

It's time to play

CREATE DATABASE test ;
CREATE TABLE test.foo (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
informatique/sgbd/mysql/replication.txt · Dernière modification : 21/01/2022 10:09 de cyrille

Sauf mention contraire, le contenu de ce wiki est placé sous les termes de la licence suivante : CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki