

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

# 調整 DAX 叢集大小
<a name="dax-cluster-sizing"></a>

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

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

**Topics**
+ [可用性規劃](#dax-sizing-availability)
+ [寫入輸送量規劃](#dax-sizing-write-throughput)
+ [讀取輸送量規劃](#dax-sizing-read-throughput)
+ [資料集大小規劃](#dax-sizing-dataset-size)
+ [計算叢集的大致容量需求](#dax-sizing-cluster-capacity)
+ [依節點類型估算叢集輸送容量](#dax-sizing-cluster-throughput-capacity)
+ [在 DAX 叢集中擴展寫入容量](#dax-sizing-scaling-write-capacity)

## 可用性規劃
<a name="dax-sizing-availability"></a>

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

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

## 寫入輸送量規劃
<a name="dax-sizing-write-throughput"></a>

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

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

如需判斷「寫入通過」或「寫入繞過」哪種機制較適合應用程式的進一步指南，請參閱 [寫入策略](DAX.consistency.md#DAX.consistency.strategies-for-writes)。

## 讀取輸送量規劃
<a name="dax-sizing-read-throughput"></a>

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

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

## 資料集大小規劃
<a name="dax-sizing-dataset-size"></a>

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

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

## 計算叢集的大致容量需求
<a name="dax-sizing-cluster-capacity"></a>

您可以預估工作負載的總容量需求，以協助選擇適當的叢集節點規格與數量。若要進行此估算，請計算變數*標準化每秒請求數* (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 對應至[下表](#dax-sizing-cluster-throughput-capacity)中的適當欄位。以 202,500 的目標 RPS 為例，需使用三個節點的 dax.r5.large 節點類型。

## 依節點類型估算叢集輸送容量
<a name="dax-sizing-cluster-throughput-capacity"></a>

可使用 [Target RPS formula](#Target-RPS-formula) 估算不同節點類型的叢集容量。下表顯示 1、3、5 和 11 節點叢集的近似容量。這些容量估值無法取代使用自有資料與請求模式進行 DAX 負載測試的必要性。此外，這些容量不包含 [t 類型](DAX.Burstable.md)執行個體，因其不具固定 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 叢集中擴展寫入容量
<a name="dax-sizing-scaling-write-capacity"></a>

每次寫入 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}.")
```