Direkt zum Inhalt

Wie verhindere ich DDL-Operationen in meinen Amazon RDS für PostgreSQL- oder Aurora PostgreSQL-kompatiblen Instances während Blau/Grün-Bereitstellungen?

Lesedauer: 4 Minute
0

Ich möchte Data Definition Language (DDL)-Vorgängr in meinen Amazon Relational Database Service (Amazon RDS) für PostgreSQL- oder Amazon Aurora (Aurora) PostgreSQL-kompatiblen Edition-Instances verhindern. Die DDL-Vorgänge verursachen Fehler während einer Blau/Grün-Bereitstellung mit logischer Replikation.

Kurzbeschreibung

Wenn während einer Blau/Grün-Bereitstellung mit logischer Replikation ein DDL-Vorgang auf der Amazon RDS für PostgreSQL-Instance ausgeführt wird, erhältst du die folgende Fehlermeldung:

„Data definition language (DDL) changes aren't supported... Your green databases now have a status of REPLICATION_DEGRADED. Delete and recreate your blue/green deployment and avoid future DDL changes...“

Wenn du einen Switchover versuchst, blockiert Amazon RDS den Switchover und du erhältst die folgende Fehlermeldung:

„Switchover from DB cluster to... was cancelled because there are DDL or Large Object changes on... that can't be replicated. Delete the blue/green deployment along with the target cluster, then re-create it.“

DDL-Vorgänge in RDS für PostgreSQL-basierte Blau/Grün-Bereitstellungen können die logische Replikation zwischen Umgebungen beeinträchtigen und eine vollständige Neubereitstellung erfordern. Um dieses Problem zu vermeiden, musst du PostgreSQL-Ereignistrigger konfigurieren und Funktionen für die blaue Datenbank bei Blau/Grün-Bereitstellungen auslösen.

Du kannst jedoch die folgenden DDL-Vorgänge nicht verhindern:

  • Befehle, die auf gemeinsam genutzte Objekte wie Datenbanken, Rollen oder Tablespaces abzielen
  • Befehle, die auf Eventtrigger abzielen
  • Änderungen an großen Objekten in pg_largeobject

Hinweis: Dieses Problem betrifft RDS für PostgreSQL nur bei Hauptversions-Upgrades, wenn Amazon RDS die logische Replikation anstelle der physischen Replikation verwendet. Einschränkungen bei systemeigener logischer PostgreSQL-Replikation beschränken PostgreSQL-Blau/Grün-Bereitstellungen in während der logischen Replikation. Weitere Informationen findest du unter Einschränkungen auf der PostgreSQL-Website.

Lösung

PostgreSQL-Ereignistrigger und Triggerfunktionen konfigurieren

Erstelle die Ereignistrigger und Triggerfunktionen, bevor du eine Blau/Grün-Bereitstellung konfigurierst. Außerdem musst du jeden Ereignistrigger und jede Triggerfunktion in jeder Datenbank, die DDL-Schutz benötigt, separat erstellen, da Ereignistrigger auf Datenbankebene funktionieren. Die grüne Umgebung erbt standardmäßig Ereignistrigger und die Triggerfunktionen. Um DDL-Vorgänge in der grünen Umgebung auszuführen, lösche zunächst die Trigger und Funktionen, die du in der blauen Umgebung erstellt hast.

Gehe wie folgt vor, um die Ereignisrigger und Triggerfunktionen zu konfigurieren:

  1. Führe den folgenden Befehl aus, um sich als Superuser bei der Datenbank anzumelden:

    psql -U admin -h your_rds_endpoint -d your_database
  2. Führe den folgenden Befehl aus, um die DDL-Blockierungsfunktion zu erstellen:

    CREATE OR REPLACE FUNCTION schema_name.block_ddl_bg() RETURNS event_trigger   
    SECURITY DEFINER  
    AS $$  
    DECLARE  
        -- Define allowed users and roles here  
        allowed_users TEXT[] := ARRAY['rdsadmin', 'rdsrepladmin'];  
        allowed_roles TEXT[] := ARRAY['rdsrepladmin'];  
    BEGIN  
        -- Check if either the session user or current role is allowed  
        IF NOT (session_user = ANY(allowed_users) OR current_role = ANY(allowed_roles)) THEN  
            RAISE EXCEPTION 'DDL operations are blocked to prevent Blue Green Deployment replica degradation. User: %, Role: %, Status: BLOCKED',   
                session_user, current_role;  
        END IF;  
    END;  
    $$ LANGUAGE plpgsql;

    Hinweis: Ersetze im vorherigen Befehl schema_name durch dein Schema.

  3. Führe den folgenden Befehl aus, um die RBAC-Rolle zu erstellen:

    CREATE EVENT TRIGGER block_ddl_trigger   
        ON ddl_command_start  
        EXECUTE FUNCTION schema_name.block_ddl_bg();

    Hinweis: Ersetze im vorherigen Befehl schema_name durch dein Schema.

  4. Führe den folgenden Befehl aus, um die Trigger-Implementierung zu überprüfen:

    -- Check if the function exists  
    SELECT proname, pronamespace::regnamespace   
    FROM pg_proc   
    WHERE proname = 'block_ddl_bg';  
    
    -- Check if the event trigger exists  
    SELECT evtname, evtevent, evtowner::regrole   
    FROM pg_event_trigger   
    WHERE evtname = 'block_ddl_trigger';
  5. Führe den folgenden Befehl aus, um die Trigger zu testen:

    -- Try to create a test table  
    CREATE TABLE test_table (id int);  
    -- Should receive blocking message

Den Ereignistrigger und die Triggerfunktion entfernen

Nachdem du den Blau/Grün-Bereitstellungs-Switchover abgeschlossen oder die Blau/Grün-Bereitstellung außer Betrieb genommen hast, führe den folgenden Befehl aus.

Entferne den Ereignistrigger:

-- Remove event trigger  
DROP EVENT TRIGGER block_ddl_trigger;

Entferne die Triggerfunktion:

-- Remove trigger function  
DROP FUNCTION schema_name.block_ddl_bg();

Hinweis: Ersetze im vorherigen Befehl schema_name durch dein Schema.

Ähnliche Informationen

Ereignistrigger auf der PostgreSQL-Website

Auslösematrix für Ereignistrigger auf der PostgreSQL-Website

Aurora PostgreSQL-Einschränkungen für die Blau/Grün-Bereitstellungen

Einschränkungen von RDS für PostgreSQL für Blau/Grün-Bereitstellungen mit logischer Replikation

AWS OFFICIALAktualisiert vor 5 Monaten