MySQL/Réplication
Principe.
La signifie que les données écrites sur le master MySQL sont envoyées à des slaves faisant office de copies.
Applications :
Il y a deux types de réplication :
Configurations des réplications :
En Master-Master les deux hôtes sont tour à tour master et slave : le serveur A se réplique sur le serveur B qui se réplique sur le serveur A. 
Il n'y a pas de vérification de consistance des données, même si codice_1 est configuré les deux serveurs ne doivent pas être utilisés pour des accès concurrents.
Réplication asynchrone.
C'est le cas le plus simple, un master écrit un fichier de log binaire, et les slaves peuvent lire ce dernier (potentiellement sélectivement) pour rejouer les commandes de la requête.
Étant asynchrone, le master et les slaves peuvent avoir différents états au même moment. Cette configuration peut résister aux coupures réseau.
Configuration du master.
Dans codice_2, section codice_3 :
 server-id = 1
 log-bin
 # ou log-bin = /var/log/mysql/mysql-bin.log
Créer un nouvel utilisateur pour que le slave puisse se connecter :
 CREATE USER 'myreplication';
 SET PASSWORD FOR 'myreplication' = PASSWORD('mypass');
 GRANT REPLICATION SLAVE ON *.* to 'myreplication';
Vérifier l'identifiant de serveur :
 SHOW VARIABLES LIKE 'server_id';
Configuration de chaque slave.
Dans codice_2, section codice_3 :
 server-id = 2
 SHOW VARIABLES LIKE 'server_id';
 report-host=slave1
Déclarer le master :
 CHANGE MASTER TO MASTER_HOST='master_addr', MASTER_USER='myreplication', MASTER_PASSWORD='mypass';
Si la réplication sert de backup, spécifier le point de départ :
 MASTER_LOG_FILE='<binary_log_from_master>', MASTER_LOG_POS=<master_binary_log_position>; 
Démarrer la réplication :
 START SLAVE;
Cela va créer un fichier codice_8, typiquement dans codice_9 ; contenant la configuration et le statut.
Vérifier la réplication.
Sur le slave.
 SHOW SLAVE STATUS;
Ou bien pour avoir un résultat formaté plus lisible :
 SHOW SLAVE STATUS\G
Exemple :
 *************************** 1. row ***************************
 Slave_IO_State: 
 Master_Host: master_addr
 Master_User: myreplication
 Master_Port: 3306
Vérifier en particulier :
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
On peut supposer une nature réplication asynchrone :
 Seconds_Behind_Master: 0
Voir aussi :
 mysql> SHOW GLOBAL VARIABLES LIKE "%SLAVE%";
Sur le master.
Vérifier les connexions des slaves :
 mysql> SHOW PROCESSLIST\G
 *************************** 6. row ***************************
 Id: 14485
 User: myreplication
 Host: 10.1.0.106:33744
 db: NULL
 Command: Binlog Dump
 Time: 31272
 State: Has sent all binlog to slave; waiting for binlog to be updated
 Info: NULL
If you enabled codice_10, the slave is also visible in:
 mysql> SHOW SLAVE HOSTS;
 | Server_id | Host | Port | Rpl_recovery_rank | Master_id |
 | 2 | myslave | 3306 | 0 | 1 | 
 1 row in set (0.00 sec)
Consistance.
La réplication est une simple copie, similaire aux sorties codice_11 dans le client codice_12.
par conséquent, pour maintenir cette consistance :
Réparer.
Par défaut, la réplication stoppe en cas d'erreur (provenant du réseau ou d'une requête).
Dans ce cas, regarder la trace dans le log (généralement codice_13) :
 Oct 15 21:11:19 builder mysqld[4266]: 101015 21:11:19 [ERROR] Slave: Error 'Table 'mybase.form'
 doesn't exist' on query. Default database: 'mybase'. Query:
 'INSERT INTO `form` (`form_id`,`timestamp`,`user_id`) VALUES ('abed',1287172429,0)',
 Error_code: 1146
La meilleure façon et de relancer la réplication entièrement.
On peut aussi tenter de réparer, par exemple faire sauter à MySQL la commande codice_4 :
 STOP SLAVE;
 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
 START SLAVE;
Attention en définissant ce nombre car il contient toutes les commandes, pas seulement les erreurs.
Une autre façon est d'utiliser les outils : 
Désinstaller.
Pour supprimer une réplication :
 mysql> RESET SLAVE;
Attention : codice_18 arrêt la réplication. Elle peut être relancée manuellement ensuite, ou bien automatiquement lors de la relance du serveur MySQL. Pour éviter ce lancement automatique :
 slave-skip-start 
Pour arrêter d'utiliser la réplication, vérifier que la configuration est bien vide :
 mysql> SHOW SLAVE STATUS;
 Empty set (0.00 sec)
Hints SQL.
Avant chaque requête, des indications concernant la réplication peuvent être placées en commentaire. Par exemple via le plugin Mysqlnd de PHP.
Tables fédérées.
Sur MySQL 8 et sur MariaDB depuis la version 10.0, une alternative à la réplication et au clustering existe. Il s'agit du moteur de stockage "", qui permet de créer une table sur un serveur qui se synchronisent avec la même sur un autre.
CREATE TABLE `ma_table_federee` (
 `id` int(10) UNSIGNED NOT NULL
) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci CONNECTION='mysql://mon_login:mon_mot_de_passe@ip_du_serveur:3306/ma_base/ma_table';
CREATE SERVER.
Pour éviter de définir le mot de passe du serveur distant dans la requête SQL, on peut utiliser :
CREATE SERVER mon_serveur
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'mon_login', PASSWORD 'mon_mot_de_passe', HOST 'mon_serveur', PORT 3306, DATABASE 'ma_base');
CREATE TABLE `ma_table_federee` (
 `id` int(10) UNSIGNED NOT NULL
) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci CONNECTION='mon_serveur/ma_table';
Ces serveurs sont stockés dans :
select * from mysql.servers;
Pour en supprimer un :
DROP SERVER mon_serveur;
Partitionnement.
Pour optimiser les performances, il est possible de découper les tables en plusieurs partitions selon une clé définie lors de la création de la table.
En MySQL, il existe :