

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

# MemoryDB 多區域
<a name="multi-region"></a>

MemoryDB Multi-Region 是一個全受管、主動-主動、多區域資料庫，可讓您建置多區域應用程式，可用性高達 99.999%、微秒讀取和單位數毫秒寫入延遲。您可以改善區域降級的可用性和彈性，同時受益於多區域應用程式的低延遲本機讀取和寫入。

透過 MemoryDB 多區域，您可以建置高度可用的多區域應用程式，以提高彈性。它提供主動-主動複寫，因此您可以從最接近您客戶的區域提供本機讀取和寫入，具有微秒讀取和一位數毫秒寫入延遲。MemoryDB 多區域會在區域之間非同步複寫資料，資料通常會在一秒內傳播。它會自動解決更新衝突並修正資料差異問題，讓您專注於應用程式。

下列 AWS 區域目前支援 MemoryDB 多區域：美國東部 （維吉尼亞北部和俄亥俄）、美國西部 （奧勒岡北部、加利佛尼亞北部）、歐洲 （愛爾蘭、法蘭克福和倫敦） 和亞太區域 （東京、雪梨、孟買、首爾和新加坡）。

只要從 或使用最新的 AWS SDK AWS 管理主控台 或 按幾下滑鼠，即可輕鬆開始使用 MemoryDB 多區域 AWS CLI。

**Topics**
+ [先決條件和限制](multi-region.prereq.md)
+ [運作方式](multi-region.how.md)
+ [一致性和衝突解決](#multi-region.conflict)
+ [搭配主控台使用 MemoryDB 多區域](multi-Region.console.md)
+ [搭配 CLI 使用 MemoryDB 多區域](multi-Region.cli.md)
+ [監控 MemoryDB 多區域](multi-Region.monitoring.md)
+ [使用 MemoryDB 多區域擴展](multi-Region.Scaling.md)
+ [支援和不支援的命令](multi-Region.SupportedCommands.md)

## 一致性和衝突解決
<a name="multi-region.conflict"></a>

對其中一個區域叢集中的金鑰所做的任何更新都會以非同步方式傳播到多區域叢集中的其他區域叢集，通常在一秒內傳播。如果區域變得隔離或降級，MemoryDB 多區域會追蹤任何已執行但尚未傳播到所有成員叢集的寫入。當區域恢復上線時，MemoryDB 多區域會繼續將任何待定寫入從該區域傳播到其他區域中的成員叢集。它也會繼續將寫入從其他成員叢集傳播到現在恢復線上的 區域。無論區域隔離多長時間，所有之前成功的寫入都將最終傳播。

如果您的應用程式大約同時更新不同區域中的相同金鑰，則可能會發生衝突。MemoryDB 多區域使用無衝突複寫資料類型 (CRDT) 來協調衝突的並行寫入。CRDT 是一種資料結構，無需協調即可獨立並行更新。這表示寫入寫入衝突會在每個複本上以最終一致性獨立合併。

具體而言，MemoryDB 會使用 2 個層級的 Last Writer Wins (LWW) 來解決衝突。對於字串資料類型，LWW 會解決金鑰層級的衝突。對於其他資料類型，LWW 會解決子索引鍵層級的衝突。衝突解決是完全受管的，並在背景發生，不會影響應用程式的可用性。以下是雜湊資料類型的範例：

區域 A 在時間戳記 T1 執行「HSET K F11 V1」；區域 B 在時間戳記 T2 執行「HSET K F22 V2」；複寫後，區域 A 和 B 都會具有兩個欄位的金鑰 K。當不同區域同時更新相同集合中的不同子索引鍵時，由於 MemoryDB 在雜湊資料類型的子索引鍵層級解決衝突，這兩個更新不會互相衝突。因此，最終資料將包含兩個更新的效果。


| 時間 | 區域 A | 區域 B | 
| --- | --- | --- | 
| T1 |  HSET K F1 V1 |  | 
| T2 |  |  HSET K F2 V2 | 
| T3 | 同步 | 同步 | 
| T4 |  K：{F1：V1、F2：V2} | K：{F1：V1、F2：V2} | 

### CRDT 和範例
<a name="clusters.multi-Region.CRDT"></a>

 MemoryDB 多區域實作無衝突複寫資料類型 (CRDT)，以解決從多個區域發出的並行寫入衝突。CRDT 允許不同區域在最終收到同一組操作時獨立實現最終一致性，無論排序為何。

 在多個區域中同時更新單一金鑰時，需要解決寫入衝突，才能達到資料一致性。MemoryDB Multi-Region 使用 Last Writer Wins (LWW) 策略來判斷獲勝操作，並且只會最終觀察「之後發生」的操作效果。如果 op1 的效果已在 Regionit 中套用，則表示操作 op1「之前發生」操作 op2 是在 op2 執行時原始執行的。

 對於集合 (Hash、Set 和 SortedSet) MemoryDB 多區域解析元素層級的衝突。這可讓 MemoryDB 多區域使用 LWW 來解決每個元素的寫入/寫入衝突。例如，從多個區域同時將不同的元素新增至相同的集合，將導致集合包含所有元素。

**並行執行：上次寫入器獲勝**

在 MemoryDB 多區域中，當同時建立金鑰時，在任何區域上執行的最後一個操作都會決定金鑰的結果。例如：

![並行執行：最後寫入器獲勝。](http://docs.aws.amazon.com/zh_tw/memorydb/latest/devguide/images/concurrent-ex-last-writer-wins.png)


金鑰 x 是在區域 B 上以值 "b" 建立，但在此之後，相同的金鑰是在區域 A 中以值 "a" 建立。最後，金鑰會收斂為值 "a"，因為區域 A 中的操作是上次執行的操作。

**並行執行與衝突的資料類型：最後寫入器獲勝**

在上述範例中，金鑰是在兩個區域中使用相同類型建立的。如果使用不同的資料類型建立金鑰，也會觀察到類似的行為：

![並行執行與衝突的資料類型：最後寫入器獲勝。](http://docs.aws.amazon.com/zh_tw/memorydb/latest/devguide/images/concurrent-ex-conflict-data-types-last-writer-wins.png)


金鑰 x 在區域 B 上建立為字串，值為 "b"。但之後，在該操作複寫到區域 A 之前，會在區域 A 中建立相同的金鑰做為雜湊。最後，金鑰會收斂在區域 A 上建立雜湊，因為區域 A 中的操作是上次執行的操作。

**並行 create-deletion：最後寫入器獲勝**

在同時刪除和建立 （表示值的取代/增加） 的情況下，上次執行的操作將會獲勝。最終結果將由刪除操作的順序決定。如果刪除之前發生：

![並行 create-deletion：如果之前發生刪除，最後寫入器會獲勝。](http://docs.aws.amazon.com/zh_tw/memorydb/latest/devguide/images/concurrent-create-delete-last-writer-wins-before.jpg)


已在區域 B 上刪除類型 Set 的金鑰 x。在此之後，區域 A 上的該金鑰會新增新的成員。最終，金鑰會收斂為在區域 A 上新增唯一元素的 Set，因為區域 A 上的操作是上次執行的操作。

如果刪除發生在以下時間之後：

![並行 create-deletion：如果刪除之後發生，最後寫入器會獲勝。](http://docs.aws.amazon.com/zh_tw/memorydb/latest/devguide/images/concurrent-create-delete-last-writer-wins-after.jpg)


已在區域 A 上將新的成員新增至類型為 Set on Region A 的金鑰 x。在區域 B 上刪除金鑰之後，該金鑰最終會收斂為刪除金鑰，因為區域 B 上的操作是上次執行的操作。

**計數器、並行操作：具有最後一個寫入器獲勝的完整值複寫**

MemoryDB 多區域中的計數器透過執行完整值複寫和套用last-writer-strategy，與非計數器類型的行為類似。並行操作不會合併，但最後一個操作將取而代之。例如：

![最後一個寫入器獲勝時的完整值複寫。](http://docs.aws.amazon.com/zh_tw/memorydb/latest/devguide/images/concurrent-full-rep-last-writer-wins.jpg)


在此案例中，金鑰 x 的起始值為 1。然後，區域 B 將計數器 x 增加 2，然後不久之後區域 A 將計數器增加 1。由於區域 A 是上次執行的操作，因此金鑰 x 最終會收斂至值 2，因為增加 1 是上次執行的操作。

**非確定性命令會複寫為確定性**

為了確保不同區域的值一致性，MemoryDB Multi-Region 非確定性命令會複寫為確定性。非確定性命令是依賴外部因素的命令，例如 SETNX。SETNX 取決於金鑰是否存在，而且金鑰可能存在於遠端區域，但不存在於接收命令的本機區域中。因此，否則非確定性命令會複寫為完整值複寫。如果是字串，則會將其複寫為 SET 命令。

![將複寫為確定性的非確定性命令。](http://docs.aws.amazon.com/zh_tw/memorydb/latest/devguide/images/nondeterministic_commands.png)


總而言之，字串類型的所有操作都會複寫為 SET 或 DEL，雜湊類型的所有操作都會複寫為 HSET 或 HDEL，設定類型的所有操作都會複寫為 SADD 或 SREM，排序設定的所有操作都會複寫為 ZADD 或 ZREM。