AlloyDB 的架構將運算和儲存分開,因此兩者可獨立調度資源。雖然主要執行個體和讀取集區執行個體共用相同的基礎儲存空間,但複製作業仍是維護讀取備用資源資料一致性和即時性的重要程序。在 AlloyDB 叢集中,寫入作業會在主要執行個體上執行,然後記錄在預先寫入記錄 (WAL) 中。接著,這些變更會複製到讀取集區節點。瞭解這項複製程序的主要步驟,是排解任何問題的關鍵:
- WAL 排清:包含資料庫變更的預先寫入記錄 (WAL) 會從主要資料庫傳送至副本。副本隨即將 WAL 持久儲存至磁碟。
- 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 控制台中監控主要執行個體的寫入流量。
大額交易
如果交易修改大量資料列 (例如刪除多個資料表或大型資料表),會在預先寫入記錄 (WAL) 中產生極大的 COMMIT 或 ABORT 記錄。這些記錄可能需要大量時間才能在讀取集區節點上重新播放,導致複製延遲暫時增加。
為減輕這類情況,請避免在單一交易中執行大量批次作業,例如刪除作業。請改為將這些作業拆成較小且更頻繁的交易。這會縮減個別 COMMIT 和 ABORT 記錄的大小,讓複製串流保持流暢,並減少複製延遲的高峰期。
排解導致無法複製的問題
您必須先有運作中的讀取集區,才能有複寫延遲。下列問題可能會導致無法進行複製作業,包括無法建立讀取集區,或導致唯讀備用資源當機。
讀取集區執行個體當機
在 PostgreSQL 14 中,主要執行個體上持有長串獨占鎖的長期執行交易,可能會導致讀取副本的記憶體用量增加,最終可能導致讀取集區執行個體當機。
如要解決這個問題,請終止主要執行個體上長時間執行的交易。
調整執行個體大小對複製延遲的影響
AlloyDB 的儲存空間架構可確保讀取集區排清延遲時間不會受到執行個體大小調整影響。不過,這項功能不適用於重播。副本的重播能力取決於其負載。如果您更新執行個體設定 (例如調整大小),視工作負載而定,作業完成時,副本可能沒有完全暖機的快取。也就是說,如果記錄尚未快取,重播或處理速度就會較慢。在這種情況下,重播延遲可能會暫時增加。