本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
DAX 叢集的總容量和可用性取決於節點類型和計數。叢集中的更多節點會增加其讀取容量,但不會增加寫入容量。較大的節點類型 (最高 r5.8xlarge) 可以處理更多寫入,但節點失敗時,太少會影響可用性。如需調整 DAX 叢集大小的詳細資訊,請參閱 DAX 叢集調整大小指南。
以下各節討論了在建立可擴展且符合成本效益的叢集時,應考量哪些不同的大小調整層面來平衡節點類型和計數。
規劃可用性
調整 DAX 叢集的大小時,您應該先專注於其目標可用性。叢集服務的可用性,例如 DAX,是叢集中節點總數的維度。由於單一節點叢集對失敗沒有容錯能力,因此其可用性等於一個節點。在 10 節點叢集中,單一節點的遺失對叢集的整體容量影響最小。此遺失不會對可用性造成直接影響,因為剩餘的節點仍然可以滿足讀取請求。若要繼續寫入,DAX 會快速指定新的主節點。
DAX 是以 VPC 為基礎。它使用子網路群組來判斷可以在哪些可用區域
規劃寫入輸送量
所有 DAX 叢集都有一個用於寫入請求的主要節點。叢集的節點類型大小會決定其寫入容量。新增其他僅供讀取複本並不會增加叢集的寫入容量。因此,您應該在叢集建立期間考慮寫入容量,因為您之後無法變更節點類型。
如果您的應用程式需要透過 DAX 來更新項目快取,請考慮增加叢集資源的使用量,以方便寫入。針對 DAX 的寫入耗用比 cache-hit 讀取多約 25 倍的資源。這可能需要比唯讀叢集更大的節點類型。
如需判斷寫入或全寫是否最適合您應用程式的其他指導,請參閱寫入策略。
規劃讀取輸送量
DAX 叢集的讀取容量取決於工作負載的快取命中率。由於 DAX 會在快取遺失時從 DynamoDB 讀取資料,因此會耗用比快取命中多約 10 倍的叢集資源。若要增加快取命中,請增加快取的 TTL 設定,以定義項目存放在快取中的期間。不過,除非透過 DAX 寫入更新,否則較高的 TTL 持續時間會增加讀取舊項目版本的機會。
為了確保叢集具有足夠的讀取容量,請水平擴展叢集,如 中所述水平擴展叢集。新增更多節點將僅供讀取複本新增至資源集區,同時移除節點會減少讀取容量。當您選取叢集的節點數量及其大小時,請考慮所需的最小和最大讀取容量。如果您無法以較小的節點類型水平擴展叢集以符合您的讀取需求,請使用較大的節點類型。
規劃資料集大小
每個可用的節點類型都有一組記憶體大小,讓 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% 或以下。若要達成此目標,請將標準化 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
,因此我們會使用 計算目標 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 萬 | 75 萬 | 165 萬 |
dax.r5.large (16GB) | 75k | 225k | 375k | 825k |
由於每個節點的 NPS (每秒網路操作數) 上限為 100 萬個,因此類型 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}.")