Cette page explique comment résoudre les problèmes de délai avant réplication pour les instances dupliquées avec accès en lecture de Cloud SQL.
Présentation
Les instances dupliquées avec accès en lecture de Cloud SQL utilisent la réplication basée sur les lignes MySQL à l'aide des identifiants de transaction globaux (GTID). Les modifications sont écrites dans le journal binaire de l'instance principale et envoyées à l'instance dupliquée où elles sont reçues, puis appliquées à la base de données.Le délai avant réplication peut se produire dans plusieurs scénarios, par exemple :
- L'instance principale ne peut pas envoyer les modifications suffisamment rapidement à l'instance dupliquée.
- L'instance dupliquée ne peut pas recevoir les modifications suffisamment rapidement.
- L'instance dupliquée ne peut pas appliquer les modifications suffisamment rapidement.
network_lag pour surveiller les deux premiers scénarios, lorsque l'instance principale ne peut pas envoyer de modifications suffisamment rapidement ou que l'instance dupliquée ne peut pas recevoir les modifications suffisamment rapidement.
Le délai total est observé avec la métrique replica_lag.
La différence entre replica_lag et network_lag peut indiquer la troisième raison pour laquelle l'instance dupliquée ne peut pas appliquer les modifications de réplication suffisamment rapidement.
Ces métriques sont décrites dans la section Surveiller le délai avant réplication ci-dessous.
Configuration accélérée des instances dupliquées
Il existe deux manières d'accélérer l'application des modifications des instances dupliquées MySQL. Les utilisateurs peuvent configurer leurs instances dupliquées avec les options suivantes :
- Réplication parallèle
- Vidage haute performance
Réplication parallèle
La réplication parallèle peut aider à allonger le délai avant réplication en configurant l'instance dupliquée pour qu'elle utilise plusieurs threads agissant en parallèle pour appliquer les modifications à l'instance dupliquée. Pour savoir comment utiliser la réplication parallèle, consultez la page Configurer la réplication parallèle.
Vidage haute performance
Par défaut, Cloud SQL pour MySQL vide les journaux de rétablissement sur le disque après chaque transaction. Le vidage haute performance réduit la fréquence à laquelle les journaux de rétablissement sont vidés sur le disque une fois par seconde, ce qui améliore les performances d'écriture.
Définissez l'option innodb_flush_log_at_trx_commit sur l'instance dupliquée avec accès en lecture sur 2. Vous devez également définir l'option sync_binlog sur une valeur plus élevée pour que l'option innodb_flush_log_at_trx_commit soit efficace.
Pour plus d'informations sur cette option, consultez la section Conseils pour l'utilisation d'options.
Lorsque l'option innodb_purge_log_at_trx_commit est définie sur l'instance dupliquée avec accès en lecture et que Cloud SQL détecte un plantage, Cloud SQL recrée automatiquement cette instance.
Optimiser les requêtes et le schéma
Cette section fournit des suggestions d'optimisations courantes de requêtes et de schémas que vous pouvez appliquer pour améliorer les performances de réplication.
Niveau d'isolation de requête dans l'instance dupliquée avec accès en lecture
Les niveaux d'isolation de transaction REPEATABLE READ et SERIALIZABLE acquièrent des verrous susceptibles de bloquer les modifications de réplication. Envisagez de réduire le niveau d'isolation pour vos requêtes dans l'instance dupliquée. Le niveau d'isolation des transactions READ COMMITTED peut offrir de meilleures performances.
Transactions de longue durée dans la base de données principale
Si un grand nombre de lignes sont mises à jour au cours d'une même transaction, cela peut entraîner un pic soudain de modifications à appliquer à l'instance principale, puis à l'instance dupliquée. Cela s'applique aux mises à jour ou aux suppressions d'instructions uniques qui affectent de nombreuses lignes à la fois. Les modifications sont envoyées à l'instance dupliquée après leur commit. L'application d'un pic soudain de modifications au niveau de l'instance dupliquée peut augmenter les risques de conflits de verrous dans l'instance dupliquée si la charge des requêtes sur l'instance dupliquée est également élevée, ce qui entraîne un délai avant réplication donné.
Envisagez de diviser les transactions volumineuses en plusieurs transactions plus petites.
Clés primaires manquantes
Les instances dupliquées avec accès en lecture de Cloud SQL utilisent une réplication basée sur les lignes, qui fonctionne mal si les tables MySQL répliquées ne possèdent pas de clé primaire. Nous recommandons que toutes les tables répliquées possèdent des clés primaires.
Pour MySQL 8 ou une version ultérieure, nous vous recommandons de définir l'option sql_require_primary_key sur ON pour spécifier que les tables de votre base de données doivent disposer de clés primaires.
Verrous exclusifs en raison de LDD
Les commandes LDD (langage de définition de données), telles que ALTER TABLE et CREATE INDEX peuvent entraîner un délai avant réplication dans l'instance dupliquée en raison de verrous exclusifs. Pour éviter les conflits de verrouillage, envisagez de planifier l'exécution LDD pendant les périodes où la charge de la requête est inférieure sur les instances dupliquées.
Instance dupliquée surchargée
Si une instance dupliquée avec accès en lecture reçoit trop de requêtes, la réplication peut être bloquée. Envisagez de répartir les lectures entre plusieurs instances dupliquées pour réduire la charge sur chacune d'entre elles.
Pour éviter les pics de requêtes, envisagez de limiter les requêtes de lecture des instances dupliquées dans votre logique d'application ou dans une couche de proxy, si vous en utilisez une.
En cas de pics d'activité sur l'instance principale, envisagez de répartir les mises à jour.
Base de données principale monolithique
Envisagez de segmenter la base de données principale verticalement (ou horizontalement) pour éviter qu'une ou plusieurs tables en retard ne retiennent toutes les autres tables.
Surveiller le délai avant réplication
Vous pouvez utiliser les métriques replica_lag et network_lag pour surveiller le délai avant réplication et déterminer si la cause de ce délai se trouve dans la base de données principale, le réseau ou l'instance dupliquée.
| Métrique | Description |
|---|---|
| Délai avant réplication ( cloudsql.googleapis.com) |
Nombre de secondes de retard de l'état de l'instance dupliquée par rapport à l'état de l'instance principale. Il s'agit de la différence entre l'heure actuelle et l'horodatage d'origine auquel la base de données principale a validé la transaction actuellement appliquée sur l'instance dupliquée. En particulier, les écritures peuvent être considérées comme retardées même si elles ont été reçues par l'instance dupliquée, si celle-ci n'a pas encore appliqué l'écriture à la base de données. Cette métrique indique la valeur de |
| Numéro d'erreur du dernier thread d'E/S ( cloudsql.googleapis.com) |
Indique la dernière erreur qui a entraîné l'échec du thread d'E/S. Dans le cas contraire, la réplication est interrompue. Ceci est rare, mais peut se produire. Consultez la documentation MySQL pour comprendre ce que le code d'erreur indique. Par exemple, les fichiers binlog de l'instance principale ont pu être supprimés avant que l'instance dupliquée ne les reçoive.
Cloud SQL recrée automatiquement l'instance dupliquée si la réplication est interrompue.
Cette métrique |
| Numéro d'erreur du dernier thread SQL ( cloudsql.googleapis.com) |
Indique la dernière erreur à l'origine de l'échec du thread SQL. Dans le cas contraire, la réplication est interrompue. Ceci est rare, mais peut se produire. Consultez la documentation MySQL pour comprendre ce que le code d'erreur indique.
Généralement, Cloud SQL recrée automatiquement l'instance dupliquée si la réplication est interrompue.
Cette métrique |
| Latence du réseau ( cloudsql.googleapis.com) |
Durée, en secondes, nécessaire pour écrire le binlog dans la base de données principale et atteindre le thread d'E/S dans l'instance dupliquée. Si la valeur de |
Vérifier la réplication
Pour vérifier que la réplication fonctionne, exécutez l'instruction suivante sur l'instance dupliquée :
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Queueing master event to the relay log
Master_Host: xx.xxx.xxx.xxx
Master_User: cloudsqlreplica
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.199927
Read_Master_Log_Pos: 83711956
Relay_Log_File: relay-log.000025
Relay_Log_Pos: 24214376
Relay_Master_Log_File: mysql-bin.199898
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 24214163
Relay_Log_Space: 3128686571
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File: master_server_ca.pem
Master_SSL_CA_Path: /mysql/datadir
Master_SSL_Cert: replica_cert.pem
Master_SSL_Cipher:
Master_SSL_Key: replica_pkey.pem
Seconds_Behind_Master: 2627
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 321071839
Master_UUID: 437d04e9-8456-11e8-b13d-42010a80027b
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: System lock
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 437d04e9-8456-11e8-b13d-42010a80027b:52111095710-52120776390
Executed_Gtid_Set: 437d04e9-8456-11e8-b13d-42010a80027b:1-52113039508
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
Si la réplication se produit, la première colonne (Slave_IO_State) affiche Waiting
for master to send event ou un message similaire. En outre, le champ Last_IO_Error est vide.
Si la réplication n'a pas lieu, la colonne Slave_IO_State affiche l'état Connecting to master et la colonne Last_IO_Error affiche l'état error connecting to master cloudsqlreplica@x.x.x.x:3306.
Selon la documentation MySQL, voici d'autres champs d'intérêt intéressants liés au délai avant réplication :
| Champ | Description |
|---|---|
Master_Log_File |
Nom du fichier journal binaire source à partir duquel le thread d'E/S est en cours de lecture. |
Read_Master_Log_Pos |
Position dans le fichier journal binaire source actuel que le thread d'E/S a lu. |
Relay_Log_File |
Nom du fichier journal du relais que le thread SQL lit et exécute actuellement. |
Relay_Log_Pos |
Position dans le fichier journal du relais actuel jusqu'à ce que le thread SQL l'ait lu et exécuté. |
Relay_Master_Log_File |
Nom du fichier journal binaire source contenant l'événement le plus récent exécuté par le thread SQL. |
Dans l'exemple précédent, Relay_Master_Log_File a la valeur mysql-bin.199898.
Master_Log_File a pour valeur mysql-bin.199927. Le suffixe numérique 199898 est inférieur à 199927. Cela signifie que même si l'instance dupliquée a reçu un fichier journal mysql-bin.199927 plus récent, elle applique toujours l'ancien mysql-bin.199898.
Dans ce cas, le thread SQL est en retard dans l'instance dupliquée.
Vous pouvez également vous connecter à la base de données principale et exécuter la commande suivante :
SHOW MASTER STATUS;
Cette commande indique le fichier binlog en cours d'écriture dans la base de données principale.
Si le fichier journal binaire de la base de données principale est plus récent que Master_Log_File dans l'instance dupliquée, cela signifie que le thread d'E/S est en retard. L'instance dupliquée lit toujours un ancien fichier journal binaire à partir de la base de données principale.
Lorsque le thread d'E/S est en retard, la métrique network_lag est également élevée. Lorsque le thread SQL est en retard, mais que le thread d'E/S ne l'est pas, la métrique network_lag n'est pas aussi élevée, mais la valeur replica_lag est élevée.
Les commandes précédentes vous permettent d'observer les détails des délais avant qu'ils ne se produisent, mais les métriques network_lag et replica_lag vous permettent d'examiner les occurrences passées du retard.
Recréer une instance répliquée en retard
Recréez une instance répliquée en retard lorsque la réplication est en retard d'une durée acceptable.
Avec Cloud SQL, vous pouvez configurer votre instance répliquée avec accès en lecture pour qu'elle se recrée si la réplication est en retard au-delà d'une durée acceptable, et si ce retard persiste pendant au moins cinq minutes.
Si vous définissez un délai de réplication acceptable comme étant inférieur à 360 secondes (six minutes) et qu'un délai de réplication d'au moins 361 secondes persiste pendant plus de cinq minutes, l'instance principale crée un nouvel instantané d'elle-même au bout de cinq minutes, et le réplica en lecture est recréé à l'aide de cet instantané.
La recréation d'une instance répliquée avec accès en lecture en retard présente les avantages suivants :
- Vous contrôlez ce qui est considéré comme une plage acceptable pour le délai de réplication.
- Vous pouvez réduire le temps passé à résoudre les problèmes de délai de réplication de plusieurs heures, voire de plusieurs jours.
D'autres informations sur les fonctionnalités s'appliquent :
- Compatible avec les versions suivantes :
- MySQL 5.7
- MySQL 8.0
- MySQL 8.4
- Une plage acceptable pour le délai de réplication doit être définie en secondes.
- La valeur minimale acceptable est de 300 secondes ou cinq minutes.
- La valeur maximale acceptable est de 31 536 000 secondes, soit un an.
- Si vous activez l'option "Recréer le réplica en retard" pour une instance, mais que vous ne définissez pas le délai de réplication maximal acceptable, Cloud SQL utilise la valeur par défaut d'un an.
- Types d'instances compatibles :
- Instance dupliquée avec accès en lecture
- Instance dupliquée interrégionale avec accès en lecture
- Instance répliquée en cascade
- La valeur définie pour le champ
replicationLagMaxSecondsest spécifique à chaque instance de réplica. Si une instance principale comporte plusieurs instances répliquées, vous pouvez attribuer une valeur différente à chacune d'elles. - Lorsqu'une réplique est recréée, les utilisateurs peuvent s'attendre à une certaine indisponibilité pendant que les opérations suivantes sont effectuées :
- La réplication est arrêtée.
- La réplique est supprimée.
- Un instantané de l'instance principale est créé.
- La réplique est recréée à partir de ce dernier instantané. La nouvelle instance répliquée utilise le même nom et la même adresse IP que l'instance répliquée précédente. Par conséquent, MySQL doit s'arrêter et redémarrer.
- La nouvelle réplique commence à répliquer les données.
replicationLagMaxSecondsest un champ au niveau de l'instance. Chaque instance a sa propre valeur.Si vous disposez de plusieurs instances répliquées avec accès en lecture pour la même instance principale, vous pouvez définir une valeur unique pour le champ
replicationLagMaxSecondspour chaque réplica.Définir des seuils de temps différents pour différentes répliques peut vous aider à éviter un scénario dans lequel toutes les répliques sont mises hors service en même temps.
Activer l'option "Recréer le réplica en retard"
La fonctionnalité de recréation de l'instance répliquée en retard est désactivée par défaut. Pour l'activer lorsque vous créez une instance, utilisez l'une des méthodes suivantes :
gcloud
Utilisez la commande gcloud sql instances create pour créer une instance répliquée avec accès en lecture avec l'option
--replication-lag-max-seconds-for-recreate :
gcloud beta sql instances create REPLICA_INSTANCE_NAME \ --master-instance-name=PRIMARY_INSTANCE_NAME \ --database-version=DATABASE_VERSION \ --tier=TIER \ --edition=EDITION \ --region=REGION \ --root-password=PASSWORD \ --replication-lag-max-seconds-for-recreate=REPLICATION_LAG_MAX_SECONDS
Où :
REPLICA_INSTANCE_NAMEest le nom de l'instance de réplica.PRIMARY_INSTANCE_NAMEest le nom de l'instance principale.DATABASE_VERSIONcorrespond à la version de la base de données de l'instance. Exemple :MYSQL_8_0_31TIERcorrespond au type de machine que vous souhaitez utiliser pour l'instance répliquée. Exemple :db-perf-optimized-N-4Pour en savoir plus, consultez Configurations d'instances personnalisées.EDITIONcorrespond à l'édition que vous souhaitez utiliser pour l'instance répliquée. Exemple :ENTERPRISE_PLUSPour en savoir plus, consultez Créer une instance.REGIONest la région que vous souhaitez utiliser pour l'instance répliquée. Exemple :us-central1PASSWORDcorrespond au mot de passe racine de l'instance.REPLICATION_LAG_MAX_SECONDScorrespond à la latence ou au délai de réplication maximal acceptable en secondes. Exemple :600La valeur minimale acceptable est de 300 secondes ou cinq minutes. La valeur maximale acceptable est de 31 536 000 secondes, soit un an.
API REST
Le champ replicationLagMaxSeconds se trouve dans la ressource DatabaseInstance. Ajoutez ce champ au corps de la requête :
{ "settings": { "replicationLagMaxSeconds" :REPLICATION_LAG_MAX_SECONDS, } ... }
Où :
REPLICATION_LAG_MAX_SECONDScorrespond à la latence ou au délai de réplication maximal acceptable en secondes. Exemple :600
Mettre à jour le délai de recréation pour le décalage de réplication
Pour afficher les paramètres d'une instance, utilisez l'une des méthodes décrites dans Afficher les informations récapitulatives d'une instance.
Grâce à ces informations, vous pouvez choisir de mettre à jour ou non le délai de latence de réplication que vous avez spécifié comme acceptable avant la recréation du réplica.
gcloud
Utilisez la commande gcloud sql instances patch pour mettre à jour le délai de recréation de l'instance en fonction du temps de latence de la réplication :
gcloud beta sql instances patch INSTANCE_NAME \ --replication-lag-max-seconds-for-recreate=REPLICATION_LAG_MAX_SECONDS
Où :
INSTANCE_NAMEest le nom de l'instance.REPLICATION_LAG_MAX_SECONDScorrespond à la latence ou au délai de réplication maximal acceptable en secondes. Exemple :700Si vous souhaitez revenir à la valeur par défaut d'un an, saisissez31536000. La valeur minimale acceptable est de 300 secondes ou cinq minutes. La valeur maximale acceptable est de 31 536 000 secondes, soit un an.
API REST
Vous pouvez mettre à jour la règle à l'aide de instances.patch et instance.insert.
Pour voir un exemple de mise à jour du paramètre à l'aide de l'API REST, consultez Modifier une instance.
Limites
Les limites suivantes s'appliquent à la recréation des répliques en retard :
- Les valeurs de
replicationLagMaxSecondsne peuvent être définies qu'en secondes. - Les index créés sur l'instance répliquée avec accès en lecture avant une opération de recréation ne seront pas conservés. Si un index existe, créez un index secondaire après la recréation de la réplique.
- Pour éviter les temps d'arrêt fréquents sur les instances répliquées en lecture, les recréations sont limitées à une par jour et par instance.
- Les répliques de serveurs externes ne sont pas compatibles avec cette fonctionnalité.
- Si vous activez la recréation des instances répliquées en retard sur une instance répliquée en cascade, Cloud SQL recrée d'abord les instances répliquées feuilles afin de maintenir la cohérence de la réplication.
- La recréation d'une instance dupliquée interrégionale entraîne des coûts supplémentaires.
- Vous ne pouvez pas activer la recréation des instances répliquées en retard dans la console Google Cloud .