建立唯讀備用資源

這個頁面說明如何為 Cloud SQL 執行個體建立唯讀備用資源。

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

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

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

事前準備

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

建立唯讀備用資源

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

主控台

  1. 前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。

    前往 Cloud SQL 執行個體

  2. 找出要建立副本的執行個體,然後開啟該項目旁邊的 more actions 選單。
  3. 選取「建立唯讀備用資源」

    如果沒有看到該選項,表示執行個體為備用資源,您無法為備用資源建立備用資源。

  4. 在頁面的「Customize your instance」(自訂執行個體) 區段中,更新備用資源的設定。首先,請按一下「顯示設定選項」 ,顯示設定群組。然後展開所需群組,即可查看及自訂設定。右側會顯示所有選取選項的摘要。您可以選擇是否自訂這些設定。如果沒有進行任何自訂作業,系統一律會指派預設值。

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

    舉例來說,如要允許 BigQuery 等其他服務存取 Cloud SQL 中的資料,並透過內部連線查詢這些資料,請展開「連線」群組,然後取消選取「公開 IP」核取方塊。 Google Cloud

  5. 按一下「建立備用資源」

    如有必要,Cloud SQL 會建立備份並建立備用資源。 您會回到主要執行個體的執行個體頁面。

gcloud

建立備用資源:

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

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

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

如果主要執行個體只有內部 IP 位址,且您想允許 BigQuery 等其他 Google Cloud 服務存取 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:您要新增或選取的授權網路,用於建立私人連線。

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
    }
  }
}

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

您應該會收到如下的 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:您要新增或選取的授權網路,用於建立私人連線。

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
    }
    
  }
}

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

您應該會收到如下的 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:包含執行個體的專案 ID 或專案編號。 Google Cloud
  • REGION_NAME:副本執行個體的區域名稱。
  • ALLOWED_PROJECTS:以半形逗號分隔的允許專案 ID 或編號清單。如果專案不在這個清單中,您就無法使用該專案建立執行個體,也無法為該執行個體啟用 Private Service Connect。

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

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

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

REST v1

使用任何要求資料之前,請先替換以下項目:

  • PRIMARY_INSTANCE_NAME:主要執行個體的名稱。
  • PROJECT_ID:包含執行個體的專案 ID 或專案編號。 Google Cloud
  • 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 ProxyCloud 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:包含執行個體的專案 ID 或專案編號。 Google Cloud
  • 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 ProxyCloud 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. 前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。

    前往 Cloud SQL 執行個體

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

建立串聯式備用資源

本節說明如何建立及管理層疊副本。

如要瞭解串聯式備用資源的運作方式,請參閱「串聯式備用資源」。

建立串聯式備用資源的步驟

主控台

  1. 前往 Google Cloud 控制台的「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,請停用並重新啟用 Service Networking API。這項動作會建立必要的服務帳戶,以便繼續進行程序。

磁碟空間已滿。 建立副本時,主要執行個體的磁碟大小可能會達到上限。 編輯主要執行個體,將其升級為較大的磁碟大小。
磁碟空間大幅增加。 如果某個時段未主動用於追蹤資料,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 的錯誤訊息,指出需要重建特定索引。這項操作只能在主要執行個體上進行。如果您建立新的副本執行個體,很快就會再次發生相同錯誤。在 PostgreSQL 10 以下版本中,雜湊索引不會傳播至副本

如果必須使用雜湊索引,請升級至 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. 比較查詢計畫並檢查差異。

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

後續步驟