建立唯讀備用資源

本頁面說明如何為 Cloud SQL 執行個體建立唯讀副本。

唯讀副本是主要執行個體的副本,在正常情況下,會近乎即時地反映主要執行個體的變更。您可以使用唯讀副本,從主要執行個體卸載讀取要求或數據分析流量。

此外,您也可以執行區域遷移,以便進行災難復原。如果副本是跨區域副本,您可以容錯移轉至其他區域,具體來說,就是將副本升級為獨立執行個體 (在這種情況下,現有副本不會將該執行個體視為主要執行個體)。

如要進一步瞭解複製功能的運作方式,請參閱「Cloud SQL 中的複製功能」。

事前準備

如果您要為這個執行個體建立第一個副本,請確認該執行個體符合主要執行個體的需求條件。瞭解詳情。

建立唯讀副本

建立唯讀副本的步驟如下。

控制台

  1. 前往 Cloud de Confiance 控制台的「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面。

    前往「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面

  2. 找出要建立副本的執行個體,然後開啟清單旁的 more actions 選單。
  3. 選取「建立唯讀副本」。

    如果沒有看到這個選項,表示該執行個體是副本,您無法為副本建立副本。

  4. 在頁面的「Customize your instance」(自訂執行個體) 部分,更新副本設定。首先,請按一下「Show configuration options」(顯示設定選項),顯示設定群組。接著,展開所需群組,查看及自訂設定。右側會顯示所選選項的摘要。您可以視需要自訂這些設定。在未進行任何自訂的情況下,系統會指派預設值。

    如要進一步瞭解各項設定,請參閱「關於執行個體設定」頁面。

    舉例來說,如要允許其他 Cloud de Confiance by S3NS 服務 (例如 BigQuery) 存取 Cloud SQL 中的資料,並透過內部連線對這些資料執行查詢,請展開「Connections」(連線) 群組,然後取消選取「Public IP」(公開 IP) 核取方塊。

  5. 按一下「Create replica」(建立副本)。

    Cloud SQL 會視需要建立備份,並建立副本。您會回到主要執行個體的頁面。

gcloud

建立副本:

gcloud sql instances create REPLICA_NAME \
--master-instance-name=MASTER_INSTANCE_NAME

如有需要,您可以使用 --tier 參數指定不同的級別大小。此外,如果您是從主要執行個體建立副本,且執行個體的 Cloud SQL 版本為 Enterprise 或 Enterprise Plus (16 以上版本),則不必指定這個參數的值。副本會沿用主要執行個體的機型。

您可以使用 --region 參數指定其他區域。

如果主要執行個體只有內部 IP 位址,而您想允許其他 Cloud de Confiance by S3NS 服務 (例如 BigQuery) 透過內部連線存取 Cloud SQL 中的資料,並對這些資料執行查詢,請在指令中加入 --enable-google-private-path 參數。

您必須在與主要執行個體相同的虛擬私有雲網路中建立副本。您也可以在該虛擬私有雲網路中指定 allocated-ip-range-name。如未指定範圍,系統會在隨機範圍內建立副本。

Terraform

如要建立唯讀副本,請使用 Terraform 資源。

resource "google_sql_database_instance" "read_replica" {
  name                 = "postgres-replica-instance-name"
  master_instance_name = google_sql_database_instance.primary.name
  region               = "europe-west4"
  database_version     = "POSTGRES_14"

  settings {
    tier              = "db-custom-2-7680"
    availability_type = "ZONAL"
    disk_size         = "100"
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

REST v1

使用執行個體資源的 insert 方法建立唯讀副本。region 和 databaseVersion 屬性必須與主要執行個體相同。

使用任何要求資料之前,請先修改下列項目的值:

  • project-id:專案 ID
  • database-version:列舉版本字串 (例如 POSTGRES_12)
  • primary-instance-name:主要執行個體的名稱
  • primary-instance-region:主要執行個體的區域
  • replica-region:副本執行個體的區域
  • replica-name:副本執行個體的名稱
  • machine-type:機器類型的列舉字串。例如:「db-custom-1-3840」
  • private-network:您要新增或選取來建立私人連線的授權網路。

您可以使用 sqlNetworkArchitecture 欄位,強制執行個體在建立時使用新的網路架構,即使專案尚未完全升級也沒問題。如要進一步瞭解新版網路架構及其影響,請參閱「 將執行個體升級為新版網路架構」和「分配 IP 位址範圍」。

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances

JSON 要求主體:

{
  "masterInstanceName": "primary-instance-name",
  "project": "project-id",
  "databaseVersion": "database-version",
  "name": "replica-name",
  "region": "replica-region",
  "settings":
  {
    "tier": "machine-type",
    "settingsVersion": 0,
    "ipConfiguration": {
    object (IpConfiguration)
  },
  {
  "ipv4Enabled": false,
  "privateNetwork": private-network,
  "requireSsl": boolean,
  "authorizedNetworks": [
    {
      object (AclEntry)
    }
  ],
  "allocatedIpRange": string
    }
  },
  "sqlNetworkArchitecture": "NEW_NETWORK_ARCHITECTURE"
}

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

REST v1beta4

使用執行個體資源的 insert 方法建立唯讀副本。region 和 databaseVersion 屬性必須與主要執行個體相同。

使用任何要求資料之前,請先修改下列項目的值:

  • project-id:專案 ID
  • database-version:列舉版本字串 (例如 POSTGRES_12)
  • primary-instance-name:主要執行個體的名稱
  • primary-instance-region:主要執行個體的區域
  • replica-region:副本執行個體的區域
  • replica-name:副本執行個體的名稱
  • machine-type:機器類型的列舉字串。例如:「db-custom-1-3840」
  • private-network:您要新增或選取來建立私人連線的授權網路。

您可以使用 sqlNetworkArchitecture 欄位,強制執行個體在建立時使用新的網路架構,即使專案尚未完全升級也沒問題。如要進一步瞭解新版網路架構及其影響,請參閱「 將執行個體升級為新版網路架構」和「分配 IP 位址範圍」。

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances

JSON 要求主體:

{
  "masterInstanceName": "primary-instance-name",
  "project": "project-id",
  "databaseVersion": "database-version",
  "name": "replica-name",
  "region": "replica-region",
  "settings":
  {
    "tier": "machine-type",
    "settingsVersion": 0,
    
    "ipConfiguration": {
    object (IpConfiguration)
  },
  {
  "ipv4Enabled": false,
  "privateNetwork": private-network,
  "requireSsl": boolean,
  "authorizedNetworks": [
    {
      object (AclEntry)
    }
  ],
  "allocatedIpRange": string
    }
    
  },
  "sqlNetworkArchitecture": "NEW_NETWORK_ARCHITECTURE"
}

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

為已啟用 Private Service Connect 的執行個體建立唯讀副本

如要為已啟用 Private Service Connect 的執行個體建立唯讀副本,請使用 gcloud CLI 或 API。您可以在與主要執行個體相同的區域或不同區域 (跨區域唯讀副本) 建立這個副本。

唯讀副本無法從連線類型不同的執行個體複製。舉例來說,啟用 Private Service Connect 的執行個體只能從另一個 Private Service Connect 執行個體複製資料。此外,也無法從支援外部 IP 連線的執行個體,或設定私人服務存取權的執行個體複製資料。

gcloud

如要建立執行個體的唯讀副本,請使用 gcloud sql instances create 指令:

gcloud sql instances create REPLICA_INSTANCE_NAME \
--master-instance-name=PRIMARY_INSTANCE_NAME \
--project=PROJECT_ID \
--region=REGION_NAME \
--enable-private-service-connect \
--allowed-psc-projects=ALLOWED_PROJECTS \
--availability-type=AVAILABILITY_TYPE \
--no-assign-ip

請依指示取代下列項目:

  • REPLICA_INSTANCE_NAME:副本執行個體的名稱。
  • PRIMARY_INSTANCE_NAME:主要執行個體的名稱。
  • PROJECT_ID:執行個體所在 Cloud de Confiance 專案的 ID 或專案編號。
  • REGION_NAME:副本執行個體的區域名稱。
  • ALLOWED_PROJECTS:允許的專案 ID 或編號清單,以半形逗號分隔。如果專案不在這份清單中,就無法用來建立執行個體,並為執行個體啟用 Private Service Connect。

    Cloud SQL 不會將主要執行個體的允許專案複製到副本。您必須為每個副本建立 Private Service Connect 端點。如果您使用 Cloud SQL Auth Proxy 或 Cloud SQL 語言連接器,請為副本建立 DNS 區域和 DNS 記錄。

  • AVAILABILITY_TYPE:為執行個體啟用高可用性。請為這項參數指定下列其中一個值:
    • REGIONAL:啟用高可用性,建議用於正式版執行個體。執行個體會容錯移轉至所選區域內的其他可用區。
    • ZONAL:不提供容錯移轉功能。這是預設值。

    如要進一步瞭解如何設定及移除執行個體的高可用性,請參閱「為現有執行個體設定高可用性」和「停用執行個體的高可用性」。

REST v1

使用任何要求資料之前,請先修改下列項目的值:

  • PRIMARY_INSTANCE_NAME:主要執行個體的名稱。
  • PROJECT_ID:執行個體所在 Cloud de Confiance 專案的 ID 或專案編號。
  • REPLICA_INSTANCE_NAME:副本執行個體的名稱。
  • REGION_NAME:副本執行個體的區域名稱。
  • MACHINE_TYPE:執行個體的機型。
  • AVAILABILITY_TYPE:為執行個體啟用高可用性。請為這項參數指定下列其中一個值:
    • REGIONAL:啟用高可用性,建議用於正式版執行個體。執行個體會容錯移轉至所選區域內的其他可用區。
    • ZONAL:不提供容錯移轉功能。這是預設值。

    如要進一步瞭解如何設定及移除執行個體的高可用性,請參閱「為現有執行個體設定高可用性」和「停用執行個體的高可用性」。

  • ALLOWED_PROJECTS:允許的專案 ID 或編號清單,以半形逗號分隔。如果專案不在這份清單中,就無法用來建立執行個體,並為執行個體啟用 Private Service Connect。

    Cloud SQL 不會將主要執行個體的允許專案複製到副本。您必須為每個副本建立 Private Service Connect 端點。如果您使用 Cloud SQL Auth Proxy 或 Cloud SQL 語言連接器,則必須為副本建立 DNS 區域和 DNS 記錄。

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances

JSON 要求主體:

{
  "masterInstanceName": "PRIMARY_INSTANCE_NAME",
  "project": "PROJECT_ID",
  "databaseVersion": "POSTGRES_13",
  "name": "REPLICA_INSTANCE_NAME",
  "region": "REGION_NAME",
  "kind": "sql#instance",
  "settings":
  {
    "tier": "MACHINE_TYPE",
    "availabilityType": "AVAILABILITY_TYPE",
    "settingsVersion": 0,
    "ipConfiguration": {
      "ipv4Enabled": false,
      "pscConfig": {
        "allowedConsumerProjects": [ALLOWED_PROJECTS],
        "pscEnabled": true
      }
    },
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "ASYNCHRONOUS",
    "tier": "MACHINE_TYPE"
  }
}

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/REPLICA_INSTANCE_NAME",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "operationType": "CREATE_REPLICA",
  "name": "OPERATION_ID",
  "targetId": "REPLICA_INSTANCE_NAME",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

REST v1beta4

使用任何要求資料之前,請先修改下列項目的值:

  • PRIMARY_INSTANCE_NAME:主要執行個體的名稱。
  • PROJECT_ID:執行個體所在 Cloud de Confiance 專案的 ID 或專案編號。
  • REPLICA_INSTANCE_NAME:副本執行個體的名稱。
  • REGION_NAME:副本執行個體的區域名稱。
  • MACHINE_TYPE:執行個體的機型。
  • AVAILABILITY_TYPE:為執行個體啟用高可用性。請為這項參數指定下列其中一個值:
    • REGIONAL:啟用高可用性,建議用於正式版執行個體。執行個體會容錯移轉至所選區域內的其他可用區。
    • ZONAL:不提供容錯移轉功能。這是預設值。

    如要進一步瞭解如何設定及移除執行個體的高可用性,請參閱「為現有執行個體設定高可用性」和「停用執行個體的高可用性」。

  • ALLOWED_PROJECTS:允許的專案 ID 或編號清單,以半形逗號分隔。如果專案不在這份清單中,就無法用來建立執行個體,並為執行個體啟用 Private Service Connect。

    Cloud SQL 不會將主要執行個體的允許專案複製到副本。您必須為每個副本建立 Private Service Connect 端點。如果您使用 Cloud SQL Auth Proxy 或 Cloud SQL 語言連接器,則必須為副本建立 DNS 區域和 DNS 記錄。

HTTP 方法和網址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances

JSON 要求主體:

{
  "masterInstanceName": "PRIMARY_INSTANCE_NAME",
  "project": "PROJECT_ID",
  "databaseVersion": "POSTGRES_13",
  "name": "REPLICA_INSTANCE_NAME",
  "region": "REGION_NAME",
  "kind": "sql#instance",
  "settings":
  {
    "tier": "MACHINE_TYPE",
    "availabilityType": "AVAILABILITY_TYPE",
    "settingsVersion": 0,
    "ipConfiguration": {
      "ipv4Enabled": false,
      "pscConfig": {
        "allowedConsumerProjects": [ALLOWED_PROJECTS],  
        "pscEnabled": true
      }
    },
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "ASYNCHRONOUS",
    "tier": "MACHINE_TYPE"
  }
}

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE_NAME",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "operationType": "CREATE_REPLICA",
  "name": "OPERATION_ID",
  "targetId": "REPLICA_INSTANCE_NAME",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

設定唯讀副本的 IAM 資料庫驗證機制

如果您在主要執行個體上啟用 cloudsql.iam_authentication 旗標,PostgreSQL 適用的 Cloud SQL 會自動在唯讀副本上啟用該旗標。不過,如果您未在主要執行個體上啟用這個旗標,PostgreSQL 適用的 Cloud SQL 就不會在唯讀副本上啟用。您無法使用副本進行 IAM 資料庫驗證。

如要為唯讀副本設定 IAM 資料庫驗證機制,請按照下列步驟操作:

  1. 前往 Cloud de Confiance 控制台的「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面。

    前往「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面

  2. 點選執行個體名稱,開啟執行個體的「總覽」頁面。
  3. 在「Configuration」(設定) 磁貼中,找出 cloudsql.iam_authentication 旗標。如果清單中沒有該旗標,就不需要在唯讀副本中啟用。如果旗標在清單中,您必須在唯讀副本上啟用旗標。如要在唯讀副本上啟用旗標,請繼續執行下一個步驟。
  4. 在 SQL 導覽選單中,選取「副本」。
  5. 按一下要編輯的副本名稱。
  6. 按一下 [編輯]。
  7. 在「Configuration options」(設定選項) 部分,展開「Flags」(旗標)。
  8. 選取「+ 新增」項目。
  9. 輸入 cloudsql.iam_authentication 做為旗標名稱。請確認這個旗標已選取「On」。
  10. 按一下「儲存」。

建立串聯式副本

本節說明如何建立及管理串接副本。

如要瞭解串聯式副本的運作方式,請參閱「串聯式副本」。

建立串聯式副本的步驟

控制台

  1. 前往 Cloud de Confiance 控制台的「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面。

    前往「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面

  2. 找出要建立的副本,然後按一下該副本上層副本的「副本」分頁標籤。
  3. 按一下「建立副本」。
  4. 在「Create read replica」(建立唯讀副本) 頁面中,更新執行個體 ID 和任何其他設定選項,包括名稱、區域和可用區。
  5. 點選「建立」。

    Cloud SQL 會建立副本。您會回到上層副本的執行個體頁面。

  6. 針對要建立的每個新串接副本,重複執行步驟 4 到 6。

gcloud

  1. 使用 --master-instance-name 旗標,將主要副本指定為主要執行個體,建立新的副本:
  2. gcloud sql instances create REPLICA_NAME \
          --master-instance-name=PARENT_REPLICA_NAME \
    更改下列內容:
    • REPLICA_NAME:您要建立的副本專屬 ID
    • PARENT_REPLICA_NAME:父項副本的名稱
  3. 建立串聯式副本後,您會發現對主要執行個體所做的變更,會複製到串聯式副本鏈中的所有副本。

curl

  1. 如要在父項副本下建立副本,請編輯下列 JSON 程式碼範例,並儲存至名為 request.json 的檔案:
    {
      "masterInstanceName": "PARENT_REPLICA_NAME",
      "project": "PROJECT_ID",
      "name": "REPLICA_NAME",
      "region": "REPLICA_REGION",
      "settings":
        {
          "tier": "MACHINE_TYPE",
        }
    }
  2. 請執行下列指令:
    curl -X POST
    -H "Authorization: Bearer "$(gcloud auth print-access-token)
    -H "Content-Type: application/json; charset=utf-8"
    -d @request.json
    "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances"

疑難排解

問題 疑難排解
唯讀副本建立後未開始複製。 記錄檔中可能會有更具體的錯誤。 在 Cloud Logging 中檢查記錄,找出實際錯誤。
無法建立唯讀副本 - invalidFlagValue 錯誤。 要求中的其中一個標記無效。這可能是您明確提供的旗標,也可能是設為預設值的旗標。

首先,請確認 max_connections 旗標的值大於或等於主要執行個體的值。

如果 max_connections 旗標設定正確,請檢查 Cloud Logging 中的記錄,找出實際錯誤。

無法建立唯讀副本,發生不明錯誤。 記錄檔中可能會有更具體的錯誤。 在 Cloud Logging 中檢查記錄,找出實際錯誤。

如果錯誤為 set Service Networking service account as servicenetworking.serviceAgent role on consumer project,請按照「建立服務代理並授予角色」中的操作說明,手動建立必要的服務帳戶。

磁碟已滿。 建立副本時,主要執行個體磁碟空間可能會用盡。編輯主要執行個體,升級至較大的磁碟。
磁碟空間大幅增加。 如果運算單元未主動用於追蹤資料,PostgreSQL 會無限期保留 WAL 區隔,導致磁碟空間無限增加。如果您使用 Cloud SQL 的邏輯複製和解碼功能,系統會自動建立及捨棄複製槽。如要偵測未使用的複製槽,請查詢 pg_replication_slots 系統檢視表,並篩選 active 欄。您可以使用 pg_drop_replication_slot 指令捨棄未使用的運算單元,藉此移除 WAL 區隔。
副本執行個體耗用過多記憶體。 副本會使用暫存記憶體快取經常要求的讀取作業,因此可能比主要執行個體耗用更多記憶體。

重新啟動副本執行個體,回收暫存記憶體空間。

已停止複製。 已達儲存空間上限,且未啟用儲存空間自動增加功能。

編輯執行個體,啟用 automatic storage increase。

複製作業延遲時間持續偏高。 寫入負載過高,副本無法處理。如果副本上的 SQL 執行緒無法跟上 IO 執行緒,就會發生複製作業延遲。某些類型的查詢或工作負載可能會導致特定結構定義暫時或永久出現高複製延遲。複製延遲的常見原因包括:
  • 副本上的慢速查詢。找出並修正問題。
  • 所有資料表都必須有不重複/主鍵。如果這類資料表沒有不重複/主鍵,每次更新都會在副本上完整掃描資料表。
  • DELETE ... WHERE field < 50000000 這類查詢會導致資料列式複製作業發生複製延遲,因為副本上會累積大量更新。

可能的解決方案包括:

  • 編輯執行個體,增加副本大小。
  • 降低資料庫負載。
  • 將讀取流量傳送至唯讀副本。
  • 為資料表建立索引。
  • 找出並修正寫入速度緩慢的查詢。
  • 重新建立副本。
在 PostgreSQL 9.6 中重建索引時發生錯誤。 您收到 PostgreSQL 錯誤,指出需要重建特定索引。這項操作只能在主要執行個體上執行。如果建立新的副本執行個體,很快就會再次收到相同的錯誤。在 10 以下的 PostgreSQL 版本中,雜湊索引不會傳播至副本。

如須使用雜湊索引,請升級至 PostgreSQL 10 以上版本。否則,如果您也想使用副本,請勿在 PostgreSQL 9.6 中使用雜湊索引。

主要執行個體上的查詢會持續執行。 建立副本後,查詢 SELECT * from pg_stat_activity where state = 'active' and pid = XXXX and username = 'cloudsqlreplica' 應會在主要執行個體上持續執行。
副本建立作業逾時失敗。 如果主要執行個體上有長時間執行的未提交交易,可能會導致唯讀副本建立失敗。

請先停止所有執行中的查詢,再重新建立副本。

如果主要執行個體和副本的 vCPU 大小不同,查詢最佳化工具會將 vCPU 大小納入考量,因此可能會發生查詢效能問題。

如要解決這個問題,請完成下列步驟:

  1. 開啟 log_duration 旗標,並將 log_statement 參數設為 ddl。這項資訊會提供查詢和資料庫的執行時間。不過,視工作負載而定,這可能會導致效能問題。
  2. 在主要執行個體和唯讀副本上,對查詢執行 explain analyze。
  3. 比較查詢計畫,並檢查差異。

如果這是特定查詢,請修改查詢。舉例來說,您可以變更彙整順序,看看是否能提升效能。

後續步驟