調整DAX叢集的大小 - Amazon DynamoDB

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

調整DAX叢集的大小

DAX 叢集的總容量和可用性取決於節點類型和計數。叢集中的更多節點會增加其讀取容量,但不會增加寫入容量。較大的節點類型 (最高 r5.8xlarge) 可以處理更多寫入,但節點失敗時,太少會影響可用性。如需調整DAX叢集大小的詳細資訊,請參閱 DAX 叢集大小調整指南

下列各節討論在建立可擴展且符合成本效益的叢集時,應考量哪些不同的大小調整層面來平衡節點類型和計數。

規劃可用性

調整DAX叢集大小時,您應該先專注於其目標可用性。叢集服務的可用性,例如 DAX,是叢集中節點總數的維度。由於單一節點叢集沒有故障的容錯能力,因此其可用性等於一個節點。在 10 節點叢集中,單一節點的遺失對叢集的整體容量影響最小。此遺失不會對可用性造成直接影響,因為剩餘的節點仍然可以滿足讀取請求。若要繼續寫入, 會DAX快速指定新的主節點。

DAX 以 VPC為基礎。它使用子網路群組來判斷可以在哪些可用區域執行節點,以及要從子網路使用哪些 IP 地址。對於生產工作負載,強烈建議您在不同的可用區域中DAX使用至少三個節點。這可確保叢集還有多個節點可以處理請求,即使單一節點或可用區域失敗。叢集最多可以有 11 個節點,其中一個是主要節點,而 10 個是僅供讀取複本。

規劃寫入輸送量

所有DAX叢集都有用於寫入請求的主要節點。叢集的節點類型大小會決定其寫入容量。新增其他僅供讀取複本並不會增加叢集的寫入容量。因此,您應該在建立叢集時考慮寫入容量,因為您之後無法變更節點類型。

如果您的應用程式需要寫入DAX以更新項目快取,請考慮增加叢集資源的使用量,以方便寫入。針對 的寫入耗DAX用比 cache-hit 讀取多約 25 倍的資源。這可能需要比唯讀叢集更大的節點類型。

如需判斷寫入或全寫是否最適合您應用程式的其他指引,請參閱寫入策略

規劃讀取輸送量

DAX 叢集的讀取容量取決於工作負載的快取命中率。由於 會在快取遺失時從 DynamoDB DAX讀取資料,因此比 cache-hit 消耗大約 10 倍的叢集資源。若要增加快取命中,請增加快取TTL的設定,以定義項目存放在快取中的期間。不過,除非透過 寫入更新,否則TTL持續時間較長會增加讀取舊項目版本的機會DAX。

為了確保叢集具有足夠的讀取容量,請水平擴展叢集,如 中所述水平擴展叢集。新增更多節點會將僅供讀取複本新增至資源集區,同時移除節點會減少讀取容量。當您選取叢集的節點數量及其大小時,請考慮所需的最小和最大讀取容量。如果您無法以較小的節點類型水平擴展叢集,以符合您的讀取需求,請使用較大的節點類型。

規劃資料集大小

每個可用的節點類型都有一組記憶體大小DAX供 快取資料。如果節點類型太小,應用程式請求無法容納在記憶體中的工作資料集,並導致快取遺失。由於較大的節點支援較大的快取,請使用大於您需要快取之預估資料集的節點類型。較大的快取也會改善快取命中率。

快取項目的傳回可能會減少,但重複讀取次數很少。計算經常存取項目的記憶體大小,並確保快取夠大,足以存放該資料集。

計算大致叢集容量需求

您可以預估工作負載的總容量需求,以協助您選取適當的叢集節點大小和數量。若要執行此估算,請計算每秒變數標準化請求 (標準化 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乘以較大的係數,以取得每秒的目標請求 (目標 RPS)。

  • 目標使用率

    由於效能影響會增加快取遺漏,我們不建議以 100% 使用率執行DAX叢集。理想情況下,您應該將叢集使用率保持在 70% 或以下。若要達成此目標,請將標準化乘以 1RPS.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,因此我們RPS會使用 計算目標的值NodeLossTolerance。這會提供 202,500 RPS 個目標,這是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) 1M 3M 5M 11M
dax.r5.16xlarge (512GB) 1M 3M 5M 11M
dax.r5.12xlarge (384GB) 1M 3M 5M 11M
dax.r5.8xlarge (256GB) 1M 3M 5M 11M
dax.r5.4xlarge (128GB) 60 萬 180 萬 3M 660 萬
dax.r5.2xlarge (64GB) 30 萬 90 萬 150 萬 330 萬
dax.r5.xlarge (32GB) 15 萬 45 萬 750k 165 萬
dax.r5.large (16GB) 75k 225k 375k 825k

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

在DAX叢集中擴展寫入容量

每次寫入 都會在每個節點上DAX耗用 25 個標準化請求。由於每個節點有 100 萬個RPS限制,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}.")