Maison > base de données > tutoriel mysql > le corps du texte

Explication détaillée du principe de réplication et configuration de l'architecture maître-esclave Mysql haute performance

coldplay.xixi
Libérer: 2021-02-11 09:59:24
avant
3594 Les gens l'ont consulté

Explication détaillée du principe de réplication et configuration de l'architecture maître-esclave Mysql haute performance

Recommandations d'apprentissage gratuites : tutoriel vidéo mysql

1 Présentation de la réplication


La fonctionnalité de réplication intégrée de Mysql constitue 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 obtenu en copiant les données d'un certain hôte Mysql sur d'autres hôtes (esclaves) et en l'exécutant à nouveau. Lors de la réplication, un serveur fait office de serveur maître et un ou plusieurs autres serveurs agissent comme serveurs esclaves. Le serveur maître écrit des mises à jour dans les fichiers journaux binaires et gère un index des fichiers pour suivre la rotation des journaux. Ces journaux enregistrent les mises à jour envoyées aux serveurs esclaves. Lorsqu'un esclave se connecte au maître, il informe le maître de l'emplacement de la dernière mise à jour réussie lue par l'esclave dans le journal. L'esclave reçoit toutes les mises à jour survenues depuis, puis bloque et attend que le maître soit informé des nouvelles mises à jour.

Veuillez noter que lorsque vous répliquez, toutes les mises à jour des tables en réplication doivent être effectuées sur le serveur maître. Sinon, vous devez veiller à éviter les conflits entre les mises à jour utilisateur des tables sur le serveur maître et les mises à jour des tables sur le serveur esclave.

1.1 Types de réplication pris en charge par mysql :

(1) : Réplication basée sur les instructions : les instructions SQL exécutées sur le serveur maître sont exécutées sur l'instruction du serveur esclave. MySQL utilise par défaut la réplication basée sur les instructions, ce qui est relativement efficace.
Une fois qu'il s'avère que la copie exacte n'est pas possible, la copie par ligne sera automatiquement sélectionnée.
(2) : Réplication basée sur les lignes : copiez le contenu modifié au lieu d'exécuter la commande sur le serveur esclave Pris en charge à partir de mysql5.0
(3) : Réplication de type mixte : utilisée par défaut Réplication basée sur les instructions. , une fois qu'il s'avère que la réplication basée sur les instructions ne peut pas être précise, la réplication basée sur les lignes sera utilisée.

1.2. Problèmes résolus par la réplication

La technologie de réplication MySQL présente les caractéristiques suivantes :
(1) Distribution des données (Distribution des données)
(2) Équilibrage de charge
(3) Sauvegardes
(4) Haute disponibilité et basculement

1.3 Fonctionnement de la réplication

Dans l'ensemble, la réplication comporte trois étapes :

(1) Le maître enregistre les modifications dans le journal binaire (ces enregistrements sont appelés événements du journal binaire)
(2) L'esclave copie les événements du journal binaire du maître dans son journal de relais ;

(3) L'esclave refait les événements dans le journal du relais, et les modifications reflètent ses propres données.

La figure suivante décrit le processus de copie :

                                     

La première partie du processus consiste pour le maître à enregistrer le journal binaire. Avant que chaque transaction termine la mise à jour des données, le maître enregistre ces modifications dans le journal secondaire. MySQL écrit les transactions en série dans le journal binaire, même si les instructions de la transaction sont entrelacées. Une fois l'événement écrit dans le journal binaire, le maître demande au moteur de stockage de valider la transaction.
L'étape suivante consiste pour l'esclave à copier le journal binaire du maître dans son propre journal de relais. Tout d'abord, l'esclave démarre un thread de travail, le thread d'E/S. Le thread d'E/S ouvre une connexion normale sur le maître, puis démarre le processus de vidage du journal binaire. Le processus de vidage Binlog lit les événements dans le journal binaire du maître, s'il a rattrapé le maître, il se met en veille et attend que le maître génère de nouveaux événements. Le thread d'E/S écrit ces événements dans le journal de relais.
Le thread esclave SQL (SQL slave thread) gère la dernière étape du processus. Le thread SQL lit les événements du journal du relais et relit les événements pour mettre à jour les données de l'esclave afin de les rendre cohérentes avec les données du maître. Tant que le thread est cohérent avec le thread d'E/S, le journal de relais sera généralement dans le cache du système d'exploitation, donc la surcharge du journal de relais est très faible.
De plus, il existe également un thread de travail dans le maître : comme les autres connexions MySQL, l'ouverture d'une connexion dans le maître par l'esclave entraînera également le démarrage d'un thread par le maître. Le processus de réplication présente une limitation importante : la réplication est sérialisée sur l'esclave, ce qui signifie que les opérations de mise à jour parallèles sur le maître ne peuvent pas être effectuées en parallèle sur l'esclave.

2. Configuration de réplication maître-esclave


Il existe deux serveurs de base de données MySQL, maître et esclave. Le maître est le serveur maître et l'esclave est le serveur esclave. Dans l'état initial, les informations de données du maître et de l'esclave sont les mêmes. Lorsque les données du maître changent, l'esclave change également en conséquence, de sorte que les informations de données du maître et de l'esclave soient synchronisées pour atteindre l'objectif de. sauvegarde.

Points clés :
Le support chargé de transmettre les différentes actions de modification entre les serveurs maître et esclave est le journal des modifications binaires du serveur maître. Ce journal enregistre les différentes actions de modification qui doivent être transmises au serveur maître. serveur esclave. Par conséquent, le serveur maître doit activer la fonctionnalité de journalisation binaire. Le serveur esclave doit disposer des autorisations suffisantes pour se connecter au serveur maître et demander au serveur maître de lui transférer le journal des modifications binaires.
 
Environnement :
Les versions de la base de données MySQL du maître et de l'esclave sont toutes deux 5.0.18
Adresse IP : 10.100.0.100

2.1. Créer un compte de copie

1. Créez un compte de sauvegarde dans la base de données du maître : chaque esclave utilise un nom d'utilisateur et un mot de passe MySQL standard pour se connecter au maître. L'utilisateur effectuant l'opération de réplication se verra accorder l'autorisation REPLICATION SLAVE. Le nom d'utilisateur et le mot de passe seront stockés dans le fichier texte master.info

La commande est la suivante :

mysql > GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO backup@’10.100.0.200’ IDENTIFIED BY ‘1234’;
Copier après la connexion

Créez une sauvegarde de compte et autorisez uniquement l'accès depuis le adresse 10.100.0.200 Venez vous connecter, le mot de passe est 1234.

(Si les nouveaux et anciens algorithmes de mot de passe de la version MySQL sont différents, vous pouvez définir : définir le mot de passe pour 'backup'@'10.100.0.200'=old_password('1234'))

2.2, Copier les données

(Si vous installez complètement le serveur maître-esclave mysql, cette étape n'est pas nécessaire. Parce que le maître et l'esclave nouvellement installés ont les mêmes données)

Arrêtez le serveur maître, copiez les données du maître sur le serveur B pour synchroniser les données du maître et de l'esclave, et assurez-vous que les opérations d'écriture sont interdites dans les serveurs maître et esclave avant que toutes les opérations de configuration ne soient terminées, donc que les données des deux bases de données doivent être identiques !

2.3. Configurer le maître

Ensuite, configurez le maître, notamment en ouvrant le journal binaire et en spécifiant l'ID de serveur unique. Par exemple, ajoutez la valeur suivante au fichier de configuration :

server-id=1log-bin=mysql-binserver-id:为主服务器A的ID值log-bin:二进制变更日值
Copier après la connexion

Redémarrez le maître et exécutez SHOW MASTER STATUS. Le résultat est le suivant :

Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance

<.>

2.4. Configurer l'esclave

La configuration de l'esclave est similaire à celle du maître. Vous devez également redémarrer le MySQL de l'esclave. Comme suit :

log_bin           = mysql-binserver_id         = 2relay_log         = mysql-relay-binlog_slave_updates = 1read_only         = 1
Copier après la connexion
server_id : est obligatoire et unique.

log_bin : Il n'est pas nécessaire que l'esclave active le journal binaire bin_log, mais dans certains cas, il doit être défini. Par exemple, si l'esclave est le maître d'un autre esclave, bin_log doit être défini. Ici, nous activons la journalisation binaire et affichons le nom (le nom par défaut est le nom d'hôte, mais des problèmes surviendront si le nom d'hôte est modifié).

relay_log : configurez le journal du relais, log_slave_updates signifie que l'esclave écrit les événements de réplication dans son propre journal binaire (vous verrez son utilisation plus tard).
Certaines personnes activent le journal binaire de l'esclave mais ne définissent pas log_slave_updates, puis vérifient si les données de l'esclave ont changé. Il s'agit d'une mauvaise configuration.

read_only : essayez d'utiliser read_only, qui empêche la modification des données (sauf pour les threads spéciaux). Cependant, read_only n'est pas très pratique, notamment pour les applications qui ont besoin de créer des tables sur l'esclave.

2.5. Démarrer l'esclave

接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:

mysql> CHANGE MASTER TO MASTER_HOST='server1',    -> MASTER_USER='repl',    -> MASTER_PASSWORD='p4ssword',    -> MASTER_LOG_FILE='mysql-bin.000001',    -> MASTER_LOG_POS=0;
Copier après la connexion

MASTER_LOG_POS的值为0,因为它是日志的开始位置。

你可以用SHOW SLAVE STATUS语句查看slave的设置是否正确:

mysql> SHOW SLAVE STATUS\G*************************** 1. row ***************************             Slave_IO_State:                Master_Host: server1                Master_User: repl                Master_Port: 3306              Connect_Retry: 60            Master_Log_File: mysql-bin.000001        Read_Master_Log_Pos: 4             Relay_Log_File: mysql-relay-bin.000001              Relay_Log_Pos: 4      Relay_Master_Log_File: mysql-bin.000001           Slave_IO_Running: No          Slave_SQL_Running: No                             ...omitted...      Seconds_Behind_Master: NULLSlave_IO_State, Slave_IO_Running, 和Slave_SQL_Running是No
Copier après la connexion

表明slave还没有开始复制过程。日志的位置为4而不是0,这是因为0只是日志文件的开始位置,并不是日志位置。实际上,MySQL知道的第一个事件的位置是4。

为了开始复制,你可以运行:

mysql> START SLAVE;运行SHOW SLAVE STATUS查看输出结果:mysql> SHOW SLAVE STATUS\G*************************** 1. row ***************************             Slave_IO_State: Waiting for master to send event                Master_Host: server1                Master_User: repl                Master_Port: 3306              Connect_Retry: 60            Master_Log_File: mysql-bin.000001        Read_Master_Log_Pos: 164             Relay_Log_File: mysql-relay-bin.000001              Relay_Log_Pos: 164      Relay_Master_Log_File: mysql-bin.000001           Slave_IO_Running: Yes          Slave_SQL_Running: Yes                             ...omitted...      Seconds_Behind_Master: 0
Copier après la connexion

在这里主要是看:

                   Slave_IO_Running=Yes                   Slave_SQL_Running=Yes
Copier après la connexion

 

slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。

你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:

在master上输入show processlist\G;

mysql> show processlist \G

*************************** 1. row ***************************

     Id: 1

   User: root

   Host: localhost:2096

     db: test

Command: Query

   Time: 0

 State: NULL

   Info: show processlist

*************************** 2. row ***************************

     Id: 2

   User: repl

   Host: localhost:2144

     db: NULL

Command: Binlog Dump

   Time: 1838

 State: Has sent all binlog to slave; waiting for binlog to be updated

   Info: NULL

2 rows in set (0.00 sec)

 

行2为处理slave的I/O线程的连接。

在slave服务器上运行该语句:

mysql> show processlist \G

*************************** 1. row ***************************

     Id: 1

   User: system user

   Host:

     db: NULL

Command: Connect

   Time: 2291

 State: Waiting for master to send event

   Info: NULL

*************************** 2. row ***************************

     Id: 2

   User: system user

   Host:

     db: NULL

Command: Connect

   Time: 1852

 State: Has read all relay log; waiting for the slave I/O thread to update it

   Info: NULL

*************************** 3. row ***************************

     Id: 5

   User: root

   Host: localhost:2152

     db: test

Command: Query

   Time: 0

 State: NULL

   Info: show processlist

3 rows in set (0.00 sec)


行1为I/O线程状态,行2为SQL线程状态。

2.5、添加新slave服务器

假如master已经运行很久了,想对新安装的slave进行数据同步,甚至它没有master的数据。
此时,有几种方法可以使slave从另一个服务开始,例如,从master拷贝数据,从另一个slave克隆,从最近的备份开始一个slave。Slave与master同步时,需要三样东西:
(1)master的某个时刻的数据快照;
(2)master当前的日志文件、以及生成快照时的字节偏移。这两个值可以叫做日志文件坐标(log file coordinate),因为它们确定了一个二进制日志的位置,你可以用SHOW MASTER STATUS命令找到日志文件的坐标;
(3)master的二进制日志文件。

可以通过以下几中方法来克隆一个slave:
(1)    冷拷贝(cold copy)
停止master,将master的文件拷贝到slave;然后重启master。缺点很明显。
(2)    热拷贝(warm copy)
如果你仅使用MyISAM表,你可以使用mysqlhotcopy拷贝,即使服务器正在运行。
(3)    使用mysqldump
使用mysqldump来得到一个数据快照可分为以下几步:
锁表:如果你还没有锁表,你应该对表加锁,防止其它连接修改数据库,否则,你得到的数据可以是不一致的。如下:
mysql> FLUSH TABLES WITH READ LOCK;
在另一个连接用mysqldump创建一个你想进行复制的数据库的转储:
shell> mysqldump --all-databases --lock-all-tables >dbdump.db
对表释放锁。
mysql> UNLOCK TABLES;

 

3、深入了解复制


已经讨论了关于复制的一些基本东西,下面深入讨论一下复制。

3.1、基于语句的复制(Statement-Based Replication)

     MySQL 5.0及之前的版本仅支持基于语句的复制(也叫做逻辑复制,logical replication),这在数据库并不常见。master记录下改变数据的查询,然后,slave从中继日志中读取事件,并执行它,这些SQL语句与master执行的语句一样。
这种方式的优点就是实现简单。此外,基于语句的复制的二进制日志可以很好的进行压缩,而且日志的数据量也较小,占用带宽少——例如,一个更新GB的数据的查询仅需要几十个字节的二进制日志。而mysqlbinlog对于基于语句的日志处理十分方便。
 
      但是,基于语句的复制并不是像它看起来那么简单,因为一些查询语句依赖于master的特定条件,例如,master与slave可能有不同的时间。所以,MySQL的二进制日志的格式不仅仅是查询语句,还包括一些元数据信息,例如,当前的时间戳。即使如此,还是有一些语句,比如,CURRENT USER函数,不能正确的进行复制。此外,存储过程和触发器也是一个问题。
     另外一个问题就是基于语句的复制必须是串行化的。这要求大量特殊的代码,配置,例如InnoDB的next-key锁等。并不是所有的存储引擎都支持基于语句的复制。

3.2、基于记录的复制(Row-Based Replication)

      MySQL增加基于记录的复制,在二进制日志中记录下实际数据的改变,这与其它一些DBMS的实现方式类似。这种方式有优点,也有缺点。优点就是可以对任何语句都能正确工作,一些语句的效率更高。主要的缺点就是二进制日志可能会很大,而且不直观,所以,你不能使用mysqlbinlog来查看二进制日志。
对于一些语句,基于记录的复制能够更有效的工作,如:

mysql> INSERT INTO summary_table(col1, col2, sum_col3)    -> SELECT col1, col2, sum(col3)    -> FROM enormous_table    -> GROUP BY col1, col2;
Copier après la connexion

     假设,只有三种唯一的col1和col2的组合,但是,该查询会扫描原表的许多行,却仅返回三条记录。此时,基于记录的复制效率更高。
    另一方面,下面的语句,基于语句的复制更有效:
 mysql> UPDATE enormous_table SET col1 = 0;
此时使用基于记录的复制代价会非常高。由于两种方式不能对所有情况都能很好的处理,所以,MySQL 5.1支持在基于语句的复制和基于记录的复制之前动态交换。你可以通过设置session变量binlog_format来进行控制。

3.3、复制相关的文件

除了二进制日志和中继日志文件外,还有其它一些与复制相关的文件。如下:

(1)mysql-bin.index

Une fois que le serveur active le journal binaire, il générera un fichier portant le même nom que le deuxième fichier journal mais se terminant par .index. Il est utilisé pour suivre quels fichiers journaux binaires sont présents sur le disque. MySQL l'utilise pour localiser les fichiers journaux binaires. Son contenu est le suivant (sur ma machine) :
Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance

(2)mysql-relay-bin.index

La fonction de ce fichier est similaire à mysql-bin .index , mais c'est pour les journaux de relais, pas pour les journaux binaires. Le contenu est le suivant :
.mysql-02-relay-bin.000017
.mysql-02-relay-bin.000018

(3)master.info

Enregistrez les informations associées du maître. Ne le supprimez pas, sinon l'esclave ne pourra pas se connecter au maître après le redémarrage. Le contenu est le suivant (sur ma machine) :

Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance

Le thread I/O met à jour le fichier master.info, le contenu est le suivant ( sur ma machine) :

tr>

.mysql-02-relay-bin.000019

254

mysql-01-bin.000010

286

0

52813

.mysql-02 -relay-bin.000019 254mysql-01-bin.000010286052813


(4)relay-log.info

contient des informations sur le journal binaire actuel et le journal de relais dans l'esclave.

3.4. Envoyer des événements de réplication à d'autres esclaves

Lors de la configuration de log_slave_updates, vous pouvez laisser l'esclave agir en tant que maître des autres esclaves. A ce moment, l'esclave écrit les événements exécutés par le thread SQL dans son propre journal binaire. Son esclave peut ensuite obtenir ces événements et les exécuter. Comme suit :
Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance

3.5. Filtres de réplication

Le filtrage de réplication permet de copier seulement une partie des données dans le serveur. Il existe deux types de filtres de réplication : sur le serveur. maître Filtrer les événements dans le journal binaire ; filtrer les événements dans le journal du relais sur l'esclave. Comme suit :

Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance

4. Topologies couramment utilisées pour la réplication


Les architectures répliquées sont Les principes de base suivants :
(1) Chaque esclave ne peut avoir qu'un seul maître
(2) Chaque esclave ne peut avoir qu'un seul identifiant de serveur unique
(3) Chaque maître peut avoir plusieurs esclaves (4) Si vous définissez log_slave_updates, l'esclave peut être le maître des autres esclaves, diffusant ainsi les mises à jour du maître.

MySQL ne prend pas en charge la réplication multi-maître (Multimaster Replication) - c'est-à-dire qu'un esclave peut avoir plusieurs maîtres. Cependant, avec quelques combinaisons simples, nous pouvons construire une architecture de réplication flexible et puissante.

4.1. Un seul maître et plusieurs esclaves

Le cas le plus simple est un système de réplication composé d'un maître et d'un esclave. Les esclaves ne communiquent pas entre eux et 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 architectural dans lequel un maître réplique vers un ou plusieurs esclaves. Il est principalement utilisé comme solution d'extension bon marché du côté de la base de données pour les applications à haut niveau de performance. lire la pression. Car tant que la pression sur le Maître et l'Esclave n'est pas trop forte (notamment la pression côté Esclave), le délai de réplication asynchrone est généralement très faible. D'autant plus que la méthode de réplication côté esclave a été modifiée pour un traitement à deux threads, le problème de délai côté esclave a été réduit. L'avantage est que pour les applications qui n'ont pas d'exigences particulièrement critiques en matière de données en temps réel, il vous suffit d'augmenter le nombre d'esclaves via un serveur PC bon marché et de répartir la pression de lecture sur plusieurs machines esclaves. Vous pouvez disperser la pression de lecture sur un seul serveur de base de données. est utilisé pour résoudre le goulot d'étranglement des performances de lecture du côté de la base de données. Après tout, la pression de lecture dans la plupart des systèmes d'application de base de données est toujours bien supérieure à la pression d'écriture. Cela a largement résolu le problème actuel de goulot d'étranglement de la pression des bases de données sur de nombreux sites Web de petite et moyenne taille, et même certains grands sites Web utilisent des solutions similaires pour résoudre les goulots d'étranglement des bases de données.

est la suivante :


Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance S'il y a peu d'opérations d'écriture et des opérations de lecture fréquentes, cette structure peut être adoptée. Vous pouvez distribuer les opérations de lecture à d'autres esclaves pour réduire la pression sur le maître. Cependant, lorsque le nombre d'esclaves augmente jusqu'à un certain nombre, la charge des esclaves sur le maître et la bande passante du réseau deviennent un problème sérieux.
Bien que cette structure soit simple, elle est très flexible et peut répondre à la plupart des besoins des applications. Quelques suggestions :
(1) Différents esclaves jouent différents rôles (comme l'utilisation de différents index ou de différents moteurs de stockage
(2) Utilisez un esclave comme maître de sauvegarde et effectuez uniquement la réplication ;
(3) ; ) Utilisez un esclave distant pour la reprise après sinistre ;

Tout le monde doit être relativement clair sur le fait que plusieurs nœuds esclaves peuvent être copiés à partir d'un nœud maître. Certaines personnes peuvent se demander si ce nœud esclave peut être copié à partir de plusieurs nœuds maîtres. des nœuds ? Au moins pour l'instant, MySQL ne peut pas le faire, et il n'est pas clair s'il sera pris en charge à l'avenir.

MySQL ne prend pas en charge une architecture dans laquelle un nœud esclave se réplique à partir de plusieurs nœuds maîtres. Ceci vise principalement à éviter les problèmes de conflit et à éviter les conflits de données entre plusieurs sources de données, entraînant une incohérence dans les données finales. Cependant, j'ai entendu dire que quelqu'un avait développé un correctif connexe pour permettre à MySQL de prendre en charge la réplication d'un nœud esclave à partir de plusieurs nœuds maîtres en tant que sources de données. C'est également l'avantage de la nature open source de MySQL.

4.2. Maître-Maître en Mode Actif-Actif (Maître-Maître en Mode Actif-Actif)

Deux serveurs répliqués par Maître- Master , à la fois le maître et l'esclave d'un autre serveur. De cette manière, les modifications apportées par l'une ou l'autre partie seront appliquées à la base de données de l'autre partie via la réplication.

可能有些读者朋友会有一个担心,这样搭建复制环境之后,难道不会造成两台MySQL之间的循环复制么?实际上MySQL自己早就想到了这一点,所以在MySQL的BinaryLog中记录了当前MySQL的server-id,而且这个参数也是我们搭建MySQLReplication的时候必须明确指定,而且Master和Slave的server-id参数值比需要不一致才能使MySQLReplication搭建成功。一旦有了server-id的值之后,MySQL就很容易判断某个变更是从哪一个MySQLServer最初产生的,所以就很容易避免出现循环复制的情况。而且,如果我们不打开记录Slave的BinaryLog的选项(--log-slave-update)的时候,MySQL根本就不会记录复制过程中的变更到BinaryLog中,就更不用担心可能会出现循环复制的情形了。

 

如图:
Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance

 

主动的Master-Master复制有一些特殊的用处。例如,地理上分布的两个部分都需要自己的可写的数据副本。这种结构最大的问题就是更新冲突。假设一个表只有一行(一列)的数据,其值为1,如果两个服务器分别同时执行如下语句:
在第一个服务器上执行:

mysql> UPDATE tbl SET col=col + 1;
Copier après la connexion

在第二个服务器上执行:

mysql> UPDATE tbl SET col=col * 2;
Copier après la connexion

那么结果是多少呢?一台服务器是4,另一个服务器是3,但是,这并不会产生错误。
实际上,MySQL并不支持其它一些DBMS支持的多主服务器复制(Multimaster Replication),这是MySQL的复制功能很大的一个限制(多主服务器的难点在于解决更新冲突),但是,如果你实在有这种需求,你可以采用MySQL Cluster,以及将Cluster和Replication结合起来,可以建立强大的高性能的数据库平台。但是,可以通过其它一些方式来模拟这种多主服务器的复制。

 

4.3、主动-被动模式的Master-Master(Master-Master in Active-Passive Mode)

这是master-master结构变化而来的,它避免了M-M的缺点,实际上,这是一种具有容错和高可用性的系统。它的不同点在于其中一个服务只能进行只读操作。如图:
Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance

 

 

4.4 级联复制架构 Master –Slaves - Slaves

        在有些应用场景中,可能读写压力差别比较大,读压力特别的大,一个Master可能需要上10台甚至更多的Slave才能够支撑注读的压力。这时候,Master就会比较吃力了,因为仅仅连上来的SlaveIO线程就比较多了,这样写的压力稍微大一点的时候,Master端因为复制就会消耗较多的资源,很容易造成复制的延时。

        遇到这种情况如何解决呢?这时候我们就可以利用MySQL可以在Slave端记录复制所产生变更的BinaryLog信息的功能,也就是打开—log-slave-update选项。然后,通过二级(或者是更多级别)复制来减少Master端因为复制所带来的压力。也就是说,我们首先通过少数几台MySQL从Master来进行复制,这几台机器我们姑且称之为第一级Slave集群,然后其他的Slave再从第一级Slave集群来进行复制。从第一级Slave进行复制的Slave,我称之为第二级Slave集群。如果有需要,我们可以继续往下增加更多层次的复制。这样,我们很容易就控制了每一台MySQL上面所附属Slave的数量。这种架构我称之为Master-Slaves-Slaves架构

            这种多层级联复制的架构,很容易就解决了Master端因为附属Slave太多而成为瓶颈的风险。下图展示了多层级联复制的Replication架构。

Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance

当然,如果条件允许,我更倾向于建议大家通过拆分成多个Replication集群来解决

上述瓶颈问题。毕竟Slave并没有减少写的量,所有Slave实际上仍然还是应用了所有的数据变更操作,没有减少任何写IO。相反,Slave越多,整个集群的写IO总量也就会越多,我们没有非常明显的感觉,仅仅只是因为分散到了多台机器上面,所以不是很容易表现出来。

此外,增加复制的级联层次,同一个变更传到最底层的Slave所需要经过的MySQL也会更多,同样可能造成延时较长的风险。

而如果我们通过分拆集群的方式来解决的话,可能就会要好很多了,当然,分拆集群也需要更复杂的技术和更复杂的应用系统架构。

 

 4.5、带从服务器的Master-Master结构(Master-Master with Slaves)

这种结构的优点就是提供了冗余。在地理上分布的复制结构,它不存在单一节点故障问题,而且还可以将读密集型的请求放到slave上。

Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance

级联复制在一定程度上面确实解决了Master因为所附属的Slave过多而成为瓶颈的问题,但是他并不能解决人工维护和出现异常需要切换后可能存在重新搭建Replication的问题。这样就很自然的引申出了DualMaster与级联复制结合的Replication架构,我称之为Master-Master-Slaves架构

和Master-Slaves-Slaves架构相比,区别仅仅只是将第一级Slave集群换成了一台单独的Master,作为备用Master,然后再从这个备用的Master进行复制到一个Slave集群。

这种DualMaster与级联复制结合的架构,最大的好处就是既可以避免主Master的写入操作不会受到Slave集群的复制所带来的影响,同时主Master需要切换的时候也基本上不会出现重搭Replication的情况。但是,这个架构也有一个弊端,那就是备用的Master有可能成为瓶颈,因为如果后面的Slave集群比较大的话,备用Master可能会因为过多的SlaveIO线程请求而成为瓶颈。当然,该备用Master不提供任何的读服务的时候,瓶颈出现的可能性并不是特别高,如果出现瓶颈,也可以在备用Master后面再次进行级联复制,架设多层Slave集群。当然,级联复制的级别越多,Slave集群可能出现的数据延时也会更为明显,所以考虑使用多层级联复制之前,也需要评估数据延时对应用系统的影响。

 

5、复制的常见问题


错误一:change master导致的:
     Last_IO_Error: error connecting to master 'repl1@IP:3306' - retry-time: 60  retries

错误二:在没有解锁的情况下停止slave进程:

 mysql> stop slave;
Copier après la connexion

ERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transaction

 

错误三:在没有停止slave进程的情况下change master

mysql> change master to master_host=‘IP', master_user='USER', master_password='PASSWD', master_log_file='mysql-bin.000001',master_log_pos=106;
Copier après la connexion

ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first

 

错误四:A B的server-id相同:
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; 
these ids must be different for replication to work (or the --replicate-same-server-id option must be used on
slave but this does not always make sense; please check the manual before using it). 
查看server-id
mysql> show variables like 'server_id'; 
手动修改server-id
mysql> set global server_id=2; #此处的数值和my.cnf里设置的一样就行 
mysql> slave start;

错误五:change master之后,查看slave的状态,发现slave_IO_running 仍为NO
需要注意的是,上述几个错误做完操作之后要重启mysql进程,slave_IO_running 变为Yes

 

错误六:MySQL主从同步异常Client requested master to start replication from position > file size

字面理解:从库的读取binlog的位置大于主库当前binglog的值

这一般是主库重启导致的问题,主库从参数sync_binlog默认为1000,即主库的数据是先缓存到1000条后统一fsync到磁盘的binlog文件中。

 当主库重启的时候,从库直接读取主库接着之前的位点重新拉binlog,但是主库由于没有fsync最后的binlog,所以会返回1236 的错误。
正常建议配置sync_binlog=1 也就是每个事务都立即写入到binlog文件中。

1、在从库检查slave状态:

偏移量为4063315

Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance

2、在主库检查mysql-bin.001574的偏移量位置

     mysqlbinlog mysql-bin.001574 >  ./mysql-bin.001574.bak

     tail -10 ./mysql-bin.001574.bak

mysql-bin.001574文件最后几行 发现最后偏移量是4059237,从库偏移量的4063315远大主库的偏移量4059237,也就是参数sync_binlog=1000导致的。

Explication détaillée du principe de réplication et configuration de larchitecture maître-esclave Mysql haute performance

3、重新设置salve

mysql> stop slave;mysql> change master to master_log_file='mysql-bin.001574' ,master_log_pos=4059237;mysql> start slave;
Copier après la connexion

错误8:数据同步异常情况

 

第一种:在master上删除一条记录,而slave上找不到。

Last_Error: Could not execute Delete_rows event on table market_edu.tl_player_task; Can't find record in 'tl_player_task', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.002094, end_log_pos 286434186

解决方法:由于master要删除一条记录,而slave上找不到故报错,这种情况主上都将其删除了,那么从机可以直接跳过。

可用命令:stop slave;   set global sql_slave_skip_counter=1;    start slave;

第二种:主键重复。在slave已经有该记录,又在master上插入了同一条记录。

Last_SQL_Error: Could not execute Write_rows event on table hcy.t1; 
Duplicate entry '2' for key 'PRIMARY', 
Error_code: 1062; 
handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000006, end_log_pos 924

解决方法:在slave删除重复的主键

第三种:在master上更新一条记录,而slave上找不到,丢失了数据。

Last_SQL_Error: Could not execute Update_rows event on table hcy.t1;
Can't find record in 't1', 
Error_code: 1032; 
handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000010, end_log_pos 263

解决方法:把丢失的数据在slave上填补,然后跳过报错即可。

insert into t1 values (2,'BTV');

stop slave ;set global sql_slave_skip_counter=1;start slave;

相关免费学习推荐:mysql数据库(视频)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal