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 par flux PostgreSQL. Les modifications sont écrites dans le journal de transaction dans l'instance principale. L'émetteur WAL envoie l'enregistrement WAL au destinataire WAL dans l'instance dupliquée, où ils sont appliqués.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.
Le troisième est observé via la métrique replica_lag. Une valeur replica_lag élevée signifie que l'instance dupliquée ne peut pas appliquer les modifications de réplication suffisamment rapidement. Le temps de latence total peut être observé via la métrique replica_byte_lag, qui possède des libellés pour indiquer plus de détails. Ces métriques sont décrites dans la section Surveiller le délai avant réplication ci-dessous.
Vérifier que la réplique est correctement provisionnée
Une instance répliquée plus petite que l'instance principale (par exemple, avec moins de vCPU et de mémoire) peut entraîner un décalage de réplication. Une réplique plus petite peut également avoir des indicateurs de configuration par défaut différents de ceux d'une instance principale plus grande. Nous vous recommandons de choisir une instance répliquée au moins aussi grande que l'instance principale pour disposer de suffisamment de ressources pour gérer la charge de réplication.
Une utilisation élevée du processeur sur le réplica peut également entraîner un délai de réplication. Si l'utilisation du processeur de la réplique est élevée (par exemple, supérieure à 90 %), envisagez d'augmenter la capacité du processeur de la réplique.
Vous pouvez utiliser la commandeSHOW ALL pour afficher la configuration de l'instance répliquée et de l'instance principale, et les comparer pour identifier les différences.
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.
Requêtes de longue durée dans l'instance dupliquée avec accès en lecture
Les requêtes de longue durée effectuées dans l'instance dupliquée peuvent bloquer la réplication pour Cloud SQL.
Cela peut se produire lorsque la réplication tente d'appliquer des modifications (par exemple, à partir d'une opération VACUUM) à des lignes qui sont lues par une requête sur l'instance répliquée.
Vous pouvez souhaiter disposer d'instances dupliquées distinctes pour le traitement des transactions en ligne (OLTP) et le traitement analytique en ligne (OLAP), et n'envoyer que les requêtes de longue durée à l'instance dupliquée OLAP.
Pour résoudre les problèmes de blocage ou de retard de réplication causés par des transactions de longue durée, nous vous recommandons de procéder comme suit :
-
Ajustez les indicateurs de délai de veille. Les indicateurs
max_standby_archive_delayetmax_standby_streaming_delaycontrôlent le délai d'attente d'un réplica avant d'annuler les requêtes en veille qui entrent en conflit avec la réplication. Les valeurs raisonnables se situent souvent entre 30 et 60 secondes. Vous pouvez consulter la vuepg_stat_database_conflictspour obtenir des informations sur les conflits de requêtes. -
Activez l'option
hot_standby_feedback. Définir l'optionhot_standby_feedbacksurondans l'instance répliquée peut aider en retardant les opérations de nettoyage sur l'instance principale. Toutefois, cela peut entraîner un gonflement de la table sur le serveur principal. Il s'agit donc d'un compromis.
Pour en savoir plus, consultez la documentation PostgreSQL.
Latence réseau élevée
Une latence réseau élevée indique que les enregistrements WAL ne sont pas envoyés par l'instance principale ni reçus par l'instance répliquée assez rapidement. Cela peut être dû aux raisons suivantes :
- Réplication interrégionale : La réplication entre différentes régions peut entraîner une latence réseau plus élevée.
- Utilisation élevée du processeur principal. Si le processeur du nœud primaire est utilisé à plus de 90 %, il est possible que le processus d'envoi WAL ne dispose pas de suffisamment de temps CPU. Envisagez de réduire la charge sur le nœud principal ou d'augmenter son processeur.
- Utilisation élevée du processeur par les répliques. Si le processeur de la réplique est utilisé à plus de 90 %, il est possible que le processus de récepteur WAL ne dispose pas de suffisamment de temps CPU. Envisagez de réduire la charge sur la réplique ou d'augmenter son processeur.
- Problèmes de bande passante réseau ou goulots d'étranglement des E/S disque. Une région plus proche ou une configuration de disque avec un débit plus élevé peuvent être utiles. Envisagez de modifier la valeur du flag
wal_compressiondans l'instance principale pour réduire le trafic interrégional.
cloudsql.googleapis.com/database/replication/network_lag.
Cette métrique est limitée à 25 secondes, même si le décalage réel est plus important.
Cette métrique network_lag est semblable à la métrique cloudsql.googleapis.com/database/postgresql/replication/replica_byte_lag qui mesure le décalage sent_location en termes d'octets, comme indiqué par son libellé replica_lag_type.
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 est calculée à l'aide de |
| Octets de latence ( cloudsql.googleapis.com) |
Quantité d'octets de retard de l'état de l'instance dupliquée par rapport à l'état de la base de données principale.
|
| Latence du réseau ( cloudsql.googleapis.com) |
Durée, en secondes, nécessaire après le commit dans la base de données principale pour atteindre le récepteur WAL 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 : select status, last_msg_receipt_time from pg_stat_wal_receiver;
Si la réplication se produit, l'état streaming s'affiche, ainsi qu'un message "ast_msg_receipt_time" récent :
postgres=> select status, last_msg_receipt_time from pg_stat_wal_receiver;
status | last_msg_receipt_time
-----------+-------------------------------
streaming | 2020-01-21 20:19:51.461535+00
(1 row)
Si la réplication n'a pas lieu, un résultat vide est renvoyé:
postgres=> select status, last_msg_receipt_time from pg_stat_wal_receiver;
status | last_msg_receipt_time
--------+-----------------------
(0 rows)