管理唯讀備用資源

本頁說明如何管理唯讀副本。這些作業包括停用及啟用複製作業、升級備用資源、設定平行複製作業,以及檢查複製狀態。

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

停用複製功能

備用資源預設會在啟用複製的情況下啟動,但是您也可以將其停用以進行其他工作,例如進行偵錯作業或分析執行個體的狀態。準備就緒後,請明確重新啟用複製功能。停用或重新啟用複製功能不會重新啟動備用資源執行個體。

停用複製作業不會停止備用執行個體,而是會將其變成唯讀執行個體,不再從主要執行個體複製資料。系統會繼續收取執行個體費用。在已停用的備用資源上,您可以重新啟用複製功能、刪除備用資源,或將備用資源升級為獨立執行個體。

如果長時間停用複寫功能,磁碟儲存空間需求可能會增加。舉例來說,執行個體可能會累積交易記錄,以便您在重新啟用複製作業時繼續複製。為避免增加磁碟儲存空間需求,請考慮升級副本或建立主要執行個體的副本,而非長時間停用複寫功能。

停用複製功能:

控制台

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

    前往 Cloud SQL 執行個體

  2. 按一下備用資源執行個體的名稱來選取備用資源執行個體。
  3. 按一下按鈕列中的「停用複製功能」
  4. 按一下 [確定]

gcloud

gcloud sql instances patch REPLICA_NAME \
--no-enable-database-replication

REST v1

如要在指令列提示下執行這個 cURL 指令,您可以使用 gcloud auth print-access-token 指令取得存取憑證。您也可以使用 Instances:patch 頁面上的 APIs Explorer 傳送 REST API 要求。

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

  • project-id:專案 ID
  • replica-name:副本執行個體的名稱

HTTP 方法和網址:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name

JSON 要求主體:

{
  "settings":
  {
    "databaseReplicationEnabled": "False"
  }
}

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

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

REST v1beta4

如要在指令列提示下執行這個 cURL 指令,您可以使用 gcloud auth print-access-token 指令取得存取憑證。您也可以使用 Instances:patch 頁面上的 APIs Explorer 傳送 REST API 要求。

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

  • project-id:專案 ID
  • replica-name:副本執行個體的名稱

HTTP 方法和網址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name

JSON 要求主體:

{
  "settings":
  {
    "databaseReplicationEnabled": "False"
  }
}

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

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

啟用複製功能

如果備用資源長時間未複製,就需要較長的時間才能趕上主要執行個體。在這種情況下,請刪除副本並建立新的副本。

啟用複製功能:

控制台

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

    前往 Cloud SQL 執行個體

  2. 按一下備用資源執行個體的名稱來選取備用資源執行個體。
  3. 按一下「啟用複製功能」
  4. 按一下 [確定]。

gcloud

gcloud sql instances patch REPLICA_NAME \
--enable-database-replication

REST v1

如要在指令列提示下執行這個 cURL 指令,您可以使用 gcloud auth print-access-token 指令取得存取憑證。您也可以使用 Instances:patch 頁面上的 APIs Explorer 傳送 REST API 要求。

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

  • project-id:專案 ID
  • replica-name:副本執行個體的名稱

HTTP 方法和網址:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name

JSON 要求主體:

{
  "settings":
  {
    "databaseReplicationEnabled": "True"
  }
}

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

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

REST v1beta4

如要在指令列提示下執行這個 cURL 指令,您可以使用 gcloud auth print-access-token 指令取得存取憑證。您也可以使用 Instances:patch 頁面上的 APIs Explorer 傳送 REST API 要求。

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

  • project-id:專案 ID
  • replica-name:副本執行個體的名稱

HTTP 方法和網址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name

JSON 要求主體:

{
  "settings":
  {
    "databaseReplicationEnabled": "True"
  }
}

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

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

升級備用資源

將唯讀備用資源升級,這樣執行個體就會停止複製資料,並轉換為具備讀寫能力的獨立 Cloud SQL 主要執行個體。

升級後,唯讀備用資源會自動設定備份,但不會自動設定為高可用性 (HA) 執行個體。升級備用資源後,您可以啟用高可用性,做法與任何非備用資源執行個體相同。設定高可用性的唯讀備用資源時,做法與主要執行個體相同。進一步瞭解如何設定高可用性的執行個體

推送唯讀備用資源前,如果主要執行個體仍可供用戶端使用,請執行下列操作:

  1. 停止對主要執行個體的所有寫入作業。
  2. 檢查備用資源的複製狀態 (請按照「psql Client」分頁中的操作說明進行)。
  3. 確認備用資源正在複製,然後等待 replay_lag 指標回報的複製延遲為 0。

否則,新升級的執行個體可能會遺失部分已提交至主要執行個體的交易。

如要將副本升級為獨立執行個體,請按照下列步驟操作:

控制台

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

    前往 Cloud SQL 執行個體

  2. 按一下備用資源執行個體的名稱來選取備用資源執行個體。
  3. 按一下「推送備用資源」
  4. 按一下 [確定]。

gcloud

gcloud sql instances promote-replica REPLICA_NAME
  

REST v1

如要在指令列提示下執行這個 cURL 指令,您可以使用 gcloud auth print-access-token 指令取得存取憑證。您也可以使用 Instances:promoteReplica 頁面上的 APIs Explorer 傳送 REST API 要求。

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

  • project-id:專案 ID
  • replica-name:副本執行個體的名稱

HTTP 方法和網址:

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

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

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

REST v1beta4

如要在指令列提示下執行這個 cURL 指令,您可以使用 gcloud auth print-access-token 指令取得存取憑證。您也可以使用 Instances:promoteReplica 頁面上的 APIs Explorer 傳送 REST API 要求。

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

  • project-id:專案 ID
  • replica-name:副本執行個體的名稱

HTTP 方法和網址:

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

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

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

確認升級的執行個體設定正確無誤。 強烈建議您視需求考慮將執行個體設為高可用性

檢查複製狀態

使用 Google Cloud 控制台檢視副本執行個體,或使用管理用戶端登入執行個體時,您會取得複寫詳細資料,包括狀態和指標。使用 gcloud CLI 時,您會取得複製設定的簡短摘要。

檢查 Cloud SQL 副本執行個體的複製狀態前,請先使用
gcloud sql instances describe 指令顯示執行個體的狀態。因此,您可以查看備用執行個體是否已啟用複製功能。

副本執行個體可用的指標如下:(進一步瞭解適用於所有執行個體的其他指標,包括非副本執行個體。)

指標說明
複製狀態
(cloudsql.googleapis.com/database/replication/state)

指出複製作業是否正從主要執行個體將記錄串流至副本。可能的值包括:

  • Running
  • Stopped
  • Error

這項指標會在下列情況回報 Running

  1. pg_catalog.pg_stat_wal_receiver回報「串流」status
  2. pg_catalog.pg_is_wal_replay_paused() 報告「f」(false)。

詳情請參閱 PostgreSQL 參考手冊中的「統計資料收集器」和「系統管理函式」。

複製延遲時間
(cloudsql.googleapis.com/database/replication/replica_lag)

備用資源狀態落後主要執行個體狀態的時間長度。這是指 (1) 目前時間與 (2) 主要項目在副本上套用目前交易時的原始時間戳記之間的差異。具體來說,即使副本已收到寫入作業,但如果尚未將寫入作業套用至資料庫,寫入作業仍可能計為落後。

如果是層疊式副本,系統會分別監控每個主要副本配對,且沒有單一指標可產生端對端 (主要到副本) 的延遲。

詳情請參閱「複製延遲」。

延遲位元組
(cloudsql.googleapis.com/database/postgresql/replication/replica_byte_lag)

回報唯讀副本比主要副本落後多少位元組。每個副本都會產生四個時間序列,顯示主要副本的預先寫入記錄中尚未…

  • sent_location:…傳送至副本
  • write_location:…由副本寫入磁碟
  • flush_location:…由副本排清至磁碟
  • replay_location:…由副本重播

這些指標的用途各不相同。舉例來說,replay_location 可指出複寫延遲 (已提交至主要執行個體但尚未套用至副本的交易次數),而 flush_location 則可指出尚未在副本執行個體上持久記錄的交易次數。

這些指標的計算方式是比較 pg_catalog.pg_current_wal_lsn()pg_stat_replication 中的下列其中一個欄位:sent_lsnwrite_lsnflush_lsnreplay_lsn。詳情請參閱 PostgreSQL 參考手冊中的「統計資料收集器」。

最大延遲位元組數
(cloudsql.googleapis.com/database/postgresql/external_sync/max_replica_byte_lag)

如果是外部主要執行個體的副本,則會回報複製到這個執行個體的所有資料庫中,最長的複製延遲時間 (以位元組為單位)。就每個資料庫而言,這是指主要資料庫預先寫入記錄中的位元組數,這些位元組尚未確認已由副本接收。

這項指標的計算方式是向主要資料庫傳送查詢,比較 pg_catalog.pg_current_wal_lsn()confirmed_flush_lsn 的值,適用於要複製到這個備用資源執行個體的每個資料庫。詳情請參閱 PostgreSQL 參考手冊中的「統計資料收集器」。

檢查複製狀態:

控制台

Cloud SQL 會在預設的 Cloud SQL 監控資訊主頁上,回報 Replication State 指標。

如要查看區域內和跨區域副本,以及外部伺服器副本的其他指標,請建立自訂資訊主頁,並在其中新增要監控的指標:

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

    前往「Monioring」

  2. 選取「資訊主頁」分頁標籤。
  3. 按一下「Create dashboard」(建立資訊主頁)
  4. 為資訊主頁命名,然後按一下「確定」。
  5. 按一下 [Add chart] (新增圖表)
  6. 在「Resource Type」(資源類型) 中,選取「Cloud SQL Database」(Cloud SQL 資料庫)
  7. 請採行下列任一動作:
    1. 監控複寫狀態指標:在「選取指標」欄位中輸入 Replication state。然後新增 state = "Running" 的篩選條件。如果複製作業正在執行,圖表會顯示 1,否則會顯示 0。
    2. 如要監控唯讀備用資源的複製延遲 (以位元組為單位):請在「選取指標」欄位中輸入 Lag Bytes。然後在 replica_lag_type = "replay_location" 上新增篩選器。圖表顯示與主要項目上已提交但尚未在副本上重播的交易相關聯的位元組數。
    3. 如要監控外部主資料庫副本的複製延遲 (以位元組為單位):在「Select a metric」(選取指標) 欄位中輸入 Max Lag Bytes。圖表顯示與主要項目上已提交但副本尚未確認收到的交易相關聯的位元組數。

gcloud

針對備用資源執行個體,使用以下指令檢查複製狀態:

gcloud sql instances describe REPLICA_NAME

在輸出內容中,找出 databaseReplicationEnabledmasterInstanceName 屬性。

如果是主要執行個體,請檢查是否有下列備用資源:

gcloud sql instances describe PRIMARY_INSTANCE_NAME

在輸出內容中,尋找 replicaNames 屬性。

psql 用戶端

部分複製狀態指標是由主要執行個體產生,部分則是由副本產生。如要執行下列步驟,請使用 PostgreSQL 用戶端連線至備用或主要執行個體 (如下所述)。

詳情請參閱「外部應用程式的連線選項」。

  1. 如要從主要執行個體檢查副本的狀態,請執行下列步驟:
    select * from pg_stat_replication;
    在指令的輸出結果中,尋找下列指標:
    • client_addr:副本執行個體的 IP 位址。
    • state:指出執行中繼記錄檔中事件的 SQL 執行緒是否正在執行。複製作業開始時,這個值為 streaming
    • replay_lag:備用資源 SQL 執行緒落後主要執行個體的位元組數。值為 O 或少量位元組。
  2. 如要從副本執行個體檢查副本的狀態,請按照下列步驟操作:
    select * from pg_stat_wal_receiver;

    在指令輸出中尋找下列指標:

    • sender_host:主要執行個體的 IP 位址。
    • status:指出執行中繼記錄檔中事件的 SQL 執行緒是否正在執行。複製作業開始時,這個值為 streaming
    • last_msg_send_timelast_msg_receipt_time:這兩個時間戳記的差異就是延遲時間。

    如要檢查複製作業是否已暫停,請按照下列步驟操作:

    select pg_is_wal_replay_paused();

    如果複製作業已暫停,值為 t,否則為 f

    如要檢查是否有從主要叢集接收但尚未套用的交易,請按照下列步驟操作:

    # for PostgreSQL 9.6
    select pg_catalog.pg_last_xlog_receive_location(), pg_catalog.pg_last_xlog_replay_location();
    # for PostgreSQL 10 and above
    select pg_catalog.pg_last_wal_receive_lsn(), pg_catalog.pg_last_wal_replay_lsn();

    如果這兩個值相等,表示副本已處理完從主要副本收到的所有交易。

  • 如要進一步瞭解這些指令的輸出內容,請參閱 PostgreSQL 說明文件中的「統計資料收集器」。
  • 疑難排解

    問題 疑難排解
    建立唯讀副本時,系統未開始複製作業。 記錄檔中可能會有更具體的錯誤。 檢查 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. 比較查詢計畫並檢查差異。

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

    後續步驟