Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Résolution des problèmes de latence de réplication des journaux binaires pour Aurora MySQL
Cette section fournit des conseils sur le décalage de réplication du journal binaire pour Aurora MySQL configuré en tant que réplique du journal binaire. Il couvre l'architecture de réplication, la réplication parallèle, le suivi des dépendances, la surveillance et les meilleures pratiques de configuration.
La réplication de journaux binaires permet de répliquer les données entre les MySQL-compatible bases de données. La réplication des journaux binaires abordée dans cette section est asynchrone : la source n'attend pas les répliques pour confirmer l'application des modifications avant de valider les transactions. Cela ne s'applique pas à la réplication semi-synchrone. Dans la réplication semi-synchrone, la source attend qu'au moins une réplique accuse réception de la transaction avant de valider. Par exemple, les clusters de Multi-AZ bases de données pour Amazon RDS pour MySQL utilisent la réplication semi-synchrone, ce qui est hors de portée de cette section. La réplique maintient une connexion permanente à la source via le I/O thread pour diffuser en continu les événements du journal binaire. Cette section s'applique à toutes les topologies de réplication binlog où Aurora MySQL est la réplique. La source peut être un autre cluster Aurora MySQL, Amazon RDS pour MySQL, MySQL sur site ou MySQL sur Amazon EC2. Cette section s'applique également lorsque Aurora MySQL est la source de réplication vers une MySQL-compatible cible quelconque.
Note
Pour les cas d'utilisation de réplication entre régions, envisagez de l'utiliser Utilisation d’Amazon Aurora Global Database comme alternative à la réplication binaire basée sur les journaux. Aurora Global Database utilise une infrastructure dédiée pour la réplication, offrant une latence plus faible et nécessitant moins de gestion opérationnelle que la réplication de journaux binaires entre les régions.
Vous êtes confronté à un pic de décalage en ce moment ? Ignorez les informations de base et commencez par Identifier le goulot d'étranglement lié au retard de réplication déterminer si le I/O thread ou le thread SQL est le goulot d'étranglement, puis suivez le lien correspondant à ce scénario : Résolution des problèmes de décalage des I/O threads ou. Résolution des problèmes de latence des threads SQL
Rubriques
Architecture de réplication MySQL
La réplication MySQL est mise en œuvre via des threads spécialisés :
-
Thread de vidage de journal binaire (source) : créé lors de la connexion d'un réplica. Envoie le contenu du journal binaire à la réplique. Visible dans
SHOW PROCESSLISTle thread « Binlog Dump ». -
I/O Fil de réplication (réplique) : se connecte à la source et demande des mises à jour du journal binaire. Les écrit dans le journal de relais de la réplique. Toujours un seul thread par canal de réplication, quelle que soit la configuration de réplication multithread (MTR).
-
Thread SQL de réplication (réplique) : lit le journal du relais et applique les transactions. L'applicateur se compose toujours d'un thread de coordinateur qui lit les transactions dans le journal du relais, plus N threads de travail qui les appliquent, où N est la valeur de
replica_parallel_workers. Avecreplica_parallel_workers=1, le travailleur unique applique les transactions de manière séquentielle. Avecreplica_parallel_workers >= 2, le coordinateur attribue des transactions indépendantes à plusieurs threads de travail pour une application parallèle.Note
replica_parallel_workers=0Le paramètre est obsolète depuis MySQL 8.0.30 et peut être supprimé dans une future version de MySQL. Utilisez plutôtreplica_parallel_workers=1pour une application à thread unique.
Le processus de réplication fonctionne comme suit :
La source exécute des instructions DML, DCL ou DDL.
Lors de la validation, la source écrit les données dans le journal binaire.
Le I/O thread de la réplique récupère les événements et les écrit dans le journal du relais.
Le thread SQL applique les modifications du journal du relais (monothread ou multithread).
Identifier le goulot d'étranglement lié au retard de réplication
Le retard de réplication peut survenir dans deux domaines : le I/O thread ou le thread SQL. La première étape consiste à déterminer quel composant est en retard.
Note
Le Seconds_Behind_Source champ dans SHOW REPLICA STATUS mesure le délai entre le moment où un événement a été enregistré sur la source et le moment où le thread SQL l'applique. Cette métrique n'indique pas spécifiquement I/O le décalage des threads. Pour identifier I/O le décalage des threads, vous devez comparer les positions des journaux binaires comme décrit dans les étapes suivantes.
Note
Certaines commandes MySQL et chaînes internes présentées dans cette section, par exempleSHOW MASTER STATUS, utilisent une terminologie héritée. Cette documentation utilise les termes préférés « source » et « réplique » dans l'ensemble de cette documentation.
Pour déterminer quel thread de réplication est en retard
-
Sur la réplique, exécutez
SHOW REPLICA STATUSet comparezSource_Log_File/Read_Source_Log_Pos(position du I/O thread) avecFile/PositiondepuisSHOW MASTER STATUSla source. Si ces valeurs diffèrent de manière significative (plus de 50 Mo ou plus d'un fichier binlog séparé), cela signifie que le I/O thread est en retard. -
Comparez la position du I/O thread avec la position du thread SQL (
Relay_Source_Log_File/Exec_Source_Log_Pos). Si le I/O thread est rattrapé mais que le thread SQL est en retard (espacé de plus de 50 Mo), c'est le thread SQL qui constitue le goulot d'étranglement.
Évaluation initiale rapide à l'aide de données provenant uniquement de répliques
Vous pouvez effectuer une évaluation initiale en utilisant uniquement des données côté réplication. Courez SHOW REPLICA STATUS deux fois, à une ou deux minutes d'intervalle, et observez ce qui suit :
S'il
Read_Source_Log_Posavance maisExec_Source_Log_Posqu'il est bloqué ou qu'il avance beaucoup plus lentement, le thread SQL constitue le goulot d'étranglement (scénario B). Passez à Résolution des problèmes de latence des threads SQL.Si
Read_Source_Log_Posles deuxExec_Source_Log_Possont bloqués pendantSeconds_Behind_Sourcela croissance, le I/O fil est probablement en retard. Avant d'apporter des modifications à la configuration, confirmez en comparant les positions des répliques par rapport à la source,SHOW MASTER STATUScomme décrit à l'étape 1 de la procédure précédente.
| Scénario | I/O thread contre Source | Thread SQL contre I/O thread | goulot d'étranglement |
|---|---|---|---|
| A | Loin derrière (>50 Mo) | Fermer (<10 Mo) | I/O fil |
| B | Fermer (<10 Mo) | Loin derrière (>50 Mo) | fil SQL |
| C | Loin derrière | Loin derrière | Les deux (commencez par I/O) |
Exemple Interprétation des positions des logs binaires
L'exemple suivant montre comment comparer les positions des logs binaires pour déterminer le goulot d'étranglement.
Sur la réplique, SHOW REPLICA STATUS renvoie :
Source_Log_File: mysql-bin.000045 Read_Source_Log_Pos: 524288000 Relay_Source_Log_File: mysql-bin.000045 Exec_Source_Log_Pos: 524200000
Sur la source, SHOW MASTER STATUS renvoie :
File: mysql-bin.000045 Position: 1073741824
Pour déterminer le décalage du I/O thread, soustrayez la position du I/O thread de la position source :
(1073741824 − 524288000)/1048576 = 524 Mo — Le fil est loin derrière la I/O source (scénario A).
Pour déterminer le décalage du thread SQL, soustrayez la position du thread SQL de la position du I/O thread :
(524288000 − 524200000)/1048576 = 0,08 Mo — Le thread SQL suit le fil. I/O
Dans ce cas, concentrez le dépannage sur le I/O thread. Pour de plus amples informations, veuillez consulter Résolution des problèmes de décalage des I/O threads.
Anatomie d'un pic de retard de réplication
Un schéma courant est un pic soudain Seconds_Behind_Source suivi d'un retour rapide à un niveau proche de zéro. Cela se produit lorsqu'une DML de longue durée sur la source (telle qu'une mise à jour analysant des millions de lignes mais n'en modifiant que quelques-unes) prend quelques minutes pour s'exécuter. Avec la journalisation ROW-based binaire, seules les lignes modifiées sont écrites dans le journal binaire. Lorsque le thread SQL détecte cet événement, il calcule le décalage en fonction de l'heure de début de la transaction sur la source. Cela produit une valeur initiale importante. Cependant, comme seules quelques lignes doivent être appliquées, la réplique rattrape rapidement son retard. Ce comportement est normal et n'indique pas un problème de réplication persistant.
Résolution des problèmes de décalage des I/O threads
Le I/O thread est chargé de récupérer les événements du journal binaire depuis la source et de les écrire dans le journal du relais. Causes courantes et solutions :
| Cause | Comment identifier | Résolution |
|---|---|---|
| Limitations de bande passante réseau | Vérifiez CloudWatch NetworkReceiveThroughput/NetworkTransmitThroughput |
Utiliser des instances dotées d'une capacité réseau plus élevée ; garantir des classes d'instances similaires sur la source et la réplique |
| Latence du réseau (entre régions ou sur site) | Distance géographique entre la source et la réplique ; temps aller-retour élevé | Pour les sources sur site, utilisez une connectivité dédiée à faible latence |
| Contraintes liées aux ressources à la source | CPU (CPUUtilization), pression de mémoire élevée (FreeableMemory) |
Augmentez l'instance source. Chaque réplique connectée crée un thread de vidage binlog sur la source. Réduisez le nombre de répliques connectées si les ressources de la source sont limitées. |
| Transactions importantes avec des BLOB/TEXT données | Surveillez la taille des événements du journal binaire via une SumBinaryLogSize CloudWatch métrique |
Définissez binlog_row_image=noblob ; activez la compression des transactions du journal binaire (binlog_transaction_compression=ON). Testez d'abord en dehors de la production : la compression augmente l'utilisation du processeur à la fois sur la source et sur la réplique. |
| Limite d'espace dans le journal du relais atteinte | Replica_IO_Stateaffiche « En attente que le thread SQL de réplication libère suffisamment d'espace dans le journal du relais » |
Cela indique que le thread SQL est la cause première, et non le I/O thread. Corrige d'abord le décalage des threads SQL. Dans Aurora MySQL, la valeur par défaut relay_log_space_limit est d'environ 953 MiB. Ce message fait partie du fonctionnement normal lorsque le thread SQL ne peut pas appliquer les modifications assez rapidement. Ce message n'indique pas nécessairement un problème de performance des I/O threads. |
Stratégies d'optimisation pour le décalage des I/O threads
-
Utilisez au moins la même classe d'instance que la source : cette approche fournit suffisamment de processeur, de mémoire, de I/O capacité et de bande passante réseau.
-
Garantissez une bande passante réseau suffisante : utilisez des instances dotées d'une capacité réseau élevée. Pour les sources sur site, pensez à une bande passante dédiée et à une expérience réseau plus cohérente.
-
Vérifiez les ressources côté source, en particulier pour de nombreuses répliques : surveillez le processeur, la mémoire, le réseau et le journal des fichiers binaires de la source. I/O Chaque réplique connectée ajoute un thread de vidage binlog sur la source, de sorte qu'une source desservant de nombreuses répliques peut elle-même devenir le goulot d'étranglement. Nous vous recommandons de vérifier que la source n'est pas saturée avant de redimensionner la réplique. Si les ressources de la source sont limitées, pensez à réduire le nombre de répliques connectées.
-
Vérifiez que le I/O cache du journal binaire Aurora est actif — Le I/O cache du journal binaire réduit le disque I/O sur la source pour la diffusion des événements du journal binaire. Il est activé automatiquement dans les versions 2.10 et supérieures d'Aurora MySQL. Aucune configuration n'est requise. Si la source est un cluster Aurora, vérifiez que le cache est utilisé avec
SHOW GLOBAL STATUS LIKE 'aurora_binlog_io_cache%'. Pour de plus amples informations, veuillez consulter Optimisation de la réplication des journaux binaires. -
Activer la compression des transactions du journal binaire : définissez
binlog_transaction_compression=ONce paramètre dans le groupe de paramètres. Réduit les besoins en bande passante. Ce paramètre prend en compte les considérations suivantes :La compression augmente l'utilisation du processeur à la fois sur la source et sur la réplique.
Effectuez d'abord des tests dans un environnement hors production pour trouver l'équilibre optimal entre la compression et l'utilisation des ressources.
Vous pouvez éventuellement régler le niveau de compression en utilisant
binlog_transaction_compression_level_zstd(par défaut : 3, plage : 1 à 22).
-
Minimiser les écritures dans les journaux binaires —
binlog_row_image=noblobParamétrez pour éliminer les BLOB/TEXT données des journaux binaires. Ne pas utiliser si la réplique possède des déclencheurs qui font référence à des colonnes BLOB. Pour plus d'informations, consultez binlog_row_imagesur le site Web de MySQL. -
Implémentez des filtres de réplication sur la source : utilisez
binlog-do-dboubinlog-ignore-dbpour exclure les bases de données inutiles. Il s'agit de paramètres statiques nécessitant un redémarrage.Important
Source-side les filtres affectent entièrement ce qui est écrit dans les journaux binaires. Les bases de données exclues ne sont répliquées vers aucun réplica en aval. Si la source est une instance MySQL autogérée (sur site ou sur Amazon EC2), les bases de données exclues ne sont pas non plus disponibles pour la restauration instantanée basée sur les journaux binaires. Amazon RDS pour MySQL ne prend pas en charge le filtrage des fichiers binaires côté source (
binlog-do-db/nebinlog-ignore-dbsont pas configurables) ; utilisez plutôt des filtres de réplication côté réplication. Aurora utilise le volume de cluster pour PITR et n'est pas affecté par les filtres de journalisation binaires à des fins de sauvegarde.
Résolution des problèmes de latence des threads SQL
Le thread SQL est le goulot d'étranglement lorsque le I/O thread est rattrapé par la source mais qu'il Seconds_Behind_Source est en train de croître. Pour quantifier le décalage, surveillez sur une période de 15 minutes. Comparez le taux de génération du binlog sur la source (le Position delta deSHOW MASTER STATUS) avec le taux d'application des threads SQL sur la réplique (le Exec_Source_Log_Pos delta).
Causes courantes et solutions :
| Cause | Comment identifier | Résolution |
|---|---|---|
| Single-threaded réplication | SELECT @@global.replica_parallel_workers;renvoie 0 ou 1 |
Activez la réplication multithread (MTR) avec le suivi des dépendances WRITESET. Le MTR à lui seul ne résout pas le décalage si les conflits d'horloge sont élevés. Consultez Suivi des dépendances par rapport à la source la section pour régler le suivi des dépendances et Statistiques des répliques multithread dans le journal des erreurs identifier les conflits d'horloge. |
| Absence de clés primaires | Sans clé primaire (ou clé unique avec NOT NULL), la réplique effectue une analyse complète de la table pour chaque ligne modifiée dans les opérations UPDATE et DELETE. Utilisez la requête suivante pour identifier les tables sans clé primaire :
|
Ajoutez des clés primaires à toutes les tables répliquées. S'il n'est pas possible d'ajouter des clés primaires explicites dans l'immédiat, envisagez d'activer les clés primaires invisibles générées (GIPK) en définissant le sql_generate_invisible_primary_key paramètre sur ON (disponible dans les versions d'Aurora MySQL 3 basées sur MySQL 8.0.30 et versions ultérieures). Pour plus d'informations sur les clés primaires invisibles générées, consultez la section Clés primaires invisibles générées |
| Transactions d'écriture importantes à la source | Une transaction qui modifie de nombreuses lignes (par exemple, une opération UPDATE ou DELETE en bloc) est répliquée sous la forme d'une unité unique qu'un seul thread de travail peut appliquer, quelle que soit la configuration MTR. Sur la source, identifiez les transactions d'écriture actives de longue durée avec : Sur la réplique, un travailleur reste occupé à faire le même relevé SHOW PROCESSLIST tandis que les autres restent les bras croisés. Long-running les transactions inactives ou en attente de verrouillage de la source ne provoquent pas en elles-mêmes de retard de réplication. Seul le volume d'écriture validé compte, car les événements atteignent le journal binaire au moment de la validation. |
Divisez les opérations groupées en transactions plus petites (par exemple, quelques milliers de lignes par validation) afin que la réplique puisse les appliquer en parallèle. Pour un exemple concret, voirExemple 4 : Une seule transaction importante ne peut pas être parallélisée. |
| Opérations DDL | Le DDL bloque les autres événements de réplication | Utilisez un outil de modification de schéma en ligne ou utilisez Blue/Green des déploiements. Planifiez le DDL pendant les périodes de faible trafic. Pourpt-online-schema-change, consultez la boîte à outils Percona gh-ost, voir gh-ost |
| Configuration de réplication parallèle sous-optimale | Faible taux d'utilisation du personnel ; conflits d'horloge élevés dans les statistiques des coordinateurs. Vérifiez le champ « En attente de conflits d'horloge » dans l'entrée du journal des erreurs des statistiques des répliques multithread (voirStatistiques des répliques multithread dans le journal des erreurs). Des valeurs élevées par rapport aux « secondes écoulées » indiquent que les transactions sont fréquemment bloquées par des dépendances. | Réglez le suivi des dépendances (WRITESET) et le nombre de travailleurs |
| Conflit de ressources dû aux charges de travail analytiques | Requêtes OLAP complexes en concurrence avec le thread SQL pour les ressources (CPU, mémoire) | Séparez les charges de travail analytiques des répliques dédiées |
| Statistiques de table obsolètes | Plans de requête sous-optimaux sur le réplica. Utilisez la requête suivante pour identifier les tables contenant des statistiques obsolètes (datant de plus de 7 jours) :
|
Exécuter ANALYZE TABLE périodiquement sur des tables contenant des statistiques obsolètes |
Réduisez la charge de travail d'application grâce à des filtres de réplication côté réplication
Aurora MySQL version 3.01.0 et versions supérieures prend en charge les filtres de réplication côté réplication. Utilisez-les pour ignorer les bases de données ou les tables non pertinentes lors de l'application, réduisant ainsi la charge de travail des threads SQL. Replica-side les filtres sont appliqués par le thread SQL : le I/O thread récupère toujours tous les événements du journal binaire depuis la source, de sorte que ces filtres réduisent uniquement le travail d'application, pas le transfert réseau. Contrairement aux filtres côté source (qui fonctionnent uniquement au niveau de la base de données), les filtres côté réplication prennent en charge la granularité au niveau de la table à l'aide de et. replicate-do-table replicate-ignore-table Pour de plus amples informations, veuillez consulter Configuration des filtres de réplication avec Aurora MySQL.
Multi-threaded réplication (MTR)
Avec MTR, la réplique applique des transactions indépendantes en parallèle. Il ne peut pas scinder une seule transaction importante en plusieurs parties parallèles. Le degré de parallélisme est limité par les informations de dépendance écrites par la source.
Lorsque MTR est activé (replica_parallel_workers >= 2), l'applicateur SQL est divisé en un thread de coordination et plusieurs threads de travail. Le coordinateur lit les transactions dans le journal du relais. Il examine les horodatages logiques (last_committedetsequence_number) que la source intègre dans chaque transaction. Il attribue ensuite des transactions indépendantes aux threads de travail disponibles pour une exécution parallèle. Deux transactions sont indépendantes si elles ne partagent pas de dépendances de données, c'est-à-dire si elles modifient des lignes différentes. La source détermine ces dépendances au moment de la validation à l'aide de la méthode de suivi des dépendances configurée et les enregistre dans le journal binaire. La réplique ne peut pas augmenter le parallélisme au-delà de ce que permet la source.
MTR est la valeur par défaut recommandée
Nous vous recommandons d'exécuter des répliques avec la fonction MTR activée. Le MTR est activé par défaut (replica_parallel_workers=4) dans MySQL 8.0.27 et versions supérieures, y compris dans les versions Aurora MySQL 3 basées sur ces versions. Sur les versions antérieures (Aurora MySQL 2.12.1 et versions supérieures, ou versions basées sur des versions de MySQL antérieures à 8.0.27), activez-le explicitement en le définissant sur une valeur égale ou supérieure replica_parallel_workers à 2. Le maintien de l'activation du MTR coûte peu lorsque le parallélisme n'est pas disponible et permet à la réplique d'en tirer parti chaque fois que la charge de travail le permet.
Le MTR ne réduit pas le décalage dans les cas suivants :
Le goulot d'étranglement est le I/O fil conducteur (network/bandwidth problème).
Le décalage est causé par une seule transaction de longue durée.
La réplique l'est CPU-saturated (plus de fils ne fait qu'empirer les choses).
Les tables ne disposent pas de clés primaires (force l'analyse complète des tables, annulant le parallélisme).
Suivi des dépendances par rapport à la source
La source détermine quelles transactions peuvent être appliquées en parallèle à l'aide du binlog_transaction_dependency_tracking paramètre. Valeur recommandée :WRITESET.
-
COMMIT_ORDER — Suit les dépendances en fonction du calendrier de validation. Fonctionne mieux avec une simultanéité élevée et des commits de grands groupes. Parallélisme limité dans les environnements à faible concurrence.
-
WRITESET (recommandé) — Suit les dépendances réelles entre les données au niveau des lignes. Les performances sont toujours au moins aussi bonnes que COMMIT_ORDER. C'est nettement mieux avec des charges de travail à faible simultanéité. Nécessite que les tables possèdent des clés primaires.
Le suivi des dépendances WRITESET produit des jeux d'écriture vides ou partiels (limitation du parallélisme) dans les cas suivants :
Tables sans clé principale ou unique
Instructions DDL (CREATE TABLE, ALTER TABLE, etc.)
Transactions qui modifient les tables parentes dans les relations par clé étrangère
De plus, l'historique des dépendances est effacé lorsque le journal binaire pivote ou lorsque la
binlog_transaction_dependency_history_sizelimite est atteinte, ce qui réduit temporairement le parallélisme. -
WRITESET_SESSION — Identique à WRITESET avec une contrainte supplémentaire interdisant la parallélisation des transactions d'une même session.
Note
MySQL 8.4 a été supprimé binlog_transaction_dependency_tracking et la valeur par défaut est WRITESET (non configurable). Les versions précédentes étaient par défaut COMMIT_ORDER.
Type parallèle (replica_parallel_type)
Le replica_parallel_type paramètre détermine la manière dont les transactions sont distribuées entre les threads de travail. Deux options s’offrent à vous :
-
LOGICAL_CLOCK (recommandé) — Utilise des horodatages logiques pour déterminer quelles transactions peuvent être exécutées en parallèle, même au sein de la même base de données. Cette approche se traduit par un débit de réplication plus élevé et une latence plus faible pour la plupart des charges de travail. Utilisez-le sauf si vous disposez d'une charge de travail multibase de données spécifique qui n'en bénéficie pas.
-
BASE DE DONNÉES — Assigne des transactions aux threads de travail en fonction de la base de données qu'elles affectent. N'y pensez que lorsque votre application utilise plusieurs bases de données avec des charges de travail clairement séparées et que les transactions franchissent rarement les limites de la base de données. Lorsque vous utilisez DATABASE, le
binlog_transaction_dependency_trackingparamètre de la source n'est pas utilisé. Le parallélisme est déterminé uniquement par la base de données cible par une transaction.
Note
Dans les versions 8.0.26 et antérieures de MySQL, la valeur par défaut replica_parallel_type est. DATABASE À partir de MySQL 8.0.27, la valeur par défaut est. LOGICAL_CLOCK Si vous utilisez une ancienne version, définissez explicitement ce paramètre pour tirer parti LOGICAL_CLOCK d'un suivi des dépendances plus précis.
Configuration du MTR
| Paramètre | Valeur recommandée | Remarques |
|---|---|---|
binlog_transaction_dependency_tracking |
SET D'ÉCRITURE | Groupe de paramètres de cluster. Dynamique. Non nécessaire pour MySQL 8.4. |
binlog_transaction_dependency_history_size |
25000 (par défaut) | Groupe de paramètres de cluster. Dynamique. Contrôle le nombre de hachages de lignes que la source conserve pour le suivi des dépendances de WRITESET ; lorsque l'historique se remplit ou que le journal binaire change, il est effacé et le parallélisme diminue temporairement. Envisagez de doubler la valeur (par exemple, jusqu'à 50 000) pour les sources gourmandes en écriture si la réplique affiche des pics périodiques dans la statistique du journal des erreurs « en attente de conflits d'horloge » (voirStatistiques des répliques multithread dans le journal des erreurs) qui correspondent à la rotation du journal binaire. Les valeurs élevées consomment plus de mémoire sur la source. |
binlog_format |
ROW | Groupe de paramètres de cluster. Statique (nécessite un redémarrage). |
binlog_group_commit_sync_delay |
0 (par défaut) | Microsecondes pour retarder la validation du groupe. L'augmentation de cette valeur permet de regrouper davantage de transactions, améliorant ainsi le parallélisme sur la réplique au prix d'une légère augmentation de la latence de validation sur la source. Uniquement bénéfique lors de l'utilisation du suivi des dépendances COMMIT_ORDER : WRITESET suit déjà les dépendances réelles au niveau des lignes, quel que soit le moment de la validation. Dynamique. |
binlog_group_commit_sync_no_delay_count |
0 (par défaut) | Nombre maximum de transactions à attendre avant de valider. Utilisez with binlog_group_commit_sync_delay pour limiter le délai une fois qu'un nombre suffisant de transactions ont été groupées. Uniquement pertinent pour le suivi des dépendances COMMIT_ORDER. Dynamique. |
| Paramètre | Valeur recommandée | Remarques |
|---|---|---|
replica_parallel_workers |
Commencez par le nombre de processeurs virtuels, jusqu'à deux fois le nombre de processeurs virtuels | Groupe de paramètres d'instance. Dynamique mais nécessite un redémarrage de la réplication. La valeur par défaut de la communauté est 4 à partir de MySQL 8.0.27 (et les versions d'Aurora MySQL 3 basées sur cette version) ; les versions précédentes sont définies par défaut sur 0, ce qui est obsolète depuis MySQL 8.0.30. Nous vous recommandons de commencer par le nombre de processeurs virtuels, puis de surveiller l'utilisation du processeur et les statistiques du journal des erreurs « A attendu (nombre) lorsque les travailleurs occupaient » (voirStatistiques des répliques multithread dans le journal des erreurs). Augmentez uniquement lorsque le « nombre d'heures d'attente pendant lesquelles les travailleurs étaient occupés » est constamment élevé et que l'utilisation du processeur reste inférieure à 80 %. |
replica_parallel_type |
HORLOGE_LOGIQUE | Groupe de paramètres de cluster. Dynamique mais nécessite un redémarrage de la réplication. |
replica_pending_jobs_size_max |
> = max_allowed_packet aucune source |
Groupe de paramètres d'instance. Dynamique. |
replica_preserve_commit_order |
ON | Groupe de paramètres de cluster. Dynamique mais nécessite un redémarrage de la réplication. |
binlog_format |
OFF | Groupe de paramètres de cluster. Statique. Aurora-specific extension pour désactiver la journalisation binaire. |
Après avoir modifié les paramètres du logiciel de travail parallèle, redémarrez la réplication :
CALL mysql.rds_stop_replication; CALL mysql.rds_start_replication;
Aurora-specific optimisations de réplication
Aurora MySQL fournit les fonctionnalités suivantes pour améliorer les performances de réplication des journaux binaires. Le tableau suivant récapitule la disponibilité, l'état par défaut et la manière d'activer chaque fonctionnalité.
| Fonctionnalité | Version | Par défaut | Comment activer/vérifier |
|---|---|---|---|
| In-memory journal des relais | Aurora MySQL 3.10 et versions supérieures | Activé (pour Aurora-managed la réplication lorsque les conditions sont remplies) | Activé automatiquement pour Aurora-managed la réplication (blue/green déploiements et répliques entre régions) lorsque le réplica utilise la réplication monothread (replica_parallel_workers=0), la réplication multithread avec le mode GTID et le positionnement automatique activé, ou la réplication basée sur des fichiers avec. Aurora-to-Aurora replica_preserve_commit_order=ON Contrôlé par le aurora_in_memory_relaylog paramètre dynamique (cluster de bases de données ou niveau d'instance) : arrêtez la réplication, définissez-la sur ON ou OFF dans le groupe de paramètres, puis redémarrez la réplication, aucun redémarrage de l'instance n'est requis. Non disponible surAurora Serverless. Vérifiez l'état actuel avecSHOW GLOBAL STATUS LIKE 'Aurora_in_memory_relaylog_status'. Pour de plus amples informations, veuillez consulter In-memory journal de relais. |
| Changements parallèles de l'indice secondaire | Aurora MySQL 3.06 et versions ultérieures | DÉSACTIVÉ (0) |
aurora_binlog_replication_sec_index_parallel_workersRéglez le nombre de fils souhaité. Arrêtez la réplication, définissez le paramètre, puis lancez la réplication. Aucun redémarrage d'instance n'est requis. Pour de plus amples informations, veuillez consulter Réplication des journaux binaires multithread. |
| Cache Binlog I/O | Aurora MySQL 2.10+ et 3.x | ON (automatique) | Activé automatiquement. Réduit le disque I/O sur la source lors de la diffusion d'événements de journaux binaires à des répliques. Aucune configuration n'est requise. Pour de plus amples informations, veuillez consulter Optimisation de la réplication des journaux binaires. |
Surveillance de la réplication parallèle
Utilisez les méthodes suivantes pour surveiller les performances de réplication et identifier les goulots d'étranglement en parallèle :
Schéma de performance
Tableaux clés pour le suivi du MTR :
performance_schema.replication_applier_status_by_worker— Affiche les détails des transactions gérées par chaque thread de travail, y compris les horodatages et les erreurs d'application.performance_schema.replication_applier_status_by_coordinator— Affiche des informations sur l'activité de mise en mémoire tampon du thread du coordinateur.
Pour évaluer la répartition uniforme du travail entre les threads de travail, utilisez la requête suivante :
SELECT a.channel_name, rw1.thread_id AS replica_worker_thread_id, ts1.count_star AS number_of_trx_executed, ROUND((ts1.count_star / sum_count_star) * 100, 2) AS percent_of_trx_executed_by_worker FROM ( SELECT rw.channel_name, SUM(ts.count_star) AS sum_count_star FROM performance_schema.events_transactions_summary_by_thread_by_event_name AS ts JOIN performance_schema.replication_applier_status_by_worker AS rw ON ts.thread_id = rw.thread_id GROUP BY rw.channel_name ) AS a JOIN performance_schema.replication_applier_status_by_worker AS rw1 ON a.channel_name = rw1.channel_name JOIN performance_schema.events_transactions_summary_by_thread_by_event_name AS ts1 ON rw1.thread_id = ts1.thread_id;
Si un ou deux travailleurs gèrent la majorité des transactions, cela indique de fortes dépendances entre les transactions, ce qui limite le parallélisme. Envisagez de passer au suivi des dépendances WRITESET sur la source.
Si les positions du I/O thread et du thread SQL sont proches l'une de l'autre mais Seconds_Behind_Source continuent de croître, le thread de coordination lui-même peut constituer le goulot d'étranglement. Vérifiez les délais performance_schema.replication_applier_status_by_coordinator de mise en mémoire tampon. Un goulot d'étranglement du coordinateur indique généralement de fortes dépendances entre les transactions ou un thread de coordinateur unique surchargé qui ne peut pas distribuer les événements assez rapidement.
Statistiques des répliques multithread dans le journal des erreurs
Quand log_error_verbosity=3 (par défaut), Aurora MySQL écrit régulièrement des statistiques de répliques multithread dans le journal des erreurs MySQL. Vous pouvez consulter ces entrées en :
Dans la console RDS, dans la section Journaux et événements, consultez le journal des erreurs.
Téléchargement via l'interface de ligne de commande AWS :
aws rds download-db-log-file-portion --db-instance-identifier <instance-id> --log-file-name error/mysql-error-running.logSi l'exportation CloudWatch des journaux est activée pour le journal des erreurs, recherchez dans le groupe de journaux exportés.
Pour localiser les entrées statistiques des répliques multithread dans le journal des erreurs, recherchez la chaîne illustrée dans l'exemple suivant. Le journal des erreurs MySQL utilise la terminologie héritée dans cette chaîne interne ; cette documentation utilise le terme préféré « réplique » dans l'ensemble de cette documentation.
Voici un exemple d'entrée du journal des erreurs :
2026-05-10 14:54:28.045308 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 7215200; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 1203644200 waited (count) when Workers occupied = 1022462 waited when Workers occupied = 62349203500
Principaux domaines à analyser :
| Champ | Description | Action |
|---|---|---|
| secondes se sont écoulées | Temps en secondes écoulé depuis la dernière sortie de statistiques. Aurora MySQL n'écrit pas de statistiques à intervalles réguliers. Il les écrit en fonction du nombre d'événements exécutés et du temps écoulé. | À utiliser pour calculer le débit : événements assignés/secondes écoulées = événements moyens par intervalle. |
| événements assignés | Nombre d'événements attribués par le thread coordinateur aux threads de travail depuis la dernière sortie. | Surveillez l'évolution du débit de réplication au fil du temps. |
| Les files d'attente des travailleurs sont remplies au-delà du niveau de dépassement | Nombre d'événements mis en file d'attente dans les threads de travail dépassant le niveau de dépassement (90 % de la longueur maximale de la file d'attente de 16 384 événements). Si zéro, aucun travailleur ne fonctionne à pleine capacité. | Indique que les travailleurs ne peuvent pas suivre le coordinateur. Vérifiez s'il y a des transactions de longue date ou des indices manquants. |
| A attendu en raison d'une file d'attente de travailleurs pleine | Nombre de fois que le coordinateur a dû attendre parce que la file d'attente d'un thread de travail était pleine (capacité atteinte à 100 %). | Vérifiez les transactions de longue durée, les index manquants ou bloquez les conflits sur les threads de travail. |
| J'ai attendu en raison de la taille totale | Nombre de fois que le coordinateur a attendu parce que la replica_pending_jobs_size_max limite était atteinte. Si un événement d'une ampleur inhabituelle dépasse cette taille, la transaction est suspendue jusqu'à ce que tous les travailleurs aient des files d'attente vides. |
Augmenterreplica_pending_jobs_size_max. Vérifiez les transactions importantes sur la source. |
| A attendu en cas de conflit d'horloge | Nombre de nanosecondes pendant lesquelles le coordinateur a attendu parce qu'une transaction dépendait d'une autre transaction qui n'avait pas encore été validée. Cela quantifie le temps pendant lequel les événements n'ont pas pu être attribués en raison de dépendances. | Passez au suivi des dépendances WRITESET sur la source. Assurez-vous que les tables possèdent des clés primaires. Il faut s'attendre à un certain décalage horaire. Concentrez-vous sur la réduction du ratio par rapport aux autres temps d'attente. |
| A attendu (comptage) lorsque les travailleurs occupaient | Nombre de fois où le coordinateur a dû attribuer le premier événement d'une transaction alors que toutes les files d'attente des travailleurs n'étaient pas vides. Le coordinateur reste en veille jusqu'à ce qu'une file d'attente soit vide. | Cela indique qu'replica_parallel_workersil est sous-approvisionné. Les dépendances ne sont pas le goulot d'étranglement : vous auriez pu exécuter plus d'événements en parallèle, mais vous n'aviez pas de threads de travail disponibles. Augmenterreplica_parallel_workers. |
| J'ai attendu quand les travailleurs occupaient | Nombre total de nanosecondes pendant lesquelles le coordinateur a dormi en attendant une file d'attente vide pour les travailleurs. | Des valeurs élevées confirment que la capacité des travailleurs constitue le goulot d'étranglement. Augmenterreplica_parallel_workers. |
Exemples pratiques : diagnostic des goulots d'étranglement liés à l'application parallèle
Les exemples suivants montrent comment utiliser les sources de surveillance précédentes pour diagnostiquer les goulots d'étranglement courants liés aux applications parallèles. Chaque exemple part du même symptôme (Seconds_Behind_Sourceil augmente régulièrement et vous avez déjà confirmé que le thread SQL est le goulot d'étranglementIdentifier le goulot d'étranglement lié au retard de réplication) et utilise les statistiques des répliques multithreads et le schéma de performances pour déterminer l'action corrective.
Exemple 1 : les travailleurs sont sous-approvisionnés
En CloudWatch, la ReplicaLag métrique augmente régulièrement, passant de près de zéro à environ 400 secondes en 30 minutes. L'utilisation du processeur sur la réplique reste autour de 55 %, ce qui n'est pas le cas de la réplique CPU-bound.
Pour vérifier où se situe le décalage, exécutez SHOW REPLICA STATUS deux fois, à 60 secondes d'intervalle. Read_Source_Log_Posavance d'environ 1,2 Go alors qu'elle n'Exec_Source_Log_Posavance que d'environ 300 Mo. Le I/O thread suit le rythme de la source, mais le thread SQL prend du retard : le thread SQL constitue le goulot d'étranglement.
Le MTR est activé avecreplica_parallel_workers=4. Récupérez les statistiques de répliques multithread les plus récentes à partir du journal des erreurs (voirStatistiques des répliques multithread dans le journal des erreurs) :
2026-05-10 14:54:28.045308 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 123; events assigned = 9876544; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 8455000 waited (count) when Workers occupied = 2456789 waited when Workers occupied = 110293847000
Interprétez les champs clés :
a attendu lorsque les travailleurs occupaient = 110293847000 nanosecondes, soit environ 110 secondes. Sur les 123 secondes de cet intervalle, le coordinateur a passé environ 90 % de son temps à attendre qu'un thread de travail soit libéré.
attendu en cas de conflit d'horloge = 8455000 nanosecondes, soit environ 0,008 seconde, ce qui est négligeable. Les dépendances liées aux transactions ne constituent pas le facteur limitant.
Diagnostic : le coordinateur dispose régulièrement d'un plus grand nombre de transactions indépendantes prêtes à être soumises qu'il n'a de travailleurs pour les gérer. L'attente en cas de conflit d'horloge étant négligeable, le parallélisme est limité par le nombre de travailleurs, et non par les dépendances.
Action : replica_parallel_workers augmentez le nombre de processeurs virtuels du réplica (par exemple, 16 sur adb.r6g.4xlarge) et relancez la réplication :
CALL mysql.rds_stop_replication; CALL mysql.rds_start_replication;
Vérification : une ligne de statistiques ultérieure indique que l'attente a presque disparu et ReplicaLag revient à moins de 5 secondes :
2026-05-10 15:02:14.882201 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 31840552; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 9120000 waited (count) when Workers occupied = 41233 waited when Workers occupied = 5980411000
« a attendu lorsque les travailleurs étaient occupés » est passé d'environ 110 secondes à environ 6 secondes, et le débit (événements attribués) a plus que triplé. Arrêtez d'augmenter le nombre de travailleurs lorsque l'utilisation du processeur approche les 80 % ou que le temps d'attente cesse de diminuer.
Exemple 2 : le suivi des dépendances COMMIT_ORDER sérialise une charge de travail à faible concurrence
La source est une instance Amazon RDS pour MySQL exécutant une charge de travail OLTP avec seulement 4 à 8 threads d'application actifs simultanément. La réplique est une db.r6g.4xlarge avec replica_parallel_workers=16 etreplica_parallel_type=LOGICAL_CLOCK. Malgré 16 employés, il reste ReplicaLag stable pendant environ 600 secondes et l'utilisation du processeur des répliques n'est que d'environ 20 %. Les travailleurs semblent inactifs.
Tout d'abord, vérifiez dans quelle mesure les transactions sont réparties de manière uniforme entre les employés à l'aide de la requête de répartition des travailleurs provenant de : Schéma de performance
+--------------+--------------------------+------------------------+-----------------------------------+ | channel_name | replica_worker_thread_id | number_of_trx_executed | percent_of_trx_executed_by_worker | +--------------+--------------------------+------------------------+-----------------------------------+ | | 45 | 1903556 | 96.41 | | | 46 | 23104 | 1.17 | | | 47 | 18995 | 0.96 | | | 48 | 16720 | 0.85 | . . +--------------+--------------------------+------------------------+-----------------------------------+
La sortie précédente montre les 4 premiers des 16 threads de travail. Un travailleur applique plus de 96 % des transactions tandis que les 15 autres sont presque inactifs (chacun des travailleurs restants a exécuté moins de 0,05 %). Apply est effectivement une série.
Ensuite, confirmez-le à l'aide des statistiques des répliques multithread dans le journal des erreurs :
2026-05-10 15:22:11.110432 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 2014500; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 98712340000 waited (count) when Workers occupied = 50122 waited when Workers occupied = 1209847000
attendu en cas de conflit d'horloge = 98712340000 nanosecondes, soit environ 99 des 120 secondes. Le coordinateur a passé environ 82 % de l'intervalle à ne pas pouvoir expédier la transaction suivante car cela dépendait d'une transaction encore en cours d'application.
a attendu lorsque les travailleurs occupaient = 1209847000 nanosecondes, soit environ 1,2 seconde. Les travailleurs étaient presque toujours libres, donc plus de travailleurs n'aident pas.
Cela indique un problème de dépendance et non un problème de capacité. Vérifiez la méthode de suivi des dépendances sur la source :
SELECT @@global.binlog_transaction_dependency_tracking;
+-------------------------------------------------+ | @@global.binlog_transaction_dependency_tracking | +-------------------------------------------------+ | COMMIT_ORDER | +-------------------------------------------------+
Cause première : avecCOMMIT_ORDER, la source décide quelles transactions peuvent être exécutées en parallèle en fonction des transactions validées ensemble dans le même commit de groupe de journaux binaires. Dans cette charge de travail à faible simultanéité, seule une poignée de threads sont validés à la fois. Les validations de groupe sont donc minimes. Par conséquent, la source estampille presque chaque transaction avec une last_committed valeur égale à celle de la transaction précédentesequence_number, la marquant comme dépendante de la transaction précédente. La réplique doit ensuite les appliquer les unes après les autres, même si elles modifient des lignes totalement indépendantes. C'est pourquoi 15 des 16 travailleurs restent inactifs.
Action : bascule la source vers le suivi des dépendances au niveau des lignes, qui est indépendant du calendrier de validation. Configurez-le dynamiquement et conservez-le dans le groupe de paramètres du cluster (ou de la base de données) :
SET GLOBAL binlog_transaction_dependency_tracking = WRITESET;
WRITESETcalcule un hachage des lignes que chaque transaction modifie, de sorte que les transactions touchant différentes lignes reçoivent des horodatages indépendants et peuvent être appliquées en parallèle quel que soit le moment où elles ont été validées. Assurez-vous que toutes les tables possèdent des clés primaires, car WRITESET produit des jeux d'écriture vides pour les tables qui n'en ont pas (voir). Résolution des problèmes de latence des threads SQL Sur MySQL 8.4, WRITESET est le paramètre par défaut et ce paramètre n'existe plus.
Vérification : après la modification, la requête sur la répartition des travailleurs montre que le travail est réparti de manière égale entre tous les travailleurs (indiquant les 4 premiers sur 16 ; chaque travailleur gère désormais environ 6 % des transactions) :
+--------------+--------------------------+------------------------+-----------------------------------+ | channel_name | replica_worker_thread_id | number_of_trx_executed | percent_of_trx_executed_by_worker | +--------------+--------------------------+------------------------+-----------------------------------+ | | 45 | 132540 | 6.30 | | | 46 | 125610 | 5.97 | | | 47 | 129774 | 6.17 | | | 48 | 122901 | 5.84 | . . +--------------+--------------------------+------------------------+-----------------------------------+
et les statistiques du journal des erreurs indiquent que les conflits d'horloge disparaissent lorsqu'ils ReplicaLag tombent presque à zéro :
2026-05-10 15:41:55.204713 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 19874100; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 412300000 waited (count) when Workers occupied = 88122 waited when Workers occupied = 7019847000
Les « conflits d'horloge en attente » sont passés d'environ 99 secondes à environ 0,4 seconde, le débit a été multiplié par dix et le goulot d'étranglement est passé des dépendances à la capacité de travail. À ce stade, vous pouvez ajuster le nombre de travailleurs comme dans l'exemple 1.
Exemple 3 : Une clé primaire manquante force le scan complet de la table sur la réplique
ReplicaLagaugmente au cours d'un traitement par lots nocturne qui s'exécute sur de grandes UPDATE quantités de DELETE relevés, puis se rétablit par la suite. Pendant le pic, le processeur de la réplique est modéré mais un travailleur semble bloqué.
Sur le réplica, exécutez SHOW PROCESSLIST et examinez les threads du programme de réplication. Un travailleur reste dans l'Updatingétat indiqué sur le même relevé pendant plusieurs secondes à la fois :
+----+-------------+------+---------+----------+------+ | Id | User | db | Command | State | Time | +----+-------------+------+---------+----------+------+ | 12 | system user | app | Connect | Updating | 38 | +----+-------------+------+---------+----------+------+
Vérifiez quelles tables répliquées ne possèdent pas de clé primaire à l'aide de la requête de détection provenant de Résolution des problèmes de latence des threads SQL :
+--------------+----------------+ | table_schema | table_name | +--------------+----------------+ | app | events_archive | +--------------+----------------+
Cause première : avec la journalisation ROW-based binaire, chaque ligne d'un DELETE événement UPDATE ou doit se trouver sur la réplique avant de pouvoir être appliquée. Si la table ne possède pas de clé primaire ou une clé unique NOT NULL, la réplique effectue une analyse complète de la table pour chaque ligne affectée. Sur un tableau de plusieurs millions de lignes, une opération par lots se transforme en millions de scans complets, et le collaborateur qui l'applique se bloque, bloquant la progression de l'application et augmentant le décalage.
Action : ajoutez une clé primaire à la table. Si vous ne pouvez pas définir de clé explicite immédiatement, activez les clés primaires invisibles générées (GIPK) en définissant le sql_generate_invisible_primary_key paramètre sur ON (disponible dans les versions d'Aurora MySQL 3 basées sur MySQL 8.0.30 et versions ultérieures), afin que les nouvelles tables reçoivent une clé primaire automatique (voir). Résolution des problèmes de latence des threads SQL
Vérification : après avoir ajouté la clé primaire, le worker ne s'attarde plusUpdating, le taux d'application du thread SQL se rétablit et ReplicaLag revient à la base de référence lors de la prochaine fenêtre de traitement par lots.
Exemple 4 : Une seule transaction importante ne peut pas être parallélisée
ReplicaLagsaute brusquement à une heure prévisible chaque jour, se maintient pendant plusieurs minutes, puis redescend à près de zéro. Le suivi des dépendances WRITESET est activé et toutes les tables ont des clés primaires. Les exemples précédents ne s'appliquent donc pas. replica_parallel_workers=16
Pendant la période de pointe, la requête de répartition des employés indique qu'un travailleur est occupé et que les autres sont inactifs, mais contrairement à l'exemple 2, le journal des erreurs n'indique ni conflits d'horloge élevés ni temps d'attente occupé par les travailleurs :
2026-05-10 02:13:40.551922 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 95; events assigned = 4120000; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 1530000 waited (count) when Workers occupied = 980 waited when Workers occupied = 210440000
Les temps d'attente liés à la dépendance et les temps d'attente occupés par les travailleurs sont faibles, mais un seul travailleur est actif. Cela permet d'éliminer à la fois le goulot d'étranglement lié à la dépendance (exemple 2) et le goulot d'étranglement lié à la capacité des travailleurs (exemple 1).
Inspectez le travailleur occupé à performance_schema.replication_applier_status_by_worker l'intérieur ou courezSHOW PROCESSLIST. Un seul travailleur applique une transaction pendant toute la durée du pic. Sur la source, une tâche d'application exécute une instruction volumineuse, DELETE FROM orders WHERE created_at < '2025-01-01' affectant par exemple plusieurs millions de lignes, en une seule transaction.
Cause principale : le MTR met en parallèle des transactions indépendantes ; il ne peut pas répartir une seule transaction entre les travailleurs. Une transaction importante est appliquée par un seul travailleur, donc l'ajout de travailleurs, le passage à WRITESET ou l'ajout de clés primaires n'aide pas. Pour de plus amples informations, veuillez consulter Multi-threaded réplication (MTR).
Action : divisez la grande opération en lots plus petits sur la source (par exemple, supprimez en morceaux de quelques milliers de lignes par transaction, avec une brève pause entre les lots). Les petites transactions sont effectuées de manière indépendante, de sorte que la réplique peut les répartir entre les employés. Planifiez des tâches en masse pendant les périodes de faible trafic, dans la mesure du possible.
Vérification : une fois la tâche groupée, le ReplicaLag pic quotidien s'aplatit et la requête de répartition des employés affiche le lot réparti entre plusieurs travailleurs au lieu d'un seul.
Supervision des meilleures pratiques
Configurez les CloudWatch alarmes sur la
ReplicaLagmétrique avec des seuils appropriés.Utilisez des tableaux de pulsations cardiaques pour une mesure du décalage plus précise que.
Seconds_Behind_SourcePar exemple, utilisezpt-heartbeat, qui nécessite une installation séparée (voir Percona Toolkitsur le site Web de Percona). Surveillez la
SumBinaryLogSizeCloudWatch métrique sur la source pour suivre le taux de génération de journaux binaires.Activez CloudWatch les exportations de journaux pour le journal des erreurs afin de conserver les statistiques des répliques multithread.
Utilisez la surveillance améliorée du processeur, de la mémoire et de I/O l'utilisation à la fois sur la source et sur la réplique.
Utilisez Amazon CloudWatch Database Insights pour identifier les principaux événements d'attente et les requêtes à l'origine de conflits de ressources. Performance Insights arrive en fin de vie le 31 juillet 2026 ; après cette date, la console Performance Insights redirige vers CloudWatch Database Insights. Choisissez le mode Database Insights qui répond à vos besoins : le mode standard préserve l'expérience de surveillance de base et la tarification, tandis que le mode avancé ajoute une surveillance au niveau du parc, des diagnostics de verrouillage et la capture du plan d'exécution. Pour de plus amples informations, veuillez consulter Surveillance de la charge de la base de données avec Amazon CloudWatch Database Insights sur Amazon Aurora.
Meilleures pratiques pour minimiser les délais de réplication
Les recommandations suivantes résument les principales mesures à prendre pour minimiser le retard de réplication. Pour obtenir des conseils détaillés sur chaque sujet, suivez les liens de référence.
-
Assurez-vous que toutes les tables possèdent des clés primaires — Sans clés primaires, la réplique effectue des analyses complètes des tables pour chaque ligne modifiée dans les opérations UPDATE et DELETE. Pour de plus amples informations, veuillez consulter Résolution des problèmes de latence des threads SQL.
-
Activez la réplication multithread avec WRITESET — Parallélise le SQL pour appliquer des transactions indépendantes. Pour plus de détails sur la configuration, consultezMulti-threaded réplication (MTR).
-
Utilisez au moins la même classe d'instance que la source : fournit suffisamment de ressources de processeur, de mémoire et de réseau pour la réplication. Pour de plus amples informations, veuillez consulter Stratégies d'optimisation pour le décalage des I/O threads.
-
Limitez la taille des transactions — Les transactions importantes réduisent le parallélisme et augmentent la longueur de la liste historique. Pour de plus amples informations, veuillez consulter Résolution des problèmes de latence des threads SQL.
-
Désactiver la journalisation binaire sur les répliques : définissez cette option
binlog_format=OFFà moins qu'une réplication en aval ne soit nécessaire. Pour plus de détails sur les paramètres, veuillez consulter la rubrique Configuration du MTR. -
Évitez les transactions et les requêtes de longue durée sur les répliques : les transactions de Long-running lecture empêchent la purge de la liste historique, ce qui peut dégrader les performances de réplication.
-
Activer GTID-based la réplication : assure le suivi automatique de la position et active le journal des relais en mémoire Aurora (Aurora MySQL 3.10+). Pour de plus amples informations, veuillez consulter Aurora-specific optimisations de réplication.