Cette page explique comment configurer le basculement pour MySQL à l'aide de la réplication inversée. Le terme "fallback" fait référence à un plan de secours permettant de revenir à votre base de données MySQL source si vous rencontrez des problèmes avec Spanner.
La réplication inversée est utile lorsque vous rencontrez des problèmes inattendus et que vous devez revenir à la base de données MySQL d'origine avec un minimum d'interruption du service. La réplication inversée vous permet de revenir en arrière en répliquant les données écrites dans Spanner vers votre base de données MySQL source. Cela garantit que les deux bases de données sont cohérentes à terme.
Le flux de réplication inverse comprend les étapes suivantes, effectuées par le modèle Dataflow Spanner_to_SourceDb :
Lisez les modifications apportées à Spanner à l'aide des flux de modifications Spanner.
Assurez-vous que le mode de filtrage est défini sur
forward_migration.Transformez les données Spanner pour qu'elles soient compatibles avec le schéma de votre base de données source à l'aide de l'outil de migration Spanner. Pour en savoir plus, consultez Transformation personnalisée.
Vérifiez si la base de données source contient déjà des données plus récentes pour la clé primaire spécifiée.
Écrivez les données dans votre base de données source.
Utiliser le modèle Dataflow Spanner_to_SourceDb
Le modèle Dataflow assure la cohérence au niveau de la clé primaire. Le modèle crée des tables de métadonnées, appelées tables fictives, dans Spanner. Elles contiennent l'horodatage de commit de la dernière transaction d'écriture sur le shard pour cette table spécifique.
L'écriture est cohérente jusqu'au code temporel de validation de la clé primaire.
Vous pouvez configurer la tâche Dataflow qui effectue la réplication inverse pour qu'elle s'exécute dans l'un des modes suivants :
Standard : il s'agit du mode par défaut. Le job Dataflow lit les événements des flux de modifications Spanner, les convertit en types de données compatibles avec le schéma de la base de données source et les applique à la base de données source. La tâche réessaie automatiquement en cas d'erreur. Une fois les tentatives épuisées, les erreurs sont déplacées vers le dossier
severedu répertoire de la file d'attente de lettres mortes (DLQ) dans le bucket Cloud Storage. Le job déplace également toutes les erreurs permanentes vers le dossiersevere.RetryDLQ : dans ce mode, le job Dataflow lit les événements du dossier
severede la DLQ et les relance. Exécutez ce mode après avoir corrigé toutes les erreurs permanentes. Dans ce mode, la lecture s'effectue uniquement à partir de la DLQ, et non à partir des flux de modifications Spanner. Si les enregistrements traités à partir du dossierseveresont déplacés vers le dossierretry, le job les réessaie.
Avant de commencer
Assurez-vous que la connectivité réseau est établie entre votre base de données MySQL source et votre projetGoogle Cloud , dans lequel vos jobs Dataflow seront exécutés.
Ajoutez les adresses IP des nœuds de calcul Dataflow à la liste d'autorisation de votre instance MySQL de destination.
Vérifiez que les identifiants MySQL sont correctement spécifiés dans
source shards file.Vérifiez que votre instance MySQL est en ligne et en cours d'exécution.
Vérifiez que l'utilisateur MySQL dispose des droits
INSERT,UPDATEetDELETEsur la base de données MySQL.Vérifiez que vous disposez des autorisations IAM requises pour exécuter un modèle flexible Dataflow. Pour en savoir plus, consultez Créer et exécuter un modèle flexible.
Vérifiez que le port
12345est ouvert pour la communication entre les VM de nœud de calcul Dataflow.
Rôles requis
-
Pour obtenir les autorisations nécessaires pour lancer la réplication inversée, demandez à votre administrateur de vous accorder les rôles IAM suivants sur l'instance :
-
Utilisateur de bases de données Cloud Spanner (
roles/spanner.databaseUser) -
Développeur Dataflow (
roles/dataflow.developer)
-
Utilisateur de bases de données Cloud Spanner (
-
Pour vous assurer que le compte de service Compute Engine dispose des autorisations nécessaires pour lancer la réplication inversée, demandez à votre administrateur d'accorder les rôles IAM suivants au compte de service Compute Engine sur l'instance :
-
Utilisateur de bases de données Cloud Spanner (
roles/spanner.databaseUser) -
Accesseur de secrets Secret Manager (
roles/secretmanager.secretAccessor) -
Lecteur Secret Manager (
roles/secretmanager.viewer)
-
Utilisateur de bases de données Cloud Spanner (
Exécuter la réplication inverse
Pour exécuter la réplication inversée, procédez comme suit :
Importez le fichier de session dans le bucket Cloud Storage.
Créez une notification Pub/Sub pour le dossier
retrydu répertoire DLQ. Pour ce faire, créez un sujet Pub/Sub et un abonnement Pub/Sub pour ce sujet.Créez et préparez le modèle Dataflow. Pour en savoir plus, consultez Créer un modèle.
Exécutez le modèle Dataflow de réplication inversée à l'aide de la commande Google Cloud CLI suivante :
gcloud dataflow flex-template run "spanner-to-sourcedb-job" \ --project "PROJECT" \ --region "REGION" \ --template-file-gcs-location "TEMPLATE_SPEC_GCSPATH" \ --parameters "changeStreamName=CHANGE_STREAM_NAME" \ --parameters "instanceId=INSTANCE_ID" \ --parameters "databaseId=DATABASE_ID" \ --parameters "spannerProjectId=SPANNER_PROJECT_ID" \ --parameters "metadataInstance=METADATA_INSTANCE" \ --parameters "metadataDatabase=METADATA_DATABASE" \ --parameters "sourceShardsFilePath=SOURCE_SHARDS_FILE_PATH" \ --parameters "startTimestamp=START_TIMESTAMP" \ --parameters "endTimestamp=END_TIMESTAMP" \ --parameters "shadowTablePrefix=SHADOW_TABLE_PREFIX" \ [--parameters "sessionFilePath=SESSION_FILE_PATH"] \ [--parameters "filtrationMode=FILTRATION_MODE"] \ [--parameters "shardingCustomJarPath=SHARDING_CUSTOM_JAR_PATH"] \ [--parameters "shardingCustomClassName=SHARDING_CUSTOM_CLASS_NAME"] \ [--parameters "shardingCustomParameters=SHARDING_CUSTOM_PARAMETERS"] \ [--parameters "sourceDbTimezoneOffset=SOURCE_DB_TIMEZONE_OFFSET"] \ [--parameters "dlqGcsPubSubSubscription=DLQ_GCS_PUB_SUB_SUBSCRIPTION"] \ [--parameters "skipDirectoryName=SKIP_DIRECTORY_NAME"] \ [--parameters "maxShardConnections=MAX_SHARD_CONNECTIONS"] \ [--parameters "deadLetterQueueDirectory=DEAD_LETTER_QUEUE_DIRECTORY"] \ [--parameters "dlqMaxRetryCount=DLQ_MAX_RETRY_COUNT"] \ [--parameters "runMode=RUN_MODE"] \ [--parameters "dlqRetryMinutes=DLQ_RETRY_MINUTES"] \ [--parameters "sourceType=SOURCE_TYPE"] \ [--parameters "transformationJarPath=TRANSFORMATION_JAR_PATH"] \ [--parameters "transformationClassName=TRANSFORMATION_CLASS_NAME"] \ [--parameters "transformationCustomParameters=TRANSFORMATION_CUSTOM_PARAMETERS"] \ [--parameters "filterEventsDirectoryName=FILTER_EVENTS_DIRECTORY_NAME"]
Les variables obligatoires sont décrites dans la liste suivante :
project: ID du projet Google Cloud .region: la région Google Cloud .template-file-gcs-location: chemin d'accès au fichier Cloud Storage dans lequel vous avez préparé le modèle Dataflow.changeStreamName: nom du flux de modifications Spanner à partir duquel le job lit les données.instanceId: ID de l'instance Spanner.databaseId: ID de la base de données Spanner.spannerProjectId: ID du projet dans lequel résident vos instances Spanner.metadataInstance: instance qui stocke les métadonnées que le connecteur utilise pour contrôler la consommation des données de l'API Change Streams.metadataDatabase: base de données qui stocke les métadonnées que le connecteur utilise pour contrôler la consommation des données de l'API Change Streams.sourceShardsFilePath: chemin d'accès au fichier Cloud Storage contenant les informations du profil de connexion pour les partitions sources.
Les variables facultatives sont décrites dans la liste suivante :
startTimestamp: code temporel à partir duquel commencer à lire les modifications. La valeur par défaut est vide.endTimestamp: code temporel jusqu'auquel lire les modifications. Si vous ne fournissez pas d'horodatage, le processus lit les modifications indéfiniment. La valeur par défaut est vide.shadowTablePrefix: préfixe utilisé pour nommer les tables fantômes. La valeur par défaut estshadow_.sessionFilePath: chemin d'accès au fichier de session dans Cloud Storage contenant les informations de mappage de l'outil de migration Spanner.filtrationMode: mode qui détermine comment filtrer les enregistrements en fonction de critères. Les modes acceptés sontnoneouforward_migration.shardingCustomJarPath: emplacement (chemin d'accès) dans Cloud Storage du fichier JAR personnalisé contenant la logique permettant de récupérer l'ID du shard. La valeur par défaut est vide.shardingCustomClassName: nom complet de la classe qui contient l'implémentation de l'ID de partition personnalisé. Ce champ est obligatoire sishardingCustomJarPathest spécifié. La valeur par défaut est vide.shardingCustomParameters: chaîne contenant les paramètres personnalisés à transmettre à la classe de partitionnement personnalisée. La valeur par défaut est vide.sourceDbTimezoneOffset: décalage du fuseau horaire par rapport à UTC pour la base de données source. Exemple : +10:00. Par défaut : +00:00.dlqGcsPubSubSubscription: abonnement Pub/Sub utilisé dans une règle de notification Cloud Storage pour le répertoire de nouvelle tentative de la file d'attente de lettres mortes en moderegular. Spécifiez le nom au formatprojects/<PROJECT_ID>/subscriptions/<SUBSCRIPTION_ID>. Lorsque vous définissez ce paramètre, le système ignoredeadLetterQueueDirectoryetdlqRetryMinutes.skipDirectoryName: répertoire dans lequel le système écrit les enregistrements qu'il ignore lors de la réplication inversée. Valeur par défaut :skip.maxShardConnections: nombre maximal de connexions autorisées par partition. Valeur par défaut : 10 000.deadLetterQueueDirectory: chemin d'accès pour stocker la sortie de la DLQ. La valeur par défaut est un répertoire situé sous l'emplacement temporaire du job Dataflow.dlqMaxRetryCount: nombre maximal de nouvelles tentatives en cas d'erreurs temporaires via la file d'attente de lettres mortes. Valeur par défaut : 500.runMode: type de mode d'exécution. Les options sontregularouretryDLQ. UtilisezretryDLQpour ne réessayer que les enregistrements DLQ graves. Valeur par défaut :regular.dlqRetryMinutes: nombre de minutes entre les tentatives d'exécution de la file d'attente de lettres mortes. Par défaut : 10.sourceType: type de base de données source vers laquelle effectuer la réplication inversée. Par défaut :mysql.transformationJarPath: emplacement (chemin d'accès) dans Cloud Storage du fichier JAR personnalisé contenant la logique de transformation personnalisée pour le traitement des enregistrements lors de la réplication inversée. La valeur par défaut est vide.transformationClassName: nom de classe complet avec la logique de transformation personnalisée. Ce champ est obligatoire sitransformationJarPathest spécifié. La valeur par défaut est vide.transformationCustomParameters: chaîne contenant les paramètres personnalisés à transmettre à la classe de transformation personnalisée. La valeur par défaut est vide.filterEventsDirectoryName: répertoire dans lequel le système écrit les enregistrements qu'il ignore lors de la réplication inversée. Valeur par défaut :skip.