跳至內容

為什麼我的 ElastiCache for Valkey 或 ElastiCache for Redis OSS 自我管理叢集中的叢集之間會出現記憶體不平衡的情況?

2 分的閱讀內容
0

我的 Amazon ElastiCache for Valkey 或 Amazon ElastiCache for Redis 自我管理叢集 (已啟用叢集模式) 在各個碎片上的記憶體使用情況不平衡。

簡短描述

根據預設,已啟用叢集模式的 Valkey 和 Redis OSS 叢集會嘗試在叢集中的各個碎片之間平均分配快取索引鍵空間。如需詳細資訊,請參閱如何在 Amazon ElastiCache for Redis 上使用叢集模式

下列原因可能導致記憶體使用不平衡,導致某些碎片儲存的資料比其他碎片更多:

  • 索引鍵分佈不均
  • 索引鍵太大
  • 「快速」鍵或碎片
  • 雜湊標籤使用不均
  • 增加用戶端輸出緩衝區

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

索引鍵分佈不均

如果您沒有在碎片上平均分配雜湊插槽,那麼某些碎片處理的索引鍵可能會比其他碎片更多。若要解決此問題,請重新平衡叢集中的插槽

注意:****插槽重新平衡選項會嘗試在可用碎片之間平均分配 16384 個雜湊插槽。此選項不會根據記憶體使用量或每個碎片中的資料量來重新平衡分配。

有些索引鍵太大

如果某些索引鍵比其他索引鍵大得多,則託管這些索引鍵的碎片可能會出現較高的記憶體使用量。若要解決此問題,您可以將大型索引鍵分成較小的索引鍵/值組。或者,刪除不必要的大型索引鍵以釋放空間。

若要掃描資料集中的大型索引鍵,請使用 valkey-cli --bigkeysvalkey-cli --memkeys 命令。如需詳細資訊,請參閱 Valkey 網站上的掃描大型索引鍵

最佳做法是使用高效的索引鍵命名策略、資料結構和壓縮技術來最佳化索引鍵的記憶體使用情況

熱索引鍵或熱碎片

當您經常存取某些索引鍵而非其他索引鍵時,負載分佈會不平均,並且會加重服務主機的記憶體使用率。經常存取的索引鍵稱為熱索引鍵或熱碎片。

若要尋找熱索引鍵,請執行 valkey-cli --hotkeys 命令來檢閱索引鍵存取模式,以識別索引鍵。在某些情況下,單一熱快取索引鍵可能會造成熱點,進而使快取節點過載。熱點可能會影響節點的 CPU、記憶體和網路資源。

**注意:**只有在 maxmemory-policy 設定為 *lfu 時,熱索引鍵命令才有效。

若要解決此問題,請執行下列動作:

  • 垂直擴展叢集並提供更多資源。
  • 將讀取流量分散至讀取複本。如需詳細資訊,請參閱 Valkey 網站上的唯讀
  • 修改用戶端應用程式以減少對索引鍵的寫入量。

雜湊標籤使用不均

在啟用叢集模式的環境中,必須使用雜湊標籤來在 Valkey 叢集中實作多鍵操作。當您增加雜湊標籤的使用時,某些雜湊插槽儲存的索引鍵會比其他雜湊插槽更多,從而導致碎片之間的記憶體不平衡。

若要解決此問題,請檢閱索引鍵空間和雜湊標籤的使用情況,並將資料分散到更多雜湊插槽中。如需詳細資訊,請參閱 Valkey 網站上叢集規格中的雜湊標籤一節。

增加用戶端輸出緩衝區

當用戶端的命令產生輸出速度比 Valkey 可以傳送給用戶端的速度快時,用戶端輸出緩衝區就會增加並使用更多的記憶體。如需詳細資訊,請參閱 Valkey 網站上的輸出緩衝區限制

若要確定緩衝區問題的原因,請連線到受影響的節點並執行 CLIENT LIST 命令,以識別使用緩衝區空間的用戶端。如需詳細資訊,請參閱 Redis 網站上的 用戶端清單

若要確定用戶端輸出緩衝區高的原因,請查看輸出中的下列關鍵參數:

  • obl: 輸出緩衝區長度
  • omem: 輸出緩衝區記憶體使用情況
  • tot-mem: 用戶端使用的總記憶體

您也可以在 Amazon CloudWatch 中查看 DatabaseMemoryUsageCountedForEvictPercentageDatabaseMemoryUsagePercentage 指標。如果兩個指標之間的記憶體使用量存在顯著差異,那麼造成記憶體使用量的原因就是用戶端輸出緩衝區。

**注意:**DatabaseMemoryUsagePercentage 指標還包括連線開銷和用戶端輸出緩衝區記憶體使用量。

最佳做法

若要減少記憶體不平衡問題,請使用下列最佳做法。

設定 TTL 設定

為索引鍵設定適當的存留時間 (TTL) 值。當您設定適當的 TTL 值時,Valkey 節點會自動移除超出 TTL 的索引鍵,並最佳化記憶體使用量。如需詳細資訊,請參閱 Redis 網站上的 TTL

檢閱記憶體指標

最好的做法是定期檢閱各個碎片中的下列索引鍵記憶體指標,以便及早發現不平衡情況並採取主動措施::

  • **DatabaseMemoryUsagePercentage:**追蹤節點上的整體記憶體使用率。
  • **DatabaseMemoryUsageCountedForEvictPercentage:**若要偵測高緩衝區和開銷使用情況,請與 DatabaseMemoryUsagePercentage 進行比較。
  • **BytesUsedForCache:**監控快取資料使用的實際記憶體。
  • **CurrItems:**追蹤每個碎片中儲存的項目數量。
  • **SwapUsage:**追蹤主機上使用的交換量。
    **注意:**ElastiCache 出現一些 SwapUsage 是常見的情況。正常使用不會造成延遲問題。如果 SwapUsage 超過 300 MB,請檢查記憶體壓力。如需詳細資訊,請參閱您需要多少預留記憶體?

升級您的節點

若要處理大型索引鍵和頻繁存取模式,請暫時擴展 ElastiCache 叢集,以提供額外的 CPU 和記憶體資源。

相關資訊

如何檢查 ElastiCache for Redis 自行設計叢集中的記憶體使用情況,並實作控制高記憶體使用量的最佳做法?

Valkey 網站上的索引鍵分佈模式

Amazon ElastiCache 更新 - Redis 叢集的線上調整大小

如何解決 ElastiCache 執行個體中交換活動增加的問題?

AWS 官方已更新 1 年前