關於唯讀備用資源

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 會盡量避免在容錯移轉期間,其他副本需要完整同步,但極少數情況下仍可能發生。視寫入速率和要複製的資料集大小而定,完整同步可能需要幾分鐘到一小時。在此期間,正在進行完整同步的備用資源無法用於讀取作業。同步完成後,即可存取副本以供讀取。

唯讀備用資源的故障模式

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

備用資源無法使用

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

  • 如果 Compute Engine 缺貨或區域發生故障,副本必須等到問題解決後才會復原。

區域故障

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

  • 如果一或多個副本所在的可用區發生故障,這些副本在可用區故障期間將無法使用。如果兩個可用區發生故障,且有兩個以上的副本,系統會將其餘可用區中延遲時間最短的副本升級為主要副本。不受影響的區域中,所有剩餘的備用資源都可供讀取。

網路分區

網路分割是指節點持續運作,但無法連線至所有用戶端、區域或對等節點的情況。Memorystore 採用以仲裁為基礎的系統,防止孤立節點提供寫入服務。如果發生網路分割,少數分割區中的任何主要節點都會自行降級。如果多數分割區沒有主要分割區,就會選出新的主要分割區。隔離的備用資源會繼續提供讀取服務。不過,如果無法從主要裝置同步,這些裝置可能會過時。

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

缺貨

有時,Memorystore 需用的 Compute Engine 資源在可用區中缺貨,如果您嘗試在缺貨的區域佈建執行個體,建立執行個體的作業就會失敗。

完整同步處理

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

主要端點傳回 READONLY

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

使用讀取端點擴充讀取作業

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

讀取端點

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

讀取端點的行為

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

讀取一致性

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

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

在主要執行個體上設定金鑰的存留時間,可確保系統不會從主要執行個體或副本讀取過期的金鑰。這是因為 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 不會重新平衡開啟的連線。

管理連線餘額

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

管理複製延遲

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

後續步驟