設定外部備用資源

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

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

設定外部備用資源設定

事前準備

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

來源執行個體需求

外部唯讀備用資源的來源執行個體必須是主要或獨立執行個體。您無法使用 Cloud SQL 唯讀備用資源做為外部唯讀備用資源的來源執行個體。有時會從主要執行個體的磁碟複製項重新建立唯讀備用資源,且唯讀備用資源無法維護其與外部唯讀備用資源的複製狀態。

設定主要執行個體

  1. 前往 Trusted 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. 在主要資源中插入一些資料,然後檢查備用資源,確認資料是否也出現在該處。

疑難排解

請參閱「Troubleshooting pglogical

後續步驟