排解複製問題

AlloyDB 的架構將運算和儲存空間分開,因此兩者可以獨立調度資源。雖然主要執行個體和讀取集區執行個體共用相同的基礎儲存空間,但複製作業仍是維護讀取備用資源資料一致性和即時性的重要程序。在 AlloyDB 叢集中,寫入作業會在主要執行個體上執行,然後記錄在共用儲存空間的預先寫入記錄 (WAL) 中。這些變更隨後會複製到讀取集區執行個體的記憶體內快取。瞭解這項複製程序的主要步驟,是排解任何問題的關鍵:

  • WAL 排清:包含資料庫變更的預先寫入記錄 (WAL) 會從主要資料庫傳送至副本。副本隨即將 WAL 持久儲存至磁碟。 這兩個步驟的延遲都會造成所謂的「複寫延遲」。不過,這個詞彙可能模稜兩可。更精確地說,我們可以將複寫延遲分成下列兩個元件:

  • 清除或網路延遲:這是指 WAL 清除步驟的延遲。這是指從主要執行個體傳送 WAL,並在副本上保存 WAL 所需的時間。

  • 重播延遲:這是 WAL 套用步驟的延遲。這是指副本套用 WAL 變更所需的時間。

您需要更留意清除延遲還是重播延遲,取決於您的用途:

  • 如果您擔心資料遺失 (例如使用跨區域備用資源),就必須密切注意排清延遲。如果 WAL 尚未保留在副本上,且主要資料庫當機,副本就會遺失變更。
  • 如果您擔心讀取副本上的資料是否為最新狀態,就必須密切注意重播延遲。如果重播延遲時間較長,表示讀取副本上的資料過時。

檢查複製延遲

您可以在 Google Cloud 控制台中監控讀取集區執行個體的複寫延遲。詳情請參閱「監控執行個體」。您也可以使用「建立指標門檻警告政策」監控讀取集區的複寫延遲,並在達到指定門檻時接收警告。

常見的複製延遲原因

以下列出一些常見的複寫延遲原因和解決方法。

資源爭用

如果 CPU 和記憶體等系統資源發生爭用情形,也可能導致複寫作業變慢。

  • CPU 和記憶體壓力:讀取集區執行個體上的大量讀取工作負載可能會與複製程序競爭 CPU 和記憶體資源。您可以在 Google Cloud 控制台中查看執行個體的 CPU 和記憶體用量。如果資源使用率偏高,您可能需要向上或向外擴充讀取集區執行個體。
  • 讀取集區節點大小:如果主要執行個體比讀取集區節點大得多,產生的複製記錄可能比讀取節點處理速度更快。在這種情況下,建議使用較大的讀取節點,為副本提供更多資源。

複製衝突

讀取查詢有時會阻礙複製程序,因為這些查詢會保留複製程序等待的資源。舉例來說,如果讀取查詢鎖定資料庫物件,而複製程序需要更新該物件,複製作業就會遭到封鎖,直到鎖定解除為止。這就是所謂的「緩衝區釘選衝突」

如要找出這些衝突,請在記錄檔探索器中,於 postgres.log 檔案中尋找 canceling statement due to conflict with recovery 訊息。

如要減少複製衝突,請採取下列做法:

  • 減少 max_standby_streaming_delay:這個參數會決定複製程序等待的時間長度,之後就會取消封鎖程序的查詢。預設值為 30 秒。降低這個值有助於減少複製延遲,但也可能導致更多讀取查詢遭到取消。您可以調整這個參數,找出最適合應用程式的平衡點。

  • 避免長時間執行的查詢:在讀取集區中長時間執行的查詢可能會增加複製衝突的機率。建議將長時間執行的查詢移至其他讀取集區,因為低複製延遲時間並非那麼重要。

  • 啟用 alloydb.promote_cancel_to_terminate:這個標記預設為開啟,可讓 AlloyDB 強制終止對取消要求沒有回應的查詢後端。這有助於防止無回應的後端長時間阻礙複製作業。

暫時限制讀取查詢

此外,您也可以使用 google_storage.log_replay_throttle_read_transactions 旗標,控制是否要在讀取節點上啟用讀取查詢的延遲節流。如果參數設為預設值 on,當複製延遲時間超過一秒時,系統會暫停啟動新查詢,並讀取新緩衝區最多一分鐘,藉此限制讀取查詢。這項功能會進行取捨,提供更多資源給重播作業,以加快追上進度的速度,但可能會增加讀取延遲時間,藉此改善複寫延遲。如果應用程式對複寫延遲不敏感,您可以將 google_storage.log_replay_throttle_read_transactions 設為 off,優先改善讀取查詢延遲。

您可以透過下列方法監控查詢節流的影響:

  • 記錄:在 Logs Explorer 的 postgres.log 檔案中搜尋 Delayed.*due to replica lag 訊息,找出因副本延遲而導致查詢延遲的時間。

  • Cloud Monitoring:使用 alloydb.googleapis.com/instance/postgresql/wait_count 指標查看遭到節流的查詢數量。如要這麼做,請依 wait_event_name 篩選指標,然後找出 HighLagThrottle。如要查看查詢遭到節流的總時間,可以使用 alloydb.googleapis.com/instance/postgresql/wait_time 指標,並套用相同的篩選條件。詳情請參閱「系統洞察指標參考資料」。

  • 查詢洞察:在「查詢洞察」資訊主頁中,如果查詢因複寫延遲而受到節流,則「執行中查詢」檢視畫面會顯示「等待事件」欄中的 HighLagThrottle 等待事件。詳情請參閱「監控進行中的查詢」。

工作負載過高

主要執行個體的寫入工作負載突然增加,可能會產生大量複製記錄,導致讀取集區執行個體不堪負荷,造成複製延遲。您可以在 Google Cloud 控制台中監控主要執行個體的寫入流量。

大額交易

大型交易 (例如影響大量資料列的 COMMITABORT 記錄) 可能需要很長時間才能複製到讀取集區執行個體。在 PostgreSQL 14 中,如果長時間執行的交易持有長串的獨占鎖定,可能會導致讀取副本的記憶體用量增加,最終可能導致讀取集區執行個體當機。

如要解決這個問題,請終止主要執行個體上長時間執行的交易。

排解導致無法複製的問題

您必須先有運作中的讀取集區,才能有複寫延遲。下列問題可能會導致無法進行複製作業,包括無法建立讀取集區,或導致唯讀備用資源當機。

讀取集區建立問題

如果讀取集區無法建立,您可能會在 Cloud Logging 的 AlloyDB 記錄中看到 Failed to create read pool 訊息。如果叢集已達儲存空間上限,主要執行個體就無法分配更多空間,這時就會發生這種情況。AlloyDB 會自動調整儲存空間,但您可能需要調查哪些項目會耗用儲存空間,並刪除不必要的資料,或聯絡支援團隊要求提高儲存空間配額。

讀取集區執行個體當機

在 PostgreSQL 14 中,如果主要執行個體上的長期交易持有長串的獨占鎖定,可能會導致讀取備用資源的記憶體用量增加,最終可能導致讀取集區執行個體當機。

如要解決這個問題,請終止主要執行個體上長時間執行的交易。

調整執行個體大小對複製延遲的影響

AlloyDB 的儲存空間架構可確保讀取集區排清延遲時間不會受到執行個體大小調整影響。但這不適用於重播。複本的回放能力取決於負載。如果您更新執行個體設定 (例如調整大小),視工作負載而定,作業完成時,副本可能沒有完全暖機的快取。也就是說,如果記錄尚未快取,重播或處理速度就會較慢。在這種情況下,重播延遲可能會暫時增加。