Réplication maître-esclave MySQL (4) - La construction de l'architecture de réplication en cascade
Les capacités de réplication de MySQL sont à la base de la création de grandes applications hautes performances. Distribuez les données MySQL sur plusieurs systèmes. Ce mécanisme de distribution est réalisé en copiant les données d'un certain maître MySQL (maître) vers d'autres maîtres (esclaves) et en l'exécutant à nouveau. Pendant le processus de réplication, un serveur agit en tant que serveur maître et un ou plusieurs autres serveurs agissent en tant que serveurs esclaves.
Premièrement, l'architecture de réplication maître-esclave couramment utilisée par MySQL
L'architecture de réplication doit suivre les principes de base suivants:
(1) Chaque esclave ne peut avoir qu'un seul maître;
(2) Chaque esclave a un ID serveur unique (server-id);
(3) Chaque maître peut en avoir un ou De nombreux esclaves;
(4) En définissant log_slave_updates, un esclave peut devenir le maître d'autres esclaves.
L'architecture de réplication maître-esclave couramment utilisée de MySQL est la suivante:
1. Un maître et un esclave ou un maître et plusieurs esclaves
Une architecture de réplication maître-esclave est un système de réplication composé d'un maître et d'un esclave. L'architecture de réplication mono-maître-multi-esclave est composée d'un maître et de plusieurs esclaves.Les esclaves ne communiquent pas entre eux, mais ne peuvent communiquer qu'avec le maître. Dans les scénarios d'application réels, plus de 90% de la réplication MySQL est un modèle d'architecture dans lequel un maître réplique vers un ou plusieurs esclaves, ce qui est principalement utilisé pour les applications avec une pression de lecture élevée. L'architecture de réplication multi-esclave à un seul maître est illustrée dans la figure suivante:
Cette structure convient à moins d'opérations d'écriture et à de nombreuses opérations de lecture. L'opération de lecture peut être distribuée à d'autres esclaves, réduisant ainsi la pression sur le maître. Cependant, lorsque l'esclave augmente jusqu'à un certain nombre, la charge de l'esclave sur le maître et la bande passante du réseau deviendront le goulot d'étranglement.
Les avantages de cette structure sont: simple, flexible et capable de répondre aux besoins de la plupart des applications.
2. Réplication maître maître (maître-maître)
Les deux serveurs de l'architecture de réplication maître-maître sont à la fois le maître et l'esclave de l'autre serveur. De cette manière, les modifications apportées par l'une ou l'autre des parties seront répliquées dans la base de données de l'autre partie. L'architecture de réplication maître-maître est illustrée dans la figure suivante:
Le plus gros problème avec l'architecture de réplication maître-maître est les conflits de mise à jour. En supposant qu'une table n'a qu'une seule ligne et une seule colonne de données, sa valeur est 1. Si deux serveurs exécutent les instructions suivantes
en même temps: exécutez sur le premier serveur:
mysql> UPDATE tbl SET col = col + 1;
exécutez sur le deuxième serveur :
Mysql> UPDATE tbl SET col = col * 2;
Alors quel est le résultat? Un serveur est 4 et l'autre serveur est 3. Cependant, cela ne produit pas d'erreur.
3. Architecture de réplication en cascade (maître-esclaves-esclaves)
Dans certains scénarios d'application, la pression de lecture et d'écriture peut être très différente et la pression de lecture est particulièrement élevée Un maître peut avoir besoin de 10 esclaves ou plus pour supporter la pression de lecture. À ce stade, le maître sera plus fatigant, car il y a plus de threads d'E / S esclaves connectés uniquement, donc lorsque la pression d'écriture est légèrement supérieure, le maître consommera plus de ressources en raison de la réplication, ce qui peut facilement entraîner des retards de réplication. Temps.
Dans ce cas, nous pouvons utiliser MySQL pour enregistrer les informations du journal binaire des modifications générées par la réplication côté esclave, c'est-à-dire activer l'option log-slave-update. Ensuite, la réplication secondaire est utilisée pour réduire la pression du côté maître due à la réplication. L'architecture de réplication en cascade est illustrée dans la figure suivante:
4. Master-Master avec esclaves avec serveur esclave
L'architecture de réplication maître-maître avec des serveurs esclaves est illustrée dans la figure ci-dessous:
Deuxièmement, la construction d'une architecture de réplication en cascade
1. Environnement système
Version de MySQL: MySQL5.7
Version Linux: CentOS7.0
Adresse principale: 192.168.1.11
L'adresse de la base de données esclave (esclave, qui sert de maître de 13): 192.168.1.12
Adresse esclave: 192.168.1.13
2. La construction maître-esclave entre 192.168.1.11 et 192.168.1.12
Voir l'article précédent: Réplication maître-esclave MySQL (2) - la construction d'une architecture maître-esclave (https://blog.csdn.net/weixin_44377973/article/details/107136733).
3. Construction maître-esclave entre 192.168.1.12 et 192.168.1.13
1. Configurez le serveur 192.168.1.12
(1) Ajoutez le contenu suivant dans le fichier de configuration
[mysqld]
log-bin=mysql-bin
logbin_format=mixed
#### 把relay log中的记录写入binlog日志
log_slave_updates=1
(2) Créer un utilisateur de copie
mysql> grant replication slave on *.* to 'repl'@'192.168.1.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> select host,user,authentication_string from mysql.user;
+-------------+---------------+-------------------------------------------+
| host | user | authentication_string |
+-------------+---------------+-------------------------------------------+
| localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| % | wgx | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 192.168.1.% | repl | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-------------+---------------+-------------------------------------------+
5 rows in set (0.02 sec)
(3) Exportez les données dans la base de données et enregistrez le fichier journal et l'emplacement
Étape 1. Avant d'exporter la base de données, verrouillez la base de données pour empêcher toute opération d'écriture dans la base de données.
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)
mysql> use hist;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> drop table t1;
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock
étape2, exportez toutes les données de la base de données dans la bibliothèque principale
[root@Mysql11 ~]# mysqldump -uroot -p123456 --all-databases --master-data=2 --events > /tmp/all_bak.sql
Étape 3, copiez les données de sauvegarde de la base de données maître dans la base de données esclave
[root@Mysql11 ~]# scp /tmp/all_bak.sql 192.168.1.13:/tmp/
[email protected]'s password:
all_bak.sql 100% 834KB 833.7KB/s 00:00
[root@Mysql11 ~]#
step4, déverrouiller, afficher les informations du journal binaire
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 866214 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2. Configurez le serveur 192.168.1.13
(1) Ajoutez le contenu suivant dans le fichier de configuration
[mysqld]
server-id=3
relay-log = mysql-relay-log
(2) Une fois la configuration terminée, redémarrez le service mysql et vérifiez les informations du fichier journal de relais:
[root@localhost ~]# ll /var/lib/mysql/mysql-relay*
-rw-r-----. 1 mysql mysql 207 7月 5 21:31 /var/lib/mysql/mysql-relay-log.000001
-rw-r-----. 1 mysql mysql 320 7月 5 21:31 /var/lib/mysql/mysql-relay-log.000002
-rw-r-----. 1 mysql mysql 76 7月 5 21:31 /var/lib/mysql/mysql-relay-log.index
(3) Importez les données sur le serveur principal
[root@localhost ~]# mysql -uroot -p123456 < /tmp/all_bak.sql
(4) Configurer les paramètres de synchronisation maître-esclave
Exécutez les commandes suivantes sur le serveur esclave:
change master to
master_host='192.168.1.12',
master_port=3306,
master_user='repl',
master_password='123456',
master_log_file='mysql-bin.000005',
master_log_pos=866214;
(5) Ouvrez le service depuis la bibliothèque (démarrez les threads IO et SQL)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
(6) Afficher l'état de la réplication maître-esclave
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.12
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 866214
Relay_Log_File: mysql-relay-log.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 866214
Relay_Log_Space: 527
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 2
Master_UUID: 800e4f85-2e00-11ea-a7ce-000c29cd5d3e
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
Quatrièmement, testez l'état de fonctionnement de la réplication maître-esclave
1. Créez une base de données sur le serveur 192.168.1.11, ajoutez une table et entrez des données
mysql> create database mydb;
Query OK, 1 row affected (0.04 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hist |
| mydb |
| mysql |
| performance_schema |
| sys |
| wanggx |
+--------------------+
7 rows in set (0.00 sec)
mysql> use mydb;
Database changed
mysql> create table goods(id int primary key auto_increment,name char(20));
Query OK, 0 rows affected (0.28 sec)
mysql> insert into goods(name) values('mobile');
Query OK, 1 row affected (0.09 sec)
mysql> insert into goods(name) values('computer');
Query OK, 1 row affected (0.03 sec)
mysql>
mysql> select * from goods;
+----+----------+
| id | name |
+----+----------+
| 1 | mobile |
| 2 | computer |
+----+----------+
2 rows in set (0.00 sec)
2. Affichez les données de la bibliothèque esclave 192.168.1.12
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hist |
| mydb |
| mysql |
| performance_schema |
| sys |
| wanggx |
+--------------------+
7 rows in set (0.00 sec)
mysql>
mysql> use mydb;
Database changed
mysql> select * from goods;
+----+----------+
| id | name |
+----+----------+
| 1 | mobile |
| 2 | computer |
+----+----------+
2 rows in set (0.00 sec)
3. Afficher les données de la bibliothèque esclave 192.168.1.13
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hist |
| mydb |
| mysql |
| performance_schema |
| sys |
| wanggx |
+--------------------+
7 rows in set (0.00 sec)
mysql> use mydb;
Database changed
mysql> select * from goods;
+----+----------+
| id | name |
+----+----------+
| 1 | mobile |
| 2 | computer |
+----+----------+
2 rows in set (0.00 sec)
4. Supprimez mydb sur 192.168.1.11
mysql> drop database mydb;
Query OK, 1 row affected (0.58 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hist |
| mysql |
| performance_schema |
| sys |
| wanggx |
+--------------------+
6 rows in set (0.00 sec)
5. Affichez les données sur 192.168.1.12
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hist |
| mysql |
| performance_schema |
| sys |
| wanggx |
+--------------------+
6 rows in set (0.00 sec)
6. Affichez les données sur 192.168.1.13
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hist |
| mysql |
| performance_schema |
| sys |
| wanggx |
+--------------------+
6 rows in set (0.00 sec)