Table des matières
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.
- mariadb.com/kb
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
- MySql 8
- MariaDB
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);