建立唯讀備用資源

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

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

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

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

事前準備

如果您要為這個執行個體建立第一個備援機制,請確認該執行個體符合主要執行個體的規定。瞭解詳情

建立唯讀備用資源

請參閱下方建立唯讀副本的步驟。

主控台

  1. 前往 Google Cloud 控制台的「Cloud SQL 執行個體」頁面。

    前往 Cloud SQL 執行個體

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

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

  4. 在頁面上的「自訂執行個體」部分中,更新備用資源的設定。首先按一下「Show configuration options」,顯示設定群組。接著展開所需群組,查看並自訂設定。右側會顯示您選取的所有選項的摘要。您可以選擇是否自訂這些設定。在所有未進行自訂的情況下,系統都會指派預設值。

    如需各項設定的詳細資訊,請參閱「關於執行個體設定」頁面。

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

  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 位址,且您想要允許其他 Google Cloud 服務 (例如 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:您新增或選取的授權網路,用於建立私人連線。

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:包含執行個體的 Google Cloud 專案 ID 或專案編號
  • 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:包含執行個體的 Google Cloud 專案 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 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": "[email protected]",
  "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:包含執行個體的 Google Cloud 專案 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 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": "[email protected]",
  "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 標記,Cloud SQL for PostgreSQL 會自動在唯讀備用資源上啟用該標記。不過,如果您未在主要執行個體上啟用此旗標,PostgreSQL 適用的 Cloud SQL 就不會在唯讀備用資源上啟用該旗標。您無法使用副本進行 IAM 資料庫驗證。

如要設定 IAM 資料庫驗證的唯讀備用資源,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Cloud SQL 執行個體」頁面。

    前往 Cloud SQL 執行個體

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

建立串聯式備用資源

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

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

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

主控台

  1. 前往 Google Cloud 控制台的「Cloud SQL 執行個體」頁面。

    前往 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 執行緒無法跟上 I/O 執行緒時,就會發生複製延遲。某些類型的查詢或工作負載,可能會導致特定結構定義的複製延遲時間暫時或永久性偏高。複製延遲的常見原因包括:
  • 複本上的查詢速度緩慢。找出並修正這些問題。
  • 所有資料表都必須有專屬/主索引鍵。在這種沒有唯一/主鍵的資料表上進行的每項更新,都會導致備援資料庫進行完整資料表掃描。
  • 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. 比較查詢計畫並檢查差異。

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

後續步驟