Résilience multi-emplacements pour les pipelines de données¶
La résilience multi-emplacements pour les pipelines de données vous aide à protéger vos pipelines de données contre les pannes potentielles des fournisseurs Cloud à l’échelle régionale. Cette fonctionnalité garantit que, lors du basculement vers un emplacement secondaire, vos pipelines de données (en particulier ceux qui utilisent Snowpipe et COPY INTO) reprennent le chargement de nouvelles données sans interruption ou sans ingérer en double.
Cette fonctionnalité fonctionne inter-Cloud, ce qui permet à vos emplacements de stockage principal et de sauvegarde de s’étendre sur des fournisseurs Cloud totalement distincts (par exemple, en basculant depuis AWS vers Azure), ainsi qu’entre différentes régions dans le même Cloud.
Cette fonctionnalité s’appuie sur un modèle de responsabilité partagée :
Rôle de Snowflake : Snowflake réplique nativement vos tables cibles et votre historique de chargement (état d’ingestion) sur votre compte secondaire. Lors d’un basculement, Snowflake utilise cet état pour éviter les doublons et n’ingérer que les fichiers qui n’ont pas été traités dans l’emplacement principal.
Votre rôle : en cas de panne (ou dans le cadre d’une configuration Cloud à double écriture), vous devez acheminer les nouveaux fichiers entrants vers votre emplacement de stockage Cloud secondaire. Snowflake ne réplique pas vos fichiers de stockage Cloud externes.
La résilience des pipelines est alimentée en configurant jusqu’à deux ressources clés :
Intégration de stockage à plusieurs emplacements (MLSI) : connecte Snowflake en toute sécurité à plusieurs emplacements de stockage Cloud externes dans les régions ou les Clouds. La MLSI est nécessaire lorsque vous voulez garantir la résilience soit pour COPY INTO à partir de zones de préparation externes seules, soit pour votre pipeline Snowpipe.
Intégration de notifications à plusieurs files d’attente (MQNI) : connecte Snowflake à plusieurs files d’attente de messages Cloud tierces, garantissant la réception continue des nouvelles notifications de fichiers. La MQNI n’est nécessaire que si vous souhaitez garantir la résilience pour votre pipeline Snowpipe, c’est-à-dire pour un chargement continu des données.
Exigences et considérations¶
Avant de configurer cette fonctionnalité, examinez les conditions préalables et les considérations suivantes :
Exigences¶
Version : Snowflake Business Critical Edition (ou une version supérieure).
Méthodes d’ingestion prises en charge : cette fonctionnalité prend exclusivement en charge le chargement de données basé sur des fichiers via Snowpipe (intégration automatique) et COPY INTO <table>. Elle ne prend pas en charge Openflow ou Snowpipe Streaming.
Structures de chemins identiques : pour permettre à vos pipelines de localiser de nouveaux fichiers après le basculement, vous devez les écrire dans l’emplacement de stockage secondaire en utilisant exactement la même hiérarchie, la même structure de dossier et le même chemin relatif que votre emplacement principal.
Considérations¶
Facturation : cette fonctionnalité entraîne des frais de réplication standard (transfert de données et ressources de calcul), facturés sur votre compte cible.
Temps d’arrêt lié à la modification de la zone de préparation : modifier la propriété RELATIVE_URL sur une zone de préparation existante invalidera les objets dépendants et arrêtera l’ingestion. Nous vous recommandons de créer de nouvelles zones de préparation lors de la configuration afin d’éviter tout temps d’arrêt.
Intégration de notifications à plusieurs files d’attente (MQNI) : l’utilisation de la même file d’attente active dans les comptes source et cible n’est pas prise en charge. Cela pourrait entraîner une perte de notifications. Snowflake ne vérifie pas si la même file d’attente est utilisée entre plusieurs comptes.
Table de répertoire : la création d’une table de répertoire sur une zone de préparation à l’aide de la MLSI n’est actuellement pas prise en charge.
Comportement de réplication¶
Réplication asynchrone : Snowflake réplique vos tables et l’historique de chargement de votre pipeline dans le même instantané. Étant donné qu’elles sont synchronisées, une panne n’entraînera pas de données en double. Si votre base de données secondaire a quatre heures de retard, les données de la table ont également quatre heures de retard, et le traitement des notifications mises en file d’attente correspondant à ces quatre heures met simplement la table à jour.
Prévention de la perte de données en double écriture : votre objectif de point de récupération (RPO) est dicté par votre intervalle d’actualisation de réplication. Pour éviter toute perte de données lors d’un basculement, la période de conservation des messages de votre file d’attente de messages dans le Cloud secondaire doit être plus longue que votre intervalle de réplication. Si votre file d’attente supprime des messages avant que votre réplication planifiée ne soit rattrapée, ces fichiers ne seront pas ingérés lors du basculement.
Risque de perte de données en écriture unique : si vous utilisez le routage en écriture unique, tous les fichiers traités sur l’emplacement principal après votre dernière réplication réussie sont totalement inconnus de l’emplacement secondaire. Lors du basculement, ces données seront temporairement absentes de votre compte cible.
Avertissement
Avertissement important concernant la restauration en écriture unique : lorsque vous exécutez une actualisation pour revenir à votre compte principal d’origine, la base de données principale est remplacée par la base de données secondaire. Si vous ne récupérez pas et ne chargez pas manuellement ces fichiers orphelins dans votre base de données secondaire avant de les synchroniser, ils seront définitivement effacés de votre base de données principale.
Choisir la bonne architecture¶
Étant donné que Snowflake réplique de manière asynchrone vos tables cibles et l’historique de chargement de vos pipelines dans le même instantané, vos pipelines sont protégés contre la duplication des données et les chargements partiels. Si une panne survient à mi-ingestion, la transaction est complètement annulée afin qu’il n’y ait pas de fichiers partiellement chargés.
Cependant, la manière dont vous récupérez les fichiers « en cours » pendant une panne dépend entièrement de la configuration de votre routage de stockage Cloud externe pour le routage à double écriture ou à écriture unique.
1. Double-écritures - Recommandé¶
Votre application de production écrit simultanément des fichiers dans vos compartiments de stockage Cloud principal et secondaire. La file d’attente de messages secondaire accumule les notifications, mais Snowflake ne les traite pas, car la base de données secondaire est en lecture seule.
Ce qui se passe lors du basculement : la base de données secondaire devient accessible en écriture. Snowpipe lit la file d’attente secondaire et utilise l’historique de chargement répliqué pour dédupliquer les fichiers. Si une panne empêche un fichier de se terminer dans l’emplacement principal, le pipeline secondaire lit la notification dans la file d’attente secondaire, voit le fichier absent de l’historique de chargement et l’ingère.
Ce qui se passe lors de la restauration : lorsque l’emplacement principal est récupéré, que vous actualisez le groupe de basculement et que vous effectuez la restauration, Snowpipe démarre automatiquement l’ingestion de nouveaux fichiers, car l’historique de chargement a été synchronisé à partir du compte secondaire lors de la préparation de la restauration.
Résultat : aucune donnée manquante, aucun doublon. Snowflake gère automatiquement le rapprochement dans les deux directions.
Action nécessaire : aucune, au-delà de la synchronisation de réplication standard de pré-restauration (ALTER FAILOVER GROUP … REFRESH) pour s’assurer que le compte principal dispose de l’historique de chargement le plus récent.
2. Routage à écriture unique¶
Votre production écrit uniquement dans le stockage Cloud principal. En cas de panne, vous redirigez la production pour commencer à écrire de nouveaux fichiers dans le stockage Cloud secondaire.
Ce qui se passe lors du basculement : le compte secondaire commence immédiatement à traiter les nouveaux fichiers acheminés vers le compartiment secondaire. Cependant, tous les fichiers en cours bloqués dans l’emplacement principal affecté sont temporairement abandonnés.
Ce qui se passe lors de la restauration : lorsque l’emplacement principal est récupéré et que vous revenez à votre compte Snowflake principal, Snowpipe traite automatiquement toutes les notifications de fichiers qui ont atteint la file d’attente avant la panne.
Résultat : aucun doublon. Cependant, tous les fichiers pour lesquels la génération des notifications Cloud a complètement échoué en raison de la panne (ou lorsque la panne a dépassé la politique de conservation des messages de votre file d’attente) nécessitent une intervention manuelle.
Action nécessaire : après la restauration, comparez votre compartiment de stockage principal par rapport à la vue COPY_HISTORY dans Snowflake pour identifier les fichiers manquants. Exécutez ALTER PIPE … REFRESH ou une commande COPY INTO manuelle pour charger ces fichiers échoués spécifiques.
Partie 1 : Configuration unique (installation)¶
Les étapes suivantes sont effectuées une fois pour configurer vos pipelines de données résilients. Comme vous configurez les emplacements actifs des deux comptes lors de la configuration, le basculement lors d’une panne réelle est presque instantané.
Étape 1 : Créer une intégration de stockage multi-emplacements (MLSI)¶
Pour configurer une intégration de stockage multi-emplacements, vous suivez les étapes standard de configuration d’une intégration de stockage avec quelques différences notées dans cette section.
Dans votre compte source, créez la MLSI en fournissant des valeurs pour chaque emplacement dans la liste STORAGE_LOCATIONS. Vous pouvez mélanger et faire correspondre les fournisseurs Cloud pour les configurations inter-Cloud.
Où :
STORAGE_LOCATIONS : spécifie une liste d’un ou plusieurs emplacements de stockage (compartiment S3, compartiment GCS ou conteneur Azure) pour l’intégration de stockage. Pour voir les paramètres de chaque fournisseur Cloud, consultez les paramètres des fournisseurs Cloud (cloudProviderParams) sur la page de référence CREATE STORAGE INTEGRATION.
NAME : chaîne qui spécifie l’identificateur (nom) pour l’emplacement de stockage.
ENCRYPTION : spécifie le chiffrement pour l’emplacement de stockage. Vous devez spécifier le chiffrement pour l’emplacement de stockage au niveau de l’intégration de stockage plutôt qu’au niveau de la zone de préparation. Nécessaire uniquement pour le chargement à partir de fichiers chiffrés ; non requis si l’emplacement de stockage et les fichiers ne sont pas chiffrés. Pour afficher les options de chiffrement pour chaque fournisseur Cloud, consultez ENCRYPTION sur la page de référence CREATE STAGE.
ACTIVE : spécifie le nom de l’emplacement de stockage à définir comme emplacement actif pour l’intégration de stockage dans le compte actuel.
Pour l’emplacement de stockage actif dans votre compte source, vous devez configurer un contrôle d’accès et accorder à Snowflake l’autorisation d’accéder à votre stockage. Utilisez les instructions dans les rubriques suivantes :
Étape 2 : Associer l’MLSI à une zone de préparation externe¶
Nous vous recommandons fortement de créer une nouvelle zone de préparation plutôt que de modifier une zone existante.
Avertissement
WARNING : modifier RELATIVE_URL entraîne un temps d’arrêt
Si vous utilisez ALTER STAGE pour modifier l’RELATIVE_URL d’une zone de préparation existante, toutes les tables de répertoire dépendantes sont recréées, et toutes les tables ou tous les canaux externes utilisant cette zone de préparation sont marqués comme non valides et arrêteront l’ingestion. Préparez-vous à un temps d’arrêt si vous choisissez de modifier une zone de préparation existante.
Utilisez la commande CREATE STAGE pour associer l’intégration de stockage multi-emplacements que vous avez créée à une ou plusieurs zones de préparation externes :
Où :
RELATIVE_URL : le chemin relatif vers votre emplacement de zone de préparation externe à partir de l’emplacement de stockage défini dans votre intégration de stockage. Pour permettre à vos pipelines de localiser de nouveaux fichiers après le basculement, vous devez les écrire dans l’emplacement de stockage secondaire en utilisant la même hiérarchie, la même structure de dossier et le même chemin relatif que votre emplacement principal.
Note
Cette valeur doit être un chemin littéral. La spécification d’un modèle ou d’un caractère générique n’est pas prise en charge. Pour spécifier l’accès à tous les emplacements sous l’STORAGE_BASE_URL de votre intégration de stockage, utilisez une chaîne vide RELATIVE_URL = “”.
STORAGE_INTEGRATION : le nom de votre intégration de stockage multi-emplacements.
Note
Vous pouvez également modifier une zone de préparation externe existante en spécifiant le paramètre RELATIVE_URL et votre MLSI. La commande ALTER STAGE prend également en charge l’annulation de cette modification afin que la zone de préparation externe n’utilise pas d’intégration de stockage multi-emplacements.
Par exemple :
Étape 3 : Configurer une intégration de notifications à plusieurs files d’attente (MQNI)¶
Si vous utilisez un chargement de données automatisé via la messagerie Cloud et que vous avez configuré une intégration de stockage multi-emplacements pour votre zone de préparation externe, vous devez également utiliser une intégration de notifications à plusieurs files d’attente pour un basculement fluide de vos pipelines Snowpipe.
Pour chaque file d’attente que vous définissez pour l’intégration de notifications, vous devez préparer votre service de messagerie en utilisant les étapes des rubriques suivantes :
Configuration d’Amazon SNS pour automatiser Snowpipe à l’aide de notifications SQS. Créer une rubrique SNS pour chaque région AWS dans laquelle votre MLSI possède des emplacements de stockage.
Note
Si vous ne souhaitez pas utiliser Amazon SNS avec Snowpipe, vous pouvez éviter de créer une MQNI, mais vous devez effectuer une étape supplémentaire pendant le basculement. Si vous choisissez cette option, associez votre canal à la zone de préparation et à la MLSI créées précédemment, puis passez à l’étape 4.
Scénario A : Créer une nouvelle intégration de notifications à plusieurs files d’attente (MQNI)¶
Pour créer une intégration de notifications à plusieurs files d’attente, vous suivez les étapes standard de création d’une intégration de notifications avec quelques différences notées dans cette section.
Dans votre compte source, créez une intégration de notifications à plusieurs files d’attente en fournissant des valeurs pour chaque file d’attente dans la liste QUEUES :
Où :
TYPE = MULTI_QUEUE : spécifie qu’il s’agit d’une intégration à plusieurs files d’attente entre Snowflake et un service de mise en file d’attente de messages Cloud tiers.
DIRECTION = INBOUND : spécifie que Snowflake reçoit les notifications envoyées par le service de messagerie Cloud.
QUEUES : spécifie une liste d’une ou plusieurs files d’attente pour l’intégration de notifications.
NAME : chaîne qui spécifie l’identificateur (nom) de la file d’attente.
Pour afficher les paramètres de file d’attente spécifiques à chaque fournisseur de Cloud, consultez :
AWS:
NOTIFICATION_PROVIDER = AWS_SNS : spécifie Amazon Simple Notification Service (SNS) comme service Cloud tiers de mise en file d’attente des messages.
AWS_SNS_TOPIC_ARN : nom de la ressource Amazon (ARN) de la rubrique Amazon SNS vers laquelle les notifications sont poussées.
Google Cloud : CREATE NOTIFICATION INTEGRATION (entrante depuis une rubrique Google Pub/Sub)
Azure : CREATE NOTIFICATION INTEGRATION (entrante depuis une rubrique Azure Event Grid)
ACTIVE : spécifie le nom de la file d’attente à définir comme file d’attente active pour l’intégration de notifications dans le compte actuel.
Pour la file d’attente active de votre compte source, vous devez accorder à Snowflake l’autorisation d’accéder à votre service de messagerie. Suivez les instructions relatives à votre fournisseur Cloud :
Pour AWS, consultez S’abonner à la file d’attente SQS de Snowflake dans la rubrique SNS sous Conditions préalables : Créer un sujet et un abonnement Amazon SNS.
Pour Google Cloud, consultez Accorder un accès à Snowflake à l’abonnement Pub/Sub sous Configuration de l’automatisation à l’aide de Pub/Sub GCS.
Pour Azure, consultez Accorder un accès à Snowflake à la file d’attente de stockage sous Configuration de l’automatisation avec Azure Event Grid.
Après avoir créé une MQNI, vous pouvez l’utiliser pour créer un nouveau canal avec la commande CREATE PIPE. L’exemple suivant crée un canal pour charger des données de Amazon S3 dans une table à l’aide d’une zone de préparation externe (my_ext_stage) qui dépend d’une intégration de stockage multi-emplacements :
Scénario B : Migrer une intégration de notifications existante vers MQNI¶
Si vous disposez déjà d’intégrations de notifications existantes que vous souhaitez convertir en MQNI plutôt que d’en créer une nouvelle à partir de zéro, utilisez la fonction SYSTEM$CONVERT_PIPES_TO_MULTI_QUEUE.
La fonction crée une nouvelle intégration de notifications à plusieurs files d’attente à l’aide du nom que vous spécifiez, définit la file d’attente active de votre compte source comme file d’attente d’origine, puis migre automatiquement tous les canaux du compte source pour qu’ils utilisent la nouvelle MQNI.
Syntaxe :
Où :
new_mqni_name : chaîne qui spécifie un identificateur (nom) à attribuer à la nouvelle intégration de notifications à plusieurs files d’attente créée par la fonction.
original_sns_topic_arn_or_int_name:
Pour AWS, le nom de la ressource Amazon (ARN) de la rubrique SNS d’origine associée à un ou plusieurs canaux.
Pour Google Cloud ou Azure, une chaîne qui spécifie l’identificateur de votre intégration de notifications à file d’attente unique d’origine associée à un ou plusieurs canaux.
new_sns_topic_arn_or_int_name:
Pour AWS, le nom de la ressource Amazon (ARN) d’une nouvelle rubrique SNS à ajouter comme file d’attente à l’MQNI.
Pour Google Cloud ou Azure, une chaîne qui spécifie l’identificateur de votre nouvelle intégration de notifications à file d’attente unique à combiner avec l’intégration de notifications d’origine.
Exemple 1 : Ajouter une nouvelle file d’attente de rubrique SNS
Il en résulte une MQNI nommée my_mqni avec les files d’attente suivantes :
MY_MQNI-queue1 (pour la rubrique SNS active d’origine)
MY_MQNI-queue2 (pour la nouvelle rubrique SNS)
Exemple 2 : Combiner deux intégrations de notifications dans une MQNI
Il en résulte une MQNI nommée my_azure_mqni avec les files d’attente suivantes :
my_azure_ni_1 (pour la file d’attente active d’origine)
my_azure_ni_2 (pour la nouvelle file d’attente)
Note
Si vous voulez modifier la file d’attente active dans votre compte source, vous pouvez utiliser une instruction ALTER INTEGRATION … SET ACTIVE = “<my_queue>. Vous devez mettre en pause tous les canaux qui utilisent l’intégration de notifications avant de mettre à jour la file d’attente active.
Étape 4 : Répliquer votre MLSI et votre MQNI sur un compte cible¶
Note
Une opération d’actualisation supprime toutes les intégrations de stockage ou de notifications du compte cible qui ne sont pas des répliques, à moins que les objets n’aient des IDs globaux.
Pour plus d’informations, voir Réplication et objets dans les comptes cibles.
1. To replicate your multi-location storage integration and multi-queue notification integration, alter your existing replication or failover group to include STORAGE INTEGRATIONS and NOTIFICATION INTEGRATIONS in the ALLOWED_INTEGRATION_TYPES list.
Par exemple, utilisez la commande ALTER FAILOVER GROUP :
Ensuite, dans votre compte cible, effectuez une opération d’actualisation :
Étape 5 : Configurer les états actifs dans le compte cible¶
Après avoir effectué une opération d’actualisation, pour garantir un basculement fluide lors d’une panne réelle, configurez l’emplacement de stockage actif et la file d’attente (si vous utilisez une intégration de notifications) dans votre compte cible.
Dans votre compte cible :
Pour l’emplacement de stockage que vous souhaitez définir comme emplacement actif dans votre compte cible, suivez les instructions des rubriques suivantes pour accorder à Snowflake l’accès à votre stockage :
Activez le stockage secondaire : Définissez la MLSI pour utiliser votre emplacement de stockage de sauvegarde secondaire dans le compte cible.
Si vous utilisez une intégration de notifications à plusieurs files d’attente, accordez à Snowflake l’autorisation d’accès à votre service de messagerie pour la file d’attente que vous souhaitez définir comme active dans votre compte cible. Suivez les instructions relatives à votre fournisseur Cloud :
Pour AWS, consultez S’abonner à la file d’attente SQS de Snowflake dans la rubrique SNS sous Conditions préalables : Créer un sujet et un abonnement Amazon SNS.
Pour Google Cloud, consultez Accorder un accès à Snowflake à l’abonnement Pub/Sub sous Configuration de l’automatisation à l’aide de Pub/Sub GCS.
Pour Azure, consultez Accorder un accès à Snowflake à la file d’attente de stockage sous Configuration de l’automatisation avec Azure Event Grid.
Activer la file d’attente secondaire (si vous utilisez la MQNI) : Définissez la file d’attente active sur votre emplacement secondaire dans le compte cible.
Partie 2 : Étapes de basculement¶
Exécutez ces étapes lors d’une panne pour rediriger votre ingestion de données vers votre emplacement secondaire. Comme vos files d’attente actives et votre stockage ont été préconfigurés dans la configuration, ce processus nécessite un minimum de commandes.
Promouvoir le compte cible : Connectez-vous à votre compte cible et promouvez-le en tant que nouveau compte principal. Le chargement des données reprend automatiquement à partir de votre infrastructure Cloud secondaire.
Si vous n’utilisez pas Amazon SNS avec Snowpipe : Si vous n’utilisez pas SNS avec Snowpipe et que vous ne comptez que sur SQS, vous n’avez pas besoin de créer une MQNI. Au lieu de cela, appelez la fonction système suivante pour rétablir la liaison de votre canal lors du basculement.
Partie 3 : Étapes de restauration¶
Une fois que la panne est résolue et que votre emplacement principal est intègre, exécutez ces étapes pour ramener vos pipelines à l’emplacement principal.
Resynchroniser les données : Avant de promouvoir votre compte d’origine, vous devez récupérer toutes les données et modifications d’état qui se sont produites pendant la panne dans votre compte d’origine. Connectez-vous à votre compte principal d’origine (agissant actuellement comme compte secondaire) et lancez une actualisation manuelle :
Important
Attendez la fin complète de cette opération d’actualisation avant de passer à l’étape suivante. Le basculement avant la fin de la synchronisation peut entraîner une perte de données.
Avertissement
Avertissement critique pour la restauration en écriture unique : si vous utilisez le routage en écriture unique, tous les fichiers traités sur l’emplacement principal après votre dernière réplication réussie sont inconnus de l’emplacement secondaire. Lors du basculement, ces données sont temporairement absentes de votre compte cible. Lorsque vous exécutez une actualisation pour revenir à votre compte principal d’origine, la base de données principale est remplacée par la base de données secondaire. Si vous ne récupérez pas et ne chargez pas manuellement ces fichiers orphelins dans votre base de données secondaire avant de les synchroniser, ils sont définitivement effacés de votre base de données principale.
Promouvoir le compte d’origine : Une fois l’actualisation terminée, promouvez votre compte source d’origine en tant que compte principal.
Si vous n’utilisez pas Amazon SNS avec Snowpipe : Appelez la fonction système pour relier votre canal à l’emplacement source d’origine.
Partie 4 : Surveillance et validation¶
Après avoir initié un basculement ou une restauration, utilisez les commandes suivantes pour vérifier que vos pipelines de données ont été correctement redirigés et ont repris l’ingestion.
1. Vérifier les états d’intégration actifs¶
Confirmez que vos intégrations pointent vers le bon stockage et les bonnes files d’attente en vérifiant leurs propriétés. Cherchez la propriété ACTIVE dans la sortie :
2. Vérifier l’état du canal (Snowpipe uniquement)¶
Utilisez la fonction SYSTEM$PIPE_STATUS pour vous assurer que votre canal fonctionne et pour vérifier s’il met activement en file d’attente de nouveaux fichiers à partir de votre emplacement secondaire.
Recherchez « executionState » : « RUNNING » et vérifiez « pendingFileCount » pour confirmer qu’il reconnaît activement les nouveaux fichiers déposés dans votre compartiment secondaire.
3. Valider l’ingestion réussie (historique de chargement)¶
Pour garantir un chargement des données sans erreurs ni doublons, interrogez la vue COPY_HISTORY. Celle-ci montre exactement quels fichiers ont été ingérés, leur chemin source, et quand ils ont été chargés.
Vérifiez que les chemins file_name reflètent votre emplacement de stockage actif et que l’état indique LOADED.