Maison >base de données >tutoriel mysql >Résumer et organiser la configuration de la réplication semi-synchrone MySQL
Cet article vous apporte des connaissances pertinentes sur mysql, qui organise principalement les problèmes liés à la configuration de la réplication semi-synchrone, la transaction de la base de données principale doit garantir qu'au moins une base de données esclave reçoit le journal avant qu'elle puisse être terminée. . Par conséquent, il peut être garanti que lorsque la base de données principale tombe en panne, les transactions soumises ont été transmises à la base de données esclave pour garantir que les données ne sont pas perdues. J'espère que cela sera utile à tout le monde. .
Apprentissage recommandé : Tutoriel vidéo mysql
Préface :
La réplication maître-esclave par défaut de MySQL utilise un mode asynchrone. La base de données maître n'a pas besoin de confirmer si la transaction a été transmise à la base de données esclave. Lorsque la base de données tombe en panne et bascule entre maître et sauvegarde, les transactions soumises par la base de données maître peuvent être perdues dans la base de données esclave.
Dans MySQL 5.7, le mode de réplication semi-synchrone est pris en charge via le plug-in. En mode semi-synchrone, la transaction de la base de données principale doit garantir qu'au moins une base de données esclave reçoit le journal pour terminer la soumission. peut être garanti que lorsque la base de données principale tombe en panne, la transaction soumise sera terminée. La transaction a été transférée vers la base de données esclave pour garantir que les données ne sont pas perdues.
Semi-sync :
L'impact sur les performances de la réplication semi-synchronisée par rapport à la réplication asynchrone réside principalement dans le compromis sur l'intégrité des données, ce qui augmente le temps d'aller-retour TCP/IP pour l'envoi des soumissions à la bibliothèque esclave et confirmant la réception, la réplication semi-synchronisée nécessite un réseau de transmission élevé et une distance proche entre le maître et l'esclave. Si la transmission réseau est lente ou si la distance entre le maître et l'esclave est trop grande, les performances de la base de données principale peuvent être affectées. diminue et la réplication semi-synchrone expire.主 La bibliothèque principale et la bibliothèque de réplication semi-synchrone sont effectuées ci-dessous : lorsqu'elle est connectée à la bibliothèque principale, la copie vérifiera si la bibliothèque principale est ouverte pour la réplication semi-synchrone, lors de l'exécution de la soumission de transaction ; le fil doit attendre qu'au moins une bibliothèque esclave semi-synchrone confirme la réception de la transaction ou jusqu'à ce que le délai d'attente soit écoulé ; vous pouvez envoyer une confirmation à la bibliothèque principale que la transaction a été reçue
Si aucun esclave ; La bibliothèque envoie des informations de confirmation à la bibliothèque principale dans le délai spécifié, la réplication semi-synchrone de la bibliothèque principale expirera et sera rétrogradée en réplication asynchrone. Lorsqu'au moins une bibliothèque esclave semi-synchrone peut envoyer des informations de confirmation à la bibliothèque principale, la bibliothèque principale passera automatiquement en mode semi-synchrone ;
La réplication semi-synchrone doit être activée à la fois sur la bibliothèque principale et sur la bibliothèque esclave. S'il existe une bibliothèque principale qui n'active pas le mode semi-synchrone. Ou la bibliothèque principale ouvre le mode semi-synchronisation mais n'ouvre pas le mode semi-synchronisation depuis la bibliothèque, alors la copie principale de la copie principale adopte toujours le mode asynchrone, la session ne sera renvoyée qu'une fois le blocage terminé, et la soumission de la transaction de la base de données principale doit attendre qu'au moins une base de données esclave confirme l'acceptation. Le paramètre rpl_semi_sync_master_wait_for_slave_count peut être utilisé pour contrôler le nombre d'esclaves qui doivent être confirmés dans la bibliothèque principale. La valeur par défaut est 1.在Le carding se produira également dans la table de non-transaction de Rollback. Étant donné que la table de non-transaction n'est pas restaurée, il est toujours nécessaire d'écrire un journal dans la restauration de la table de non-transaction pour la synchroniser avec l'entrepôt.
using use using using le paramètre rpl_semi_sync_master_wait_point pour contrôler le point temporel à que la transaction de la base de données maître valide et attend que la base de données esclave confirme l'acceptation de la transaction en mode semi-synchrone : Le paramètre ‐rpl_semi_sync_master_wait_point est utilisé en mode semi-synchrone pour contrôler le moment auquel la transaction de la base de données principale est soumise et attend que la base de données esclave confirme l'acceptation de la transaction sur le disque, après la synchronisation de la bibliothèque principale, elle attend la bibliothèque esclave. pour recevoir la confirmation de la transaction. Après avoir attendu la confirmation de la bibliothèque esclave, la bibliothèque principale soumet la transaction au moteur de stockage et la renvoie au client.
La bibliothèque principale écrit la transaction dans le journal binaire et synchronise la bibliothèque esclave, synchronise le journal binaire et soumet la transaction au moteur de stockage. Après la soumission, la bibliothèque principale attend que la bibliothèque esclave reçoive la confirmation de la transaction. confirmation, la source revient pour soumettre Terminé au client.
Les deux points temporels de synchronisation présentent principalement les différences suivantes
S Sous after_sync, tous les clients voient les transactions qui ont été soumises en même temps, car elles sont soumises au moteur de stockage après avoir confirmé qu'ils ont reçu la transaction de la bibliothèque. Ainsi, tous les clients voient les données qui ont été soumises au moteur de stockage. transaction en même temps ; de plus, lorsqu'un basculement se produit, toutes les transactions soumises dans la base de données principale ont été synchronisées avec le journal de relais de la base de données esclave et les données de la base de données esclave sont sans perte. client-->Analyse MySQL-->Storage Involve-->écrire un journal binaire-->attendre ACK-->storagecommit-->client(OK) Sous after_commit, validez la transaction. le client doit attendre la confirmation que la base de données esclave a reçu la transaction avant de revenir, mais comme la soumission au moteur de stockage est terminée avant de confirmer la base de données esclave, les autres clients verront les données de la transaction soumise plus tôt que le client qui a soumis la transaction. transaction En cas de basculement, d'autres clients peuvent subir une perte de données liées aux données qu'ils voient sur la source pour les transactions qui ont été validées sur le moteur de stockage mais dont l'exécution n'a pas encore été confirmée par l'esclave. client-->Analyse MySQL-->Storage Involve-->écrire un journal binaire-->storagecommit-->attendre ACK-->client(OK) En résumé, il est recommandé de utilisez after_sync par défaut.Étapes d'installation semi-synchrone :
Informations sur l'environnement :
Version MySQL : 5.7.32 Architecture : un maître (192.168.1.110:3306) deux esclaves (192.168.1.11 1:3306, 192.168. 1.111 : 3307) binlog:onLa réplication semi-synchrone est basée sur la réplication asynchrone, le maître et l'esclave doivent donc être configurés à l'avance. La réplication asynchrone (étapes omises ici).
La réplication semi-synchrone ne prend pas en charge la réplication multi-source (plusieurs canaux), la réplication semi-synchrone ne peut utiliser que le canal par défaut.令 Commandes de gestion de configuration Installplugin, Set Global, Stop Slave, Start Slave et Super Permanent Super Privilege. Oui Le plug-in d'installation nécessite que MySQLServer prenne en charge le chargement dynamique. Vous devez confirmer la configuration du chemin du plug-in pour yes
show global variables like'%have_dynamic_loading%';
pour confirmer le plug-in correct. La valeur par défaut est dans install_home/lib/plugin.
show global variables like '%plugin_dir%';
Vérifiez que les plug-ins de réplication semi-synchrone semisync_master et semisync_slave existent sous le chemin du plug-in plugin_dir. Le suffixe du nom de fichier varie en fonction de la plate-forme (par exemple, .so est utilisé pour les systèmes Unix et de type Unix, .dll est utilisé pour Windows).
Configurez la semi-synchronisation :
Installez le maître et l'esclave pour empêcher la commutation maître-esclave.
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Remarque : Si l'installation échoue comme suit, vous devez d'abord installer libimf.
mysql> INSTALLPLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ERROR 1126(HY000): Can't open shared library '/usr/local/mysql/lib/plugin/semisync_master.so' (errno: 22libimf.so: cannot open shared object file: No such fileor directory)
Vérifiez si le composant est chargé.
show plugins; +----------------------------+----------+--------------------+--------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+--------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | | ngram | ACTIVE | FTPARSER | NULL | GPL | | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL | | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL | +----------------------------+----------+--------------------+--------------------+---------+ SELECT PLUGIN_NAME, PLUGIN_STATUS -> FROM INFORMATION_SCHEMA.PLUGINS -> WHERE PLUGIN_NAME LIKE '%semi%'; +----------------------+---------------+ | PLUGIN_NAME | PLUGIN_STATUS | +----------------------+---------------+ | rpl_semi_sync_master | ACTIVE | | rpl_semi_sync_slave | ACTIVE | +----------------------+---------------+
Après avoir installé le plug-in, vous pouvez visualiser les paramètres liés à la semi-synchronisation.
show global variables like 'rpl_semi%'; +-------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------+------------+ | rpl_semi_sync_master_enabled | OFF | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_for_slave_count | 1 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_master_wait_point | AFTER_SYNC | | rpl_semi_sync_slave_enabled | OFF | | rpl_semi_sync_slave_trace_level | 32 | +-------------------------------------------+------------+
Explication détaillée des paramètres :
rpl_semi_sync_master_enabled : Indique si la bibliothèque principale active la semi-synchronisation.
rpl_semi_sync_master_wait_point : point temporel de synchronisation after_commit, after_sync. rpl_semi_sync_master_wait_for_slave_count : le nombre de confirmations requises de la bibliothèque esclave après la soumission de la transaction de la bibliothèque principale. # ' ' de part en part de part en part de part en part de part en part de part en part ensemble de part en part ensemble de part en part jusqu'à 100 pour être synchronisé pour être en mode asynchrone pour être asynchrone en mode asynchrone pour être semi-synchronisé en asynchrone mode. M RPL_SEMI_SYNC_MATER_WAIT_NO_SLAVE :
Lorsque la bibliothèque principale est trouvée (RPL_SEMI_SYNC_MASTER_CLIENTS) est inférieure à (RPL_SEMI_MATER_WAIT_SLAVE_COUNT) Passer en mode asynchrone lorsque on est activé, pendant le temps libre de non-soumission, même si la bibliothèque principale est découverte (Rpl_semi_sync_master_clients) ; inférieur à (rpl_semi_sync_master_wait_for_slave_count), et aucun ajustement ne sera effectué ;
Tant que la bibliothèque principale reçoit un nombre de réponses ACK supérieur ou égal à (rpl_semi_sync_master_wait_for_slave_count) avant l'expiration du délai de transaction, la bibliothèque principale restera en semi-synchrone. mode. Si lorsque la phase de validation de la transaction (la bibliothèque principale attend ACK) expire, la semi-synchronisation passera en mode asynchrone ;
无论(rpl_semi_sync_master_wait_no_slave)为ON还是OFF,当slave上线到(rpl_semi_sync_master_wait_for_slave_count)值时,master都会自动由异步模式转为半同步模式。
主库开启半同步功能
SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout=10000;
从库开启半同步功能
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
从库对于正在进行的异步复制,需要重启sql_io_thread 线程,才能生效半同步复制
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
主库添加参数到/etc/my.cnf文件
[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000
从库添加参数到/etc/my.cnf文件
[mysqld] rpl_semi_sync_slave_enabled=1
查看主从是否启用了半同步复制:
主库查询半同步状态Rpl_semi_sync_master_status为on表示主库开启了半同步复制,Rpl_semi_sync_master_clients表示目前有2个半同步的从库。
show global status like 'rpl%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 2 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | | Rpl_semi_sync_slave_status | OFF | +--------------------------------------------+-------+
从库查询半同步状态Rpl_semi_sync_slave_status 为on表示从库开启了半同步复制。
show global status like 'rpl%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 0 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | OFF | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | | Rpl_semi_sync_slave_status | ON | +--------------------------------------------+-------+
半同步状态检查:
show global status like 'rpl%'; +--------------------------------------------+---------+ | Variable_name | Value | +--------------------------------------------+---------+ | Rpl_semi_sync_master_clients | 2 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 12463 | | Rpl_semi_sync_master_no_times | 1 | | Rpl_semi_sync_master_no_tx | 2739 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 1030 | | Rpl_semi_sync_master_tx_wait_time | 5075616 | | Rpl_semi_sync_master_tx_waits | 4926 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 5595 | | Rpl_semi_sync_slave_status | OFF | +--------------------------------------------+---------+
Rpl_semi_sync_master_net_avg_wait_time:变量已经废弃,总是等于0。
Rpl_semi_sync_master_net_wait_time:变量已经废弃,总是等于0。
Rpl_semi_sync_master_net_waits:主库等待从库的总次数。
Rpl_semi_sync_master_no_times:主库关闭半同步的总次数,可以用来分析半同步降级为异步的频率次数。
Rpl_semi_sync_master_no_tx:表示半同步事务提交没有接受到从库确认接受的总次数,可以用来分析半同步事务的提交是否存在超时的情况。
Rpl_semi_sync_master_yes_tx: 表示半同步事务提交接受到从库确认接受的总次数。
Rpl_semi_sync_master_timefunc_failures::调用 gettimeofday() 等时间函数失败的次数。
Rpl_semi_sync_master_tx_avg_wait_time:每个事务提交平均等待时间(单位: microseconds ),可以用来分析事务提交性能。
Rpl_semi_sync_master_tx_wait_time:事务总的提交等待时间(单位: microseconds ),可以用来分析事务提交性能。
Rpl_semi_sync_master_tx_waits:事务总的提交等待次数,可以用来分析事务提交性能。
Rpl_semi_sync_master_wait_pos_backtraverse:主库event binary位置低于之前等待event的总次数,当事务开始等待回复的顺序与其二进制日志事件的写入顺序不同时,就会发生这种情况。
Rpl_semi_sync_master_wait_sessions:当前会话等待从库确认接受的个数,可以用来确认分析会话是否存在由于等待从库确认而堵塞的情况。
推荐学习: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!