Le déploiement blue-green met à niveau la version majeure du moteur ApsaraDB RDS for PostgreSQL en restaurant l'instance source vers une nouvelle instance, puis en exécutant pg_upgrade pour porter la nouvelle instance à la version cible. Si vous effectuez un basculement, le point de terminaison de l'instance source bascule automatiquement vers la nouvelle instance, sans nécessiter de modification des chaînes de connexion dans votre application.
Pour comparer tous les modes de mise à niveau disponibles, consultez la rubrique Présentation des solutions de mise à niveau des versions majeures.
Prérequis
Avant de commencer, assurez-vous que :
L'instance exécute ApsaraDB RDS for PostgreSQL 16 ou une version antérieure.
L'instance n'est ni une instance en lecture seule ni une instance de cluster dédié.
Babelfish n'est pas activé sur l'instance (le numéro de version mineure du moteur ne se termine pas par
babelfish).
Facturation
Lorsque vous lancez une mise à niveau par déploiement blue-green, le système crée une nouvelle instance basée sur l'instance source. Les deux instances sont facturées séparément jusqu'à ce que vous libériez l'instance source.
| Méthode de facturation de l'instance source | Méthode de facturation de la nouvelle instance |
|---|---|
| Abonnement ou paiement à l'utilisation | Paiement à l'utilisation |
| Serverless | Serverless |
Une fois que vous avez confirmé la stabilité de vos services sur la nouvelle instance, convertissez celle-ci en abonnement et libérez ou résiliez l'instance source.
Tenez compte des points suivants avant de libérer l'instance source :
Si votre instance source est sous abonnement et n'a pas expiré, la nouvelle instance ne peut pas hériter de la durée d'abonnement restante. La libération anticipée de l'instance source peut entraîner une perte financière. Pour plus d'informations sur les règles de remboursement, consultez la rubrique Politique de remboursement.
La nouvelle instance n'hérite d'aucune remise appliquée à l'instance source. Vérifiez le montant exact du remboursement sur la page de résiliation de l'instance avant de procéder.
Les remboursements pour les instances sous abonnement ne sont pas traités en temps réel. Le montant et le délai de remboursement dépendent de la facture de résiliation réelle.
Impacts potentiels
Examinez les éléments suivants avant de lancer la mise à niveau.
Interruption de service
Lors d'un déploiement blue-green avec basculement, l'instance source passe en lecture seule pendant l'opération, ce qui provoque une interruption transitoire des connexions. Effectuez la mise à niveau pendant les heures creuses. Si vous n'effectuez pas de basculement, vos services ne sont pas affectés.
Durée en lecture seule : elle dépend du nombre d'objets de base de données. Exécutez
SELECT count(1) FROM pg_class;pour vérifier ce nombre. Avec des millions d'objets, la période en lecture seule peut durer plusieurs dizaines de minutes, voire plus.Durée de l'interruption de connexion : elle est déterminée par le temps d'actualisation du cache DNS côté client. Utilisez la fonctionnalité de commutation de vSwitch pour estimer cette valeur à l'avance.
Durée totale de la mise à niveau : elle dépend du nombre d'objets de base de données. Suivez la progression dans le Task Hub.
Après le basculement, l'instance source reste en lecture seule par défaut. Pour autoriser à nouveau les écritures sur l'instance source, définissez le paramètre rds_force_trans_ro_non_sup sur off. Consultez la rubrique Définir les paramètres de l'instance.
Chemin de mise à niveau inter-version
Les instances PostgreSQL 9.4 et 10 utilisant des disques locaux haute performance ne peuvent être mises à niveau que vers des disques cloud, avec PostgreSQL 14 comme version cible directe maximale. Pour atteindre PostgreSQL 15 ou une version ultérieure, vous devez d'abord effectuer une mise à niveau vers une version intermédiaire :
PostgreSQL 9.4 : peut être mis à niveau vers les versions 10, 11, 12, 13 ou 14 comme étape intermédiaire.
PostgreSQL 10 : peut être mis à niveau vers les versions 11, 12, 13 ou 14 comme étape intermédiaire.
Slots de réplication
Si l'instance source est un éditeur avec des slots de réplication, ces slots sont perdus après la mise à niveau.
Si l'instance source est un abonné à un slot de réplication, la mise à niveau peut provoquer des problèmes de synchronisation des données en raison de la préemption des slots de réplication. Consultez la section FAQ pour savoir comment prévenir ce problème.
Modifications de l'adresse IP virtuelle
Après un basculement, l'adresse IP virtuelle de la nouvelle instance change. Vérifiez les configurations de pare-feu et toute configuration d'application qui référence directement l'adresse IP virtuelle. Pour éviter cette complexité, configurez votre application en utilisant l'adresse de connexion de l'instance plutôt que l'adresse IP virtuelle.
Modifications des paramètres
Les paramètres non pris en charge dans la version cible sont automatiquement supprimés.
Les paramètres dont les valeurs se situent en dehors de la plage valide pour la version cible sont réinitialisés aux valeurs par défaut du modèle de la version cible.
Pendant la mise à niveau, le paramètre
statement_timeoutest temporairement défini sur0et restauré à sa valeur d'origine une fois la mise à niveau terminée.
Tâches DTS
Si l'instance est une source ou une destination pour Data Transmission Service (DTS), recréez la tâche DTS après la mise à niveau.
Compatibilité des plugins
La mise à niveau met automatiquement à jour l'instance vers la dernière version mineure du moteur. Vérifiez la compatibilité des plugins avant et après la mise à niveau.
Paramètres non hérités par la nouvelle instance
La nouvelle instance n'hérite pas du nom de l'instance source, ni des tags, des règles d'alerte CloudMonitor ou des données de sauvegarde.
Étape 1 : Exécuter la vérification préalable à la mise à niveau
Connectez-vous à la console ApsaraDB RDS. Dans la barre de navigation supérieure, sélectionnez la région où réside l'instance. Localisez l'instance et cliquez sur son ID.
-
(Facultatif) Si des instances en lecture seule existent pour l'instance source, modifiez le point de terminaison de l'instance en lecture seule dans votre application pour le faire pointer vers le point de terminaison de l'instance principale pendant les heures creuses, puis supprimez l'instance en lecture seule.
La suppression des instances en lecture seule avant la mise à niveau est nécessaire car les nœuds en lecture seule et les slots de réplication ne sont pas automatiquement transférés vers la nouvelle instance. Après la mise à niveau, créez de nouvelles instances en lecture seule sur la nouvelle instance.
-
Dans le volet de navigation de gauche, cliquez sur Major Version Upgrade.
Si l'option Major Version Upgrade n'est pas visible, vérifiez que votre instance respecte les prérequis listés ci-dessus.
Sous l'onglet Upgrade Check, cliquez sur Create upgrade check report.
Sélectionnez la version cible, définissez le paramètre Upgrade Mode sur Blue-green Deployment, puis cliquez sur OK. Le statut de l'instance passe à Maintaining Instance. Une fois la vérification terminée, le statut revient à Running.
-
Consultez le résultat du rapport de vérification :
Success ou Warning : passez à l'étape 2.
Failed : cliquez sur View Information, corrigez les problèmes identifiés et relancez la vérification.
ImportantEn cas de résultat Warning, corrigez tous les éléments signalés et relancez la vérification jusqu'à obtenir un résultat Success.
Si vous créez un plugin sur l'instance principale après une vérification réussie, relancez la vérification avant de poursuivre.
Étapes suivantes
-
Si vous avez effectué la mise à niveau via la méthode blue-green deployment (cutover), une fois que vous avez confirmé la stabilité de vos services sur la nouvelle instance, libérez l'instance source. Convertissez la méthode de facturation de la nouvelle instance en abonnement pour réduire les coûts.
La libération d'une instance sous abonnement avant son expiration peut entraîner une perte financière. La nouvelle instance n'hérite d'aucune remise de l'instance source. Les remboursements dépendent de la facture de résiliation réelle et ne sont pas traités en temps réel.
-
(Facultatif) Si vous avez supprimé une instance en lecture seule avant la mise à niveau, recréez-la sur la nouvelle instance :
Créez une instance en lecture seule PostgreSQL sur la nouvelle instance.
Dans votre application, mettez à jour le point de terminaison pour qu'il pointe vers la nouvelle instance en lecture seule.
Référence API
| Opération API | Description |
|---|---|
| UpgradeDBInstanceMajorVersionPrecheck | Exécute une vérification préalable à la mise à niveau d'une version majeure |
| DescribeUpgradeMajorVersionPrecheckTask | Interroge le rapport de vérification préalable à la mise à niveau |
| UpgradeDBInstanceMajorVersion | Met à niveau la version majeure du moteur |
| DescribeUpgradeMajorVersionTasks | Interroge l'historique des tâches de mise à niveau des versions majeures |
Références
FAQ
Puis-je modifier l'instance pendant une mise à niveau de version majeure ?
Non. L'instance ne peut pas être modifiée tant qu'une mise à niveau est en cours. Les modifications ne sont possibles qu'une fois la mise à niveau terminée.
Les mises à niveau automatiques de version majeure sont-elles prises en charge ?
Non. Les mises à niveau de version majeure doivent être déclenchées manuellement.
Les rétrogradations de version majeure sont-elles prises en charge ?
Non. La rétrogradation n'est pas prise en charge après une mise à niveau de version majeure. Pour exécuter une version inférieure, achetez une nouvelle instance avec cette version et utilisez Data Transmission Service (DTS) pour migrer vos données.
Après une mise à niveau de version majeure, j'obtiens un conflit raster_overviews lors de la création d'une vue sur la nouvelle instance. Comment résoudre ce problème ?
Ce problème survient lorsque la version de PostGIS est antérieure à la 2.5.2 et que vous effectuez une mise à niveau de PostgreSQL 10 ou 11 vers PostgreSQL 12 sans avoir d'abord mis à niveau le plugin PostGIS.
Étape 1 : Mettre à niveau le plugin PostGIS sur l'instance source.
Exécutez la commande suivante deux fois pour vous assurer que la mise à niveau se termine avec succès :
SELECT PostGIS_Extensions_Upgrade();
SELECT PostGIS_Extensions_Upgrade();
Étape 2 : Choisir la correction en fonction de l'utilisation ou non du plugin PostGIS Raster.
Si le plugin PostGIS Raster est utilisé :
-
Sur l'instance source, détachez la vue
raster_overviewsde l'extension et remplacez-la par un espace réservé :ALTER EXTENSION PostGIS_Raster DROP VIEW raster_overviews; CREATE OR REPLACE VIEW raster_overviews AS SELECT 1; Mettez à niveau l'instance PostgreSQL vers PostgreSQL 12 au minimum.
-
Après la mise à niveau, recréez la vue sur la nouvelle instance :
CREATE OR REPLACE VIEW raster_overviews AS SELECT current_database() AS o_table_catalog, n.nspname AS o_table_schema, c.relname AS o_table_name, a.attname AS o_raster_column, current_database() AS r_table_catalog, split_part( split_part(s.consrc, '''::name', 1), '''', 2 )::name AS r_table_schema, split_part( split_part(s.consrc, '''::name', 2), '''', 2 )::name AS r_table_name, split_part( split_part(s.consrc, '''::name', 3), '''', 2 )::name AS r_raster_column, trim( both from split_part(s.consrc, ',', 2) )::integer AS overview_factor FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n, ( SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) As consrc FROM pg_constraint ) AS s WHERE t.typname = 'raster'::name AND a.attisdropped = false AND a.atttypid = t.oid AND a.attrelid = c.oid AND c.relnamespace = n.oid AND c.relkind = ANY( ARRAY[ 'r'::char, 'v'::char, 'm'::char, 'f'::char ] ) AND s.connamespace = n.oid AND s.conrelid = c.oid AND s.consrc LIKE '%_overview_constraint(%' AND NOT pg_is_other_temp_schema(c.relnamespace) AND has_table_privilege(c.oid, 'SELECT'::text); ALTER EXTENSION PostGIS_Raster ADD VIEW raster_overviews;
Si le plugin PostGIS Raster n'est pas utilisé :
-
Supprimez le plugin sur l'instance source :
DROP EXTENSION PostGIS_Raster; Mettez à niveau l'instance PostgreSQL vers PostgreSQL 12 au minimum.
Comment prévenir l'incohérence des données causée par la préemption des slots de réplication lors d'une mise à niveau ?
Si l'instance source est un abonné à un slot de réplication, le slot de réplication peut être préempté par la nouvelle instance pendant la mise à niveau, ce qui peut entraîner une incohérence des données.
Pour conserver les données d'abonnement sur l'instance source (version inférieure) : assurez-vous que l'instance source ne tombe pas en panne en raison d'une charge excessive pendant la mise à niveau afin d'éviter la préemption du slot de réplication. Une fois la mise à niveau terminée, désactivez l'abonnement sur la nouvelle instance :
\c your_database
ALTER SUBSCRIPTION your_subscription_name DISABLE;
Pour préserver les données d'abonnement sur la nouvelle instance (version supérieure) : désactivez l'abonnement sur l'instance source avant de démarrer la mise à niveau, puis activez-le sur la nouvelle instance une fois la mise à niveau terminée.
Désactivation sur l'instance source :
\c your_database
ALTER SUBSCRIPTION your_subscription_name DISABLE;
Activation sur la nouvelle instance :
\c your_database
ALTER SUBSCRIPTION your_subscription_name ENABLE;
Pour plus d'informations, consultez les rubriques Logical Subscription et Change Tracking.
Comment gérer l'incohérence des données d'abonnement après une mise à niveau ?
Si une incohérence s'est déjà produite, utilisez l'approche suivante pour la reconcilier :
Sur la nouvelle instance, supprimez les données de la table concernée, puis recréez l'abonnement avec
copy_data=true. Pour plus de détails, consultez la documentation ALTER SUBSCRIPTION.-
Utilisez
ON CONFLICTpour importer les données depuis l'instance source. L'exemple suivant montre comment gérer différents scénarios de conflit :CREATE TABLE my_tbl(id INT PRIMARY KEY, t TIMESTAMP, val TEXT); INSERT INTO my_tbl VALUES (1, CURRENT_TIMESTAMP, 'a'); INSERT INTO my_tbl VALUES (2, CURRENT_TIMESTAMP, 'b'); INSERT INTO my_tbl VALUES (3, CURRENT_TIMESTAMP, 'c'); -- Newer timestamp: update the existing row INSERT INTO my_tbl VALUES (1, CURRENT_TIMESTAMP, 'd') ON CONFLICT(id) DO UPDATE SET t = excluded.t, val = excluded.val WHERE my_tbl.t < excluded.t; -- Older timestamp: keep the existing row INSERT INTO my_tbl VALUES (2, CURRENT_TIMESTAMP - '10 hours'::interval, 'e') ON CONFLICT(id) DO UPDATE SET t = excluded.t, val = excluded.val WHERE my_tbl.t < excluded.t; -- New row: insert directly INSERT INTO my_tbl VALUES (5, CURRENT_TIMESTAMP - '10 hours'::interval, 'f') ON CONFLICT(id) DO UPDATE SET t = excluded.t, val = excluded.val WHERE my_tbl.t < excluded.t;
Pourquoi dois-je supprimer les instances en lecture seule avant la mise à niveau ?
Les nœuds en lecture seule et les slots de réplication de l'instance source ne sont pas automatiquement transférés vers la nouvelle instance après la mise à niveau. La suppression de l'instance en lecture seule avant la mise à niveau évite les conflits de points de terminaison et garantit un basculement propre. Après la mise à niveau, créez une nouvelle instance en lecture seule sur la nouvelle instance et mettez à jour le point de terminaison de votre application en conséquence.