在藍色/綠色部署期間,我如何阻止 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 相容執行個體中的 DDL 作業?
我想阻止 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 或 Amazon Aurora (Aurora) PostgreSQL 相容版執行個體中的資料定義語言 (DDL) 作業。在具有邏輯複寫的藍/綠部署期間,DDL 作業會導致錯誤。
簡短描述
在具有邏輯複寫的藍/綠部署期間,當在 Amazon RDS for PostgreSQL 執行個體上執行 DDL 作業時,您會收到下列錯誤訊息:
「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...」(不支援資料定義語言 (DDL) 變更...您的綠色資料庫現在的狀態為 REPLICATION_DEGRADED。請刪除並重新建立您的藍/綠部署,並避免將來進行 DDL 變更...)
當您嘗試切換時,Amazon RDS 會阻止切換,並且您會收到以下錯誤訊息:
「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 或大型物件變更。請刪除藍/綠部署以及目標叢集,然後重新建立。)
在基於 RDS for PostgreSQL 的藍/綠部署中,執行 DDL 作業可能會降低環境之間的邏輯複寫,並需要完全重新部署。為防止此問題,您必須在藍/綠部署期間,在藍色資料庫上設定 PostgreSQL 事件觸發程序和觸發函式。
但是,您無法阻止以下 DDL 作業:
- 針對共用物件 (例如資料庫、角色或資料表空間) 的命令
- 針對事件觸發程序的命令
- pg_largeobject 中的大型物件修改
**注意:**此問題只會在主要版本升級期間影響 RDS for PostgreSQL,此時 Amazon RDS 使用邏輯複寫而非實體複寫。原生 PostgreSQL 邏輯複寫的限制會限制邏輯複寫期間的 PostgreSQL 藍/綠部署。如需詳細資訊,請參閱 PostgreSQL 網站上的限制。
解決方法
設定 PostgreSQL 事件觸發程序和觸發函式
在設定藍/綠部署之前,建立事件觸發程序和觸發函式。此外,您必須在每個需要 DDL 保護的資料庫中,單獨建立每個事件觸發程序和觸發函式,因為事件觸發程序會在資料庫層級運作。綠色環境預設繼承事件觸發程序和觸發程序函式。若要在綠色環境中執行 DDL 作業,請先刪除在藍色環境中建立的觸發程序和函式。
若要設定事件觸發程序和觸發函式,請完成下列步驟:
-
執行以下命令,以超級使用者登入資料庫:
psql -U admin -h your_rds_endpoint -d your_database -
執行以下命令建立 DDL 封鎖函式:
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;**注意:**在上述命令中,將 schema_name 替換為您的結構描述。
-
執行以下命令來建立事件觸發程序:
CREATE EVENT TRIGGER block_ddl_trigger ON ddl_command_start EXECUTE FUNCTION schema_name.block_ddl_bg();**注意:**在上述命令中,將 schema_name 替換為您的結構描述。
-
執行以下命令來確認觸發程序的實作:
-- 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'; -
執行以下命令來測試觸發程序:
-- Try to create a test table CREATE TABLE test_table (id int); -- Should receive blocking message
移除事件觸發程序和觸發函式
完成藍/綠部署轉換或停用藍/綠部署後,執行以下命令。
移除事件觸發程序:
-- Remove event trigger DROP EVENT TRIGGER block_ddl_trigger;
移除觸發函式:
-- Remove trigger function DROP FUNCTION schema_name.block_ddl_bg();
**注意:**在上述命令中,將 schema_name 替換為您的結構描述。
相關資訊
PostgreSQL 網站上的事件觸發程序
PostgreSQL 網站上的事件觸發程序觸發矩陣
相關內容
- 已提問 3 年前
- 已提問 3 年前
- 已提問 2 年前
