在 ElastiCache for Redis 擴展過程中,如何將停機時間降至最低?

上次更新日期:2022 年 7 月 19 日

在 Amazon ElastiCache for Redis 擴展過程中,我希望將停機時間降至最低。我該如何操作?

解決方案

若要盡量減少停機時間,請考慮下列事項:

  • 若要將同步作業的影響降到最低,請避免在高工作負載環境下進行擴展。如果叢集的工作負載較高,且擴展需要較長時間,請減少發送至 Redis 的傳入請求,以防止同步作業失敗。在擴展過程中,可能會觸發同步作業 (背景儲存、分支或無叉)。同步作業是運算密集型作業,而且會消耗額外的記憶體。檢查 Amazon CloudWatch 中的 SaveInProgress 指標,以查看進行同步作業的時間。請記住,此指標會每分鐘收集資料。因此,指標可能無法擷取在一分鐘內完成的同步作業。如需有關監控工作負載的詳細資訊,請參閱 使用 Amazon CloudWatch 監控 Amazon ElastiCache for Redis 的最佳實務
  • 視擴展類型而定,擴展過程中可能會有新的節點加入、節點可能會從叢集中移除,或節點的 IP 可能會改變。Amazon ElastiCache for Redis 提供不同類型的連線端點,以便連線到叢集。連線端點 類型的選擇取決於應用程式的要求。最佳實務是在非生產環境中進行擴展測試,以識別連線 Redis 叢集時,用戶端設定錯誤所造成的非預期問題。
  • 如果用戶端連線到正在進行同步作業的新複本,則會出現 LOADING: Redis is loading the dataset in memory (載入:Redis 正在載入記憶體中的資料集) 錯誤訊息。請設定 Redis 用戶端或應用程式的程式碼,以便在另一個複本上重新嘗試查詢,或將查詢傳送至主節點。載入資料集所需的時間取決於資料大小和節點的效能。請在您的測試環境中進行測試,以確定這會否造成問題。
  • 您可以設定叢集,以便進行自動擴展,而非手動擴展。自動擴展可以防止傳入的工作負載突然增加而造成效能問題。如需詳細資訊,請參閱 自動擴展 ElastiCache for Redis 叢集

擴展動作的停機時間概觀

擴展動作共有四類:

  • 縮減。
  • 橫向擴展。
  • 變更節點類型。
  • 變更節點群組的數目。只有 Redis (叢集模式已停用) 叢集才支援此功能。

如需詳細資訊,請參閱 擴展 ElastiCache for Redis 叢集

一般來說,擴展過程的停機時間最多可能需要幾秒鐘,具體取決於擴展動作和叢集組態。以下是每個叢集類型和擴展動作的停機時間說明:

Redis (叢集模式已停用) 叢集

縮減: 縮減會從叢集中移除複本節點。這個方法可以降低成本。請注意,縮減也會降低資料的耐久性。如果您的應用程式僅使用主要端點連線至叢集,移除複本節點不會產生任何停機時間,原因是主要端點指向了主節點。

然而,如果您的應用程式使用讀取者端點或個別端點連線到該複本節點,已移除的複本節點將會中斷原來的連線,應用程式必須與其他複本節點建立新的 TCP 連線。應用程式也必須再次執行 DNS 查詢,以避免連線至已移除的複本節點。如果用戶端使用讀取者端點,則讀取者端點的 DNS 傳播可能會造成幾秒鐘的停機時間。

橫向擴展: 橫向擴展會在現有叢集中新增複本節點。主節點會與新節點同步。若要避免同步作業過程產生停機時間,請考慮在工作負載最小的時候進行橫向擴展。

變更節點類型: 在變更節點類型時,將會建立指定類型的新節點。舊的主節點會與新的主節點同步,而新的主節點會與新的複本節點同步。在此擴展過程中,請確保:

  • 工作負載不會太高,以致同步作業失敗。
  • 新節點的 IP 可能會與舊節點不同。您的應用程式可能需要在主要端點或讀取者端點上再次執行 DNS 查詢,並建立與新節點的新連線。DNS 傳播需要幾秒鐘的時間,因此在用戶端連接到新節點之前,您的服務可能會中斷。
    Redis 5.0.5 或以上版本 可以盡量減少中斷情況。 如果舊節點終止,導致請求失敗,Redis 的用戶端會再次嘗試向新節點發出請求。最佳實務是升級至新的 Redis 版本,以便使用最佳化的 ElastiCache 服務。

Redis (叢集模式已啟用) 叢集

縮減: 縮減將會從叢集中移除碎片。移除碎片之前,該碎片中的資料會遷移至其他節點。這個過程稱為「重新碎片」。重新碎片會導致叢集的工作負載增加,且用戶端必須支援 Redis 叢集。如需有關在縮減過程中將停機時間降至最低的資訊,請參閱 最佳實務:線上叢集大小調整

若要將縮減過度引起的效能問題降到最低,請考慮逐步進行擴展。例如,如果目標是要從 12 個碎片縮減至 6 個碎片,可以先從 12 個碎片縮減到 9 個碎片。在初始縮減之後,請在尖峰時間檢查叢集的效能,然後再進行進一步縮減。

橫向擴展: 橫向擴展會將碎片新增至叢集。其他碎片中的資料會遷移至新碎片。這個過程稱為「重新碎片」。重新碎片會導致叢集的工作負載增加,且用戶端必須支援 Redis 叢集。如需有關在橫向擴展過程中將停機時間降至最低的資訊,請參閱 最佳實務:線上叢集大小調整

變更節點類型: 在「變更節點類型」的過程中,每個碎片的舊主節點會與新的主節點同步。然後,新的主節點會與新的複本節點同步。在此擴展過程中,請確保:

  • 工作負載不會太高,以致同步作業失敗。
  • 新節點的 IP 可能與舊節點不同。若要判斷 IP 地址,您的應用程式可以使用 cluster nodes (叢集節點) 或 cluster slots (叢集插槽) 命令,以從叢集中取得更新後的拓撲資訊。支援 Redis 叢集的大多數 Redis 用戶端都可以更新叢集的拓撲資訊。然而,您可能需要設定 Redis 用戶端才能執行此操作。如需有關如何設定 Redis 用戶端的資訊,請參閱特定用戶端類型的文件。

變更節點群組的數目:變更節點群組的數目會改變每個碎片中複本節點的數目。在複本節點數目增加時,新的複本節點會加入叢集,主節點會與新節點同步。因此,在新增其他複本節點之前,請先檢查主節點的效能。在複本節點數目減少時,如果用戶端需要從已移除的複本節點讀取資料,則必須將請求傳送到其中一個新的複本節點。用戶端也必須更新叢集的拓撲資訊,以避免再將請求傳送到已移除的節點。