調整 DAX 叢集大小 - Amazon DynamoDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

調整 DAX 叢集大小

DAX 叢集的總容量與可用性取決於節點類型與數量。叢集中節點數越多,讀取容量越高,但寫入容量不變。較大型節點類型 (最高至 r5.8xlarge) 可處理更多寫入,但節點數過少在節點故障時會降低可用性。如需關於 DAX 叢集規模調整的詳細資訊,請參閱 DAX 叢集調整大小指南

下列章節將說明如何在建立可擴展且具成本效益的叢集時,平衡節點類型與數量等各項規模因素。

可用性規劃

在規劃 DAX 叢集規模時,應先確定目標可用性。對於 DAX 等叢集服務,可用性取決於叢集節點的總數。單節點叢集不具容錯能力,其可用性僅等同於單一節點。在 10 節點叢集中,單一節點失效對整體容量的影響最小。此節點失效不會直接影響可用性,因為其餘節點仍可處理讀取請求。為恢復寫入,DAX 會迅速指派新的主節點。

DAX 以 VPC 為基礎運作。DAX 使用子網路群組來判定可在哪些可用區域中執行節點,並決定要從哪些子網路配置 IP 位址。對於生產環境工作負載,強烈建議在不同可用區域中部署至少三個節點的 DAX。這可確保即使單一節點或可用區域故障,叢集仍保有多個節點可處理請求。叢集最多可包含 11 個節點,其中 1 個為主節點,10 個為讀取副本。

寫入輸送量規劃

所有 DAX 叢集皆具有用於寫入通過請求的主節點。節點類型的規模決定叢集的寫入容量。新增更多讀取副本不會提升叢集的寫入容量。因此,應在建立叢集時評估寫入容量,因為節點類型日後無法變更。

若應用程式需透過 DAX 寫入通過以更新項目快取,應預留更多叢集資源以支援寫入。對 DAX 的寫入操作耗用的資源約為快取命中讀取的 25 倍。因此可能需使用比唯讀叢集更大型的節點類型。

如需判斷「寫入通過」或「寫入繞過」哪種機制較適合應用程式的進一步指南,請參閱 寫入策略

讀取輸送量規劃

DAX 叢集的讀取容量取決於工作負載的快取命中率。由於 DAX 在快取未命中時需從 DynamoDB 讀取資料,因此會耗用約為快取命中讀取 10 倍的叢集資源。若要提升快取命中率,請提高快取的 TTL 設定,以定義項目在快取中的儲存時間。但較長的 TTL 時間會提高讀取舊項目版本的機率,除非更新是透過 DAX 寫入通過的。

為確保叢集具足夠讀取容量,請依 水平擴展叢集 所述進行水平擴展。新增節點會將讀取副本加入資源集區,而移除節點則會降低讀取容量。在選擇叢集節點數量與大小時,應同時考量所需的最小與最大讀取容量。若無法以較小節點類型水平擴展叢集以滿足讀取需求,應改用較大型節點類型。

資料集大小規劃

每種可用節點類型皆具固定記憶體容量,供 DAX 用於快取資料。若節點類型過小,應用程式的工作資料集無法完整載入記憶體,將導致快取未命中。由於較大型節點支援更大的快取容量,請選用比預估需快取資料集更大的節點類型。較大的快取同時有助提升快取命中率。

若快取的項目重複讀取次數較少,快取效益可能遞減。計算經常存取項目的記憶體需求,並確保快取容量足以容納該資料集。

計算叢集的大致容量需求

您可以預估工作負載的總容量需求,以協助選擇適當的叢集節點規格與數量。若要進行此估算,請計算變數標準化每秒請求數 (Normalized RPS)。此變數代表應用程式要求 DAX 叢集支援的總工作量,包含快取命中、快取遺漏及寫入作業。若要計算標準化 RPS,請使用以下輸入參數:

  • ReadRPS_CacheHit – 指定每秒導致快取命中的讀取請求數。

  • ReadRPS_CacheMiss – 指定每秒導致快取遺漏的讀取請求數。

  • WriteRPS – 指定每秒透過 DAX 執行的寫入請求數。

  • DaxNodeCount – 指定 DAX 叢集中的節點數。

  • Size – 指定寫入或讀取項目的大小 (以 KB 為單位),並四捨五入至最接近整數 KB。

  • 10x_ReadMissFactor – 表示數值 10。發生快取遺漏時,DAX 會耗用比快取命中多約 10 倍的資源。

  • 25x_WriteFactor – 表示數值 25,因為 DAX 寫入作業耗用的資源約為快取命中的 25 倍。

請使用下列公式計算標準化 RPS。

Normalized RPS = (ReadRPS_CacheHit * Size) + (ReadRPS_CacheMiss * Size * 10x_ReadMissFactor) + (WriteRequestRate * 25x_WriteFactor * Size * DaxNodeCount)

例如,請參考以下輸入參數值:

  • ReadRPS_CacheHit = 50,000

  • ReadRPS_CacheMiss = 1,000

  • ReadMissFactor = 1

  • Size = 2 KB

  • WriteRPS = 100

  • WriteFactor = 1

  • DaxNodeCount = 3

將這些數值代入公式後,可得出標準化 RPS,計算如下。

Normalized RPS = (50,000 Cache Hits/Sec * 2KB) + (1,000 Cache Misses/Sec * 2KB * 10) + (100 Writes/Sec * 25 * 2KB * 3)

在此範例中,計算所得的標準化 RPS 為 135,000。不過,此標準化 RPS 值未考慮叢集使用率低於 100% 或節點遺失的情況。建議預留額外容量。為此,請判斷以下兩項倍增因子中的較大值:目標使用率或節點遺失容錯能力。接著,將標準化 RPS 乘以較大因子,以取得目標每秒請求數 (Target RPS)。

  • 目標使用率

    因為效能下降會導致快取遺漏增加,因此不建議讓 DAX 叢集以 100% 使用率運行。理想情況下,叢集使用率應維持在 70% 或以下。為達此目標,請將標準化 RPS 乘以 1.43。

  • 節點遺失容錯能力

    當節點發生故障時,應用程式必須能在其餘節點間分散請求。為確保節點使用率低於 100%,請選擇足夠大的節點類型,以便在故障節點恢復上線前吸收額外流量。節點較少的叢集在單一節點故障時,每個節點必須能承受更大的流量成長。

    若主節點發生故障,DAX 會自動容錯移轉至讀取複本,並將其指定為新的主節點。若複本節點發生故障,DAX 叢集中的其他節點仍可持續處理請求,直到故障節點復原。

    例如,3 節點的 DAX 叢集若有一個節點故障,其餘兩個節點需額外承擔 50% 的容量。此情況需採用乘數係數 1.5。相對地,11 節點叢集若有節點故障,其餘節點需增加 10% 的容量,或採用乘數係數 1.1。

可使用下列公式計算目標 RPS。

Target RPS = Normalized RPS * CEILING(TargetUtilization, NodeLossTolerance)

例如,若要計算目標 RPS,請考慮下列數值:

  • Normalized RPS = 135,000

  • TargetUtilization = 1.43

    由於目標叢集使用率上限為 70%,因此將 TargetUtilization 設為 1.43。

  • NodeLossTolerance = 1.5

    假設使用 3 節點叢集,因此將 NodeLossTolerance 設為 50% 的容量。

將這些數值代入公式,即可計算出目標 RPS,如下所示。

Target RPS = 135,000 * CEILING(1.43, 1.5)

在此範例中,由於 NodeLossTolerance 的值大於 TargetUtilization,因此以 NodeLossTolerance 計算目標 RPS。計算結果為目標 RPS = 202,500,即 DAX 叢集需支援的總容量。若要判斷叢集中所需節點數,請將目標 RPS 對應至下表中的適當欄位。以 202,500 的目標 RPS 為例,需使用三個節點的 dax.r5.large 節點類型。

依節點類型估算叢集輸送容量

可使用 Target RPS formula 估算不同節點類型的叢集容量。下表顯示 1、3、5 和 11 節點叢集的近似容量。這些容量估值無法取代使用自有資料與請求模式進行 DAX 負載測試的必要性。此外,這些容量不包含 t 類型執行個體,因其不具固定 CPU 容量。下表中所有數值的單位均為標準化 RPS。

節點類型 (記憶體) 1 個節點 3 個節點 5 個節點 11 個節點
dax.r5.24xlarge (768GB) 100 萬 300 萬 500 萬 1,100 萬
dax.r5.16xlarge (512GB) 100 萬 300 萬 500 萬 1,100 萬
dax.r5.12xlarge (384GB) 100 萬 300 萬 500 萬 1,100 萬
dax.r5.8xlarge (256GB) 100 萬 300 萬 500 萬 1,100 萬
dax.r5.4xlarge (128GB) 60 萬 180 萬 300 萬 660 萬
dax.r5.2xlarge (64GB) 30 萬 90 萬 150 萬 330 萬
dax.r5.xlarge (32GB) 15 萬 45 萬 75 萬 165 萬
dax.r5.large (16GB) 7.5 萬 22.5 萬 37.5 萬 82.5 萬

由於每個節點的 NPS (每秒網路操作) 上限為 100 萬,因此類型為 dax.r5.8xlarge 或更大的節點不會提供額外叢集容量。大於 8xlarge 的節點類型可能不會增加叢集的總輸送容量。不過,這類節點類型有助於在記憶體中容納更大的工作資料集。

在 DAX 叢集中擴展寫入容量

每次寫入 DAX 都會在每個節點上消耗 25 個標準化請求。由於每個節點的 RPS 上限為 100 萬,因此 DAX 叢集的寫入上限為每秒 40,000 次,不包含讀取用量。

若快取中的寫入需求超過每秒 40,000 次,則必須使用多個獨立 DAX 叢集,並將寫入資料碎片分散於各叢集。類似 DynamoDB,可對寫入快取的資料分割區索引鍵進行雜湊處理。接著,使用取模運算判定應將資料寫入哪個碎片。

下列範例計算輸入字串的雜湊值。接著,以 10 為基準計算該雜湊值的取模結果。

def hash_modulo(input_string): # Compute the hash of the input string hash_value = hash(input_string) # Compute the modulus of the hash value with 10 bucket_number = hash_value % 10 return bucket_number #Example usage if _name_ == "_main_": input_string = input("Enter a string: ") result = hash_modulo(input_string) print(f"The hash modulo 10 of '{input_string}' is: {result}.")