關於唯讀備用資源

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 健康狀態監控服務會啟動容錯移轉,並提供新的主要執行個體,供讀取和寫入。容錯移轉通常會在 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 作業 (因為匯出或完整同步複製),且發生記憶體不足狀況,系統會終止子程序。在此情況下,BGSAVE 作業會失敗,但 Redis 節點伺服器仍可使用。

為確保在所有情況下都能進行複製及建立快照,建議您在匯出、擴充等重要作業期間,將記憶體使用率維持在 50% 以下。您可以手動觸發匯出或容錯移轉,瞭解這些作業對效能的影響。

CPU 管理

Memorystore 提供各節點的 CPU 使用率和連線數指標。建議您分配足夠的額外資源,以因應單一可用區的損失。理想目標可能因副本數量和使用模式而異,但建議先將副本 CPU 使用率維持在 50% 以下。

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

管理連線餘額

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

管理複製延遲時間

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

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

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

後續步驟