關於唯讀備用資源

Memorystore for Redis 的標準級別可讓您使用唯讀副本,擴充應用程式的讀取查詢。本頁面假設您已熟悉 Memorystore 的不同 Redis 級別功能。

唯讀副本可讓您透過查詢副本,擴充讀取工作負載。系統會提供讀取端點,方便應用程式將查詢分配至各個副本。詳情請參閱「使用讀取端點調度讀取作業資源」。

如要瞭解如何管理具有唯讀副本的 Redis 執行個體,請參閱「管理唯讀副本」。

唯讀副本的用途

工作階段儲存庫、排行榜、推薦引擎和其他用途,都需要執行個體具備高可用性。在這些用途中,讀取次數遠多於寫入次數,且通常可以容許一些過時讀取。在這種情況下,建議您使用唯讀副本,提高執行個體的可用性和擴充性。

唯讀副本行為

  • 根據預設,Standard 級執行個體不會啟用唯讀副本。
  • 為保護資料並提供基準層級的持久性,當您使用 Google Cloud 控制台建立 Memorystore for Redis 執行個體時,系統會預設啟用 RDB 快照。
  • 在執行個體上啟用唯讀副本後,就無法再停用該執行個體的唯讀副本。
  • Standard 級執行個體可以有 1 到 5 個唯讀副本。
  • 讀取端點提供單一端點,可將查詢分散至各個副本節點。
  • 唯讀副本是使用 Redis 非同步複製功能維護。

注意事項和限制

  • 唯讀副本僅適用於節點 >= 5 GB 的執行個體大小。
  • 唯讀副本只能在採用 Redis 5.0 以上版本的執行個體上啟用。
  • 如果您指定了用於佈建節點的可用區和備用可用區,Memorystore 會將這些可用區用於執行個體中的第一和第二個節點。接著,Memorystore 會為執行個體佈建的所有剩餘節點選取可用區。
  • 佈建執行個體時,CIDR IP 位址範圍必須為 /28 以上。/27 和 /26 等較大的範圍大小有效。這項功能不支援較小的範圍,例如 /29。

架構

啟用唯讀副本時,請指定執行個體中所需的副本數量。Memorystore 會自動將主要和唯讀副本節點,分配至區域內的可用可用區。

架構圖:Memorystore for Redis 標準級,含唯讀副本

每個執行個體都有主要端點和讀取端點。主要端點一律會將流量導向主要節點,讀取端點則會自動在可用的副本之間平衡讀取查詢的負載。在圖表中,主要端點的讀取和寫入流量以藍色顯示,讀取端點和副本的讀取流量則以綠色顯示。

Memorystore for Redis 健康狀態監控服務會監控執行個體,並負責偵測主要節點是否發生故障,以及選取副本做為新的主要節點,並啟動自動容錯移轉至新的主要節點。

具有唯讀副本的執行個體容錯移轉

主要執行個體故障時,Memorystore 健康狀態監控服務會啟動容錯移轉,並開放新的主要執行個體進行讀取和寫入。容錯移轉通常會在 30 秒內完成。

發生容錯移轉時,主要端點會自動將流量重新導向至新的主要端點,但所有用戶端與主要端點的連線都會中斷。新的主要執行個體上線後,具有連線重試邏輯的應用程式會自動重新連線。在容錯移轉期間,部分用戶端與讀取端點的連線也會與升級為主要執行個體的唯讀副本中斷連線。容錯移轉期間,系統會繼續提供其餘副本的連線。重試時,連線會重新導向至新的副本。

發生容錯移轉時,由於複製作業是非同步進行,因此副本可能會有不同的複製延遲時間。不過,容錯移轉程序會盡可能容錯移轉至延遲時間最短的副本。這有助於盡可能減少資料遺失量,並降低容錯移轉期間的讀取處理量。新升級的主要執行個體可以與舊的主要執行個體位於相同或不同的可用區。如果副本與前一個主要執行個體位於相同可用區,且延遲時間最短,系統就會選取該副本做為新的主要執行個體。如果沒有,其他可用區的副本可以成為新的主要執行個體。

由於複製作業是非同步進行,因此在容錯移轉期間,一律有可能讀取到過時資料。此外,在新的主要執行個體升級期間,寫入執行個體的部分資料可能會遺失。應用程式應能處理這項行為。

Redis 會盡可能避免其他副本在容錯移轉期間需要完整同步,但極少數情況下仍可能發生。視寫入速率和複製的資料集大小而定,完整同步處理可能需要幾分鐘到一小時。在此期間,正在進行完整同步處理的副本無法用於讀取。同步處理完成後,即可存取副本進行讀取。

唯讀副本的故障模式

具有唯讀副本的執行個體可能會發生各種故障和不良狀況,進而影響應用程式。行為會因執行個體有一或多個副本而異。本節將概述一些常見的故障模式,以及執行個體在這些情況下的行為。

無法使用副本

  • 如果副本因任何原因而失敗,系統會將副本標示為無法使用,並在特定逾時時間後終止與副本的所有連線。副本復原後,新的連線會轉送至復原的副本。復原副本所需的時間會因故障模式而異。

  • 如果可用區故障,Memorystore for Redis 會等到可用區恢復可用狀態,才會復原副本。

可用區故障

  • 如果主要執行個體所在的可用區故障,主要執行個體會自動容錯移轉至其他可用區的副本。如果執行個體只有一個副本,則在可用區中斷期間,讀取端點將無法使用。如果執行個體有多個副本,受影響可用區以外的副本仍可供讀取

  • 如果一或多個副本所在的可用區故障,在可用區故障期間,這些副本將無法使用。如果兩個可用區故障,且有兩個以上的副本,則剩餘可用區中延遲時間最短的副本會升級為主要副本。未受影響可用區中的任何剩餘副本都可供讀取。

網路失聯

網路失聯是指節點持續運作,但無法連上所有用戶端、可用區或對等互連節點。Memorystore 採用以仲裁為基礎的系統,防止孤立節點提供寫入服務。如果網路失聯,少數失聯中的任何主要執行個體都會自行降級。如果多數失聯區塊 (如有) 還沒有新的主要節點,則會選出新的主要節點。隔離的副本會繼續提供讀取服務。不過,如果無法從主要執行個體同步,這些執行個體可能會過時。

如要判斷連結是否中斷,請監控 master_link_down_since_seconds 和 offset_diff 指標,找出孤立節點。

完整同步處理

如果副本落後主要執行個體太多,就會觸發完整同步作業,將整個快照從主要執行個體複製到副本。這項作業可能需要幾分鐘,最慢一小時內完成。完整同步不會導致執行個體故障,但在此期間,進行完整同步的副本無法讀取,且主要執行個體的 CPU 和記憶體使用率會提高。

主要端點傳回 READONLY

寫入 Memorystore for Redis 執行個體的主要端點時,如果該執行個體含有唯讀副本,可能會意外收到 -READONLY You can't write against a read only replica. 錯誤。建議您關閉並重新建立與執行個體的連線。在多數情況下,重新啟動用戶端應用程式即可緩解問題。如果這些方法都不可行,或問題仍未解決,請與 Google Cloud 支援團隊聯絡。

使用讀取端點調度讀取資源

唯讀副本可讓應用程式透過讀取副本來擴充讀取作業。應用程式可以透過讀取端點連線至唯讀副本。

讀取端點

讀取端點是應用程式連線的 IP 位址。它會平均分配執行個體中各個副本的連線負載。連至唯讀副本的連線可以傳送讀取查詢,但無法傳送寫入查詢。每個啟用唯讀副本的 Standard 級執行個體都有一個讀取端點。如要瞭解如何查看執行個體的讀取端點,請參閱「查看執行個體的唯讀副本資訊」。

讀取端點的行為

  • 讀取端點會自動將連線分配至所有可用的副本。連線不會導向主要執行個體。
  • 只要副本能提供用戶端流量,就視為可用。但不包括副本與主要執行個體進行完整同步處理的時間。
  • 即使複製延遲時間過長,副本仍會繼續提供流量。如果應用程式的寫入量很高,可能會從處理大量寫入作業的副本讀取過時資料。
  • 如果副本節點成為主要節點,系統會終止與該節點的連線,並將新連線重新導向至新的副本節點。
  • 在連線生命週期內,連至讀取端點的個別連線會指定同一個副本。來自相同用戶端主機的不同連線,不一定會指定相同的副本節點。

讀取一致性

唯讀副本是使用原生 OSS Redis 非同步複製功能維護。由於非同步複製的性質,副本可能會落後於主要執行個體。如果應用程式持續寫入資料,同時從副本讀取資料,則應能容忍不一致的讀取作業。

如果應用程式需要「讀取寫入」一致性,建議您使用主要端點進行寫入和讀取。使用主要端點可確保讀取作業一律導向主要執行個體。即使在這種情況下,容錯移轉後仍可能發生過時讀取。

在主要執行個體上設定金鑰的存留時間,可確保不會從主要執行個體或副本讀取過期的金鑰。這是因為 Redis 會確保無法從副本讀取過期的金鑰。

在現有執行個體上啟用唯讀副本的行為

  • 啟用唯讀副本是專屬作業,也就是說,您無法在啟用唯讀副本的同一作業中,執行其他更新作業執行個體修改。

  • 如要在現有 Redis 執行個體上啟用唯讀副本,您必須為節點配置有效的次要 IP 位址範圍。無論分配給 Memorystore for Redis 的現有 IP 位址範圍大小為何,這都必須是大小為 /28 的無類別跨網域路由 (CIDR) 範圍。

    • 為 Redis 執行個體啟用唯讀副本時,必須提供額外的 IP 範圍。您可以選擇特定範圍,或讓 Memorystore 自動選取。
  • 啟用唯讀副本時,執行個體的讀取/寫入 IP 位址不會變更。讀取端點 IP 位址位於 Memorystore 執行個體原始分配的範圍內,而非啟用唯讀副本時提供的額外範圍。

  • 如要查看新的讀取端點,請在啟用唯讀副本的操作完成後,查看執行個體的唯讀副本資訊。

執行個體的資源調度

您可以調整執行個體的唯讀副本數量,也可以修改節點大小:

建議您在讀取和寫入流量偏低時,調整執行個體資源配置,盡可能降低對應用程式的影響。

新增副本時,副本會執行完整同步處理,因此會增加主要執行個體的負載。新增節點時,現有連線不會受到影響或轉移。新的副本可用後,就會開始接收來自端點的連線,並提供讀取服務。移除副本後,所有轉送至該副本的有效連線都會關閉。用戶端應用程式應設為自動重新連線至讀取端點,以便重新建立與其餘副本的連線。

最佳做法

記憶體管理

Redis 不允許用戶端寫入作業超過執行個體的 maxmemory 限制。不過,分割、複製緩衝區等負擔,以及 EVAL 等高成本指令,可能會使記憶體使用率超過這項限制。在這種情況下,Memorystore 會無法寫入,直到記憶體壓力降低為止。詳情請參閱「記憶體管理最佳做法」。

如果 Memorystore 因匯出或完整同步複製而執行 BGSAVE 作業,且發生 OOM 狀況,子項程序就會終止。在這種情況下,BGSAVE 作業會失敗,而 Redis 節點伺服器仍可使用。

為確保在任何情況下都能建立複製和快照,建議您在執行匯出、資源調度等重要作業時,將記憶體使用率保持在 50% 以下。您可以手動觸發匯出或容錯移轉,瞭解這些作業對效能的影響。

CPU 管理

Memorystore 提供各節點的 CPU 使用率和連線數量指標。建議您分配足夠的額外資源,以便在單一可用區故障時仍能正常運作。理想目標可能因副本數量和使用模式而異,但建議一開始將副本 CPU 使用率維持在 50% 以下。

如果用戶端使用模式不平衡,或容錯移轉作業導致連線分布不平衡,個別節點的使用率可能會偏高。在這種情況下,建議您定期關閉連線,讓 Memorystore 自動重新平衡連線。Memorystore 不會重新平衡開啟的連線。

連線平衡管理

每當節點連線關閉時,用戶端都必須重新連線,通常是在所選用戶端程式庫上啟用自動重新連線功能。重新導入節點時,現有連線不會重新轉送,但新連線會轉送至新節點。用戶端可以定期終止連線,確保連線在可用節點之間達到平衡。

複製延遲管理

副本可能會落後,尤其是在寫入率非常高時。在這種情況下,副本仍可供讀取。在這種情況下,從副本讀取的資料可能會過時,應用程式應能處理這種情況,或應解決寫入率過高的問題。

在現有執行個體上啟用唯讀副本

在現有的 Memorystore for Redis 執行個體上啟用唯讀副本之前,強烈建議您減少寫入主要節點的流量。這樣一來,主要節點就能將資料完整同步至副本。如果不減少寫入流量,可能就無法啟用唯讀副本。

後續步驟