設定外部備用資源

本頁說明如何使用 logical decoding pglogical 擴充功能,設定 Cloud SQL 執行個體,將資料複製到 Cloud SQL 外部的備用資源。

如要進一步瞭解複製作業,請參閱關於 Cloud SQL 中的複製作業

設定外部備用資源

事前準備

開始這項工作前,您必須擁有符合外部副本需求的 Cloud SQL 執行個體和外部 PostgreSQL 執行個體。

設定主要執行個體

  1. 前往 Google Cloud 控制台的 Cloud SQL 執行個體頁面
  2. 在主要執行個體上,為外部副本的 IP 位址啟用存取權。

    如要瞭解如何啟用 IP 存取權,請參閱「設定 IP 連線存取權」一文。

  3. 請記下主要執行個體的公開 IP 位址和公開傳出 IP 位址,稍後會用到。您可以在執行個體的「總覽」頁面找到這些值。
  4. 按一下右上角的 Cloud Shell 圖示
  5. 在 Cloud Shell 提示中,使用內建的 PostgreSQL 用戶端連線至主要執行個體:
       
    gcloud sql connect PRIMARY_INSTANCE_NAME \
    --user=postgres
       
       
  6. 輸入根密碼。接著應該會看到 postgres 提示。
  7. 建立具有 REPLICATION 屬性的 PostgreSQL 使用者。
    CREATE USER REPLICATION_USER WITH REPLICATION IN ROLE cloudsqlsuperuser LOGIN PASSWORD 'REPLICATION_USER_PASSWORD';
       
  8. 安裝及設定 pglogical 擴充功能:

    編輯 Cloud SQL 執行個體,新增並設定下列標記:

    • cloudsql.enable_pglogical
    • cloudsql.logical_decoding
    • max_replication_slots
    • max_worker_processes
    • max_wal_senders
    • 如要進一步瞭解這些標記,請參閱 PostgreSQL 資源頁面。

    重新啟動資料庫,然後登入並切換至 replication_user, 建立 pglogical 擴充功能:

    CREATE EXTENSION pglogical;
       
  9. 建立 pglogical 節點:

    pglogical「節點」代表實體 PostgreSQL 執行個體,並儲存該執行個體的連線詳細資料。

    SELECT pglogical.create_node(
      node_name := 'provider',
      dsn := 'host=PRIMARY_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD'
       );
       
  10. 如果您要從新的資料庫開始,請在主要和副本執行個體上建立相同的資料庫和資料表。例如:
    CREATE DATABASE test;
    
    \connect test;
    
    CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);
    INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
    
    CREATE EXTENSION pglogical;
  11. 如果主要執行個體上已有資料庫,您必須在副本上建立相同的資料庫。如要這麼做,請將資料庫從主要執行個體匯出至 Cloud Storage 值區,然後匯入副本。進一步瞭解如何 將 Cloud SQL 的資料匯出至 Cloud Storage 中的 SQL 傾印檔案
  12. 為支援將不同資料集複製到不同目的地,pglogical 採用了複製集的概念。舉例來說,如要將資料表新增至預設複寫集:
    SELECT pglogical.replication_set_add_table('default', 'replica_test', true);
       

設定外部備用資源

  1. 建立複製專用使用者,並授予複製權限:
    CREATE USER REPLICATION_USER WITH REPLICATION SUPERUSER LOGIN PASSWORD 'REPLICATION_USER_PASSWORD';
       
  2. 如果您要從新的資料庫開始,請使用 REPLICATION_USER 在主要和副本執行個體上建立相同的資料庫和資料表。例如:
    CREATE DATABASE test;
    \connect test;
    CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);
    INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
      
  3. 如果您要使用從主要執行個體匯出的檔案,為外部副本執行個體植入資料,請從 Cloud Storage 下載匯出的檔案。如果外部副本位於 Compute Engine 執行個體上,您可以使用 gcloud storage 指令下載檔案:
    gcloud storage cp gs://BUCKET_NAME/DUMP_FILE_NAME .
        
  4. 將檔案匯入資料庫。
    psql --user=postgres --password < DUMP_FILE_NAME.
    
  5. 請根據作業系統安裝「pglogical」。舉例來說,在執行 PostgreSQL 13 版的 Debian 系統上,sudo apt-get install postgresql-13-pglogical
  6. 以 replication_user 身分登入資料庫,並設定下列參數:
    ALTER SYSTEM SET shared_preload_libraries = 'pglogical';
    ALTER SYSTEM SET max_replication_slots = #; (where # is the same as you set on the primary).
    ALTER SYSTEM SET max_worker_processes = #; (where # is the same as you set on the primary).
    # Logout of the database and restart it. For example,
    # sudo /etc/init.d/postgresql restart
    # Log back in the database as the replication_user.
    # Since the pglogical extension is created local to each database, you need to
    # execute CREATE EXTENSION pglogical in each database you create, so if you
    # haven't already done that:
    CREATE EXTENSION pglogical;
       

    For more information about these flags, see the PostgreSQL resources page.

  7. 建立 pglogical 節點:
    SELECT pglogical.create_node(
      node_name := 'subscriber',
      dsn := 'host=REPLICA_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD'
      );
      
  8. 建立 pglogical 訂閱:
    SELECT pglogical.create_subscription(
        subscription_name := 'SUBSCRIPTION_NAME',
        provider_dsn := 'host=PRIMARY_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD'
    );
      
  9. 查看訂閱狀態:
    SELECT * FROM pglogical.show_subscription_status('SUBSCRIPTION_NAME');
       
  10. 如果狀態顯示為 replicating,表示設定成功。
  11. 在主要資源中插入一些資料,然後檢查備用資源,確認資料也出現在該處。

疑難排解

請參閱「pglogical 疑難排解

後續步驟