關於唯讀備用資源

Memorystore for Redis 標準級服務提供唯讀備用資源,可讓您擴充應用程式的讀取查詢。本頁面假設您熟悉不同 Memorystore Redis 層級的功能

您可以查詢備用資源,藉此調度讀取工作負載。系統會提供讀取端點,方便應用程式將查詢分配至備用資源。詳情請參閱「使用讀取端點調度讀取作業」。

如需管理具備唯讀備用資源的 Redis 執行個體,請參閱「管理唯讀備用資源」。

唯讀副本的用途

工作階段儲存空間、排行榜、推薦引擎和其他用途需要執行個體具備高可用性。在這些用途中,讀取次數遠多於寫入次數,且通常可容許部分過時的讀取作業。在這種情況下,利用讀取副本增加執行個體的可用性和可擴充性,是合理的做法。

唯讀備用資源行為

  • 標準級執行個體預設不會啟用唯讀備用資源。
  • 在執行個體上啟用唯讀備用資源後,就無法再停用該執行個體的唯讀備用資源。
  • 標準級執行個體可有 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_secondsoffset_diff 指標,找出孤立節點。

完整同步處理

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

主要端點傳回 READONLY

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

使用讀取端點調度讀取作業的資源

應用程式可透過唯讀備用資源讀取資料,藉此擴充讀取作業。應用程式可透過讀取端點連線至唯讀副本。

讀取端點

讀取端點是應用程式連線的 IP 位址,可平均分配執行個體中副本的連線負載。連線至讀取副本時,可以傳送讀取查詢,但無法傳送寫入查詢。啟用讀取副本的每個標準層級執行個體都有讀取端點。如需查看執行個體讀取端點的操作說明,請參閱「查看執行個體的讀取副本資訊」。

讀取端點的行為

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

讀取一致性

唯讀備用資源是使用原生 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 執行個體上啟用唯讀副本前,強烈建議您減少主要節點的寫入流量。這樣一來,主要節點就能將資料完整同步至副本。如果沒有減少寫入流量,您可能就無法啟用唯讀副本。

後續步驟