

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

# 以複本集的形式連線至 Amazon DocumentDB
<a name="connect-to-replica-set"></a>

當您針對 Amazon DocumentDB 進行開發 （與 MongoDB 相容） 時，建議您以複本集的形式連接至叢集，並使用驅動程式的內建讀取偏好設定功能將讀取分散至複本執行個體。本節會更深入地介紹其意義，並說明如何使用適用於 Python 的 SDK 做為複本集來連線至 Amazon DocumentDB 叢集。

Amazon DocumentDB 有三個端點，可用來連線至叢集：
+ 叢集端點
+ 讀取器端點
+ 執行個體端點

在大多數情況下，當您連線到 Amazon DocumentDB 時，我們建議您使用叢集端點。這是將指向您叢集中主要執行個體的 CNAME，如下圖所示。

使用 SSH 通道時，建議您使用叢集端點連線至叢集，並且不要嘗試以複本集模式 (即在連線字串中指定 `replicaSet=rs0`) 進行連線，因為這會導致錯誤。

**注意**  
如需 Amazon DocumentDB 端點的詳細資訊，請參閱 [Amazon DocumentDB 端點](how-it-works.md#how-it-works.endpoints)。

![\[顯示 Amazon DocumentDB 端點的圖表，包括叢集、讀取器和執行個體端點。\]](http://docs.aws.amazon.com/zh_tw/documentdb/latest/developerguide/images/docdb-endpoint-types.png)


使用叢集端點時，您可以連接至處在複本集模式下的叢集。您就可以使用內建的讀取偏好設定驅動程式功能。在下列範例中，指定 `/?replicaSet=rs0` 時，系統會通知軟體開發套件您想要以複本集形式進行連接。如果您省略 `/?replicaSet=rs0'`，用戶端會將所有請求路由到叢集端點，也就是您的主要執行個體。

```
## Create a MongoDB client, open a connection to Amazon DocumentDB as a
   ## replica set and specify the read preference as secondary preferred
   client = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0')
```

以複本集形式連接的優點，就是其可讓軟體開發套件自動探索叢集拓撲圖，包括當叢集新增或移除執行個體時。然後，您就可以將讀取請求路由至複本執行個體，提高叢集的使用效率。

當您以複本集形式連接時，您可以指定 `readPreference` 進行連線。如果您指定的是 `secondaryPreferred` 的讀取偏好設定，則用戶端會將讀取查詢路由到您的複本，並將查詢寫入到您的主要執行個體 (如下圖所示)。這是較佳的叢集資源使用方式。如需詳細資訊，請參閱[讀取偏好設定選項](how-it-works.md#durability-consistency-isolation)。

```
## Create a MongoDB client, open a connection to Amazon DocumentDB as a
   ##   replica set and specify the read preference as secondary preferred
client = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0&readPreference=secondaryPreferred')
```

![\[顯示 Amazon DocumentDB readPreference：secondaryPreferred 的圖表。\]](http://docs.aws.amazon.com/zh_tw/documentdb/latest/developerguide/images/docdb-readPreference-secondaryPreferred.png)


Amazon DocumentDB 複本的讀取最終一致。它們會依據主要執行個體上的相同寫入順序來傳回資料，而且複寫延遲通常少於 50 毫秒。您可以使用 Amazon CloudWatch 指標`DBInstanceReplicaLag`和 監控叢集的複本延遲`DBClusterReplicaLagMaximum`。如需詳細資訊，請參閱[使用 CloudWatch 監控 Amazon DocumentDB](cloud_watch.md)。

與傳統的單體資料庫架構不同，Amazon DocumentDB 會區隔儲存和運算。假設您使用這種現代架構，那麼我們鼓勵您讀取複本執行個體上的擴展。複本執行個體上的讀取不會封鎖從主要執行個體複寫的寫入。您在叢集中最多可以新增 15 個讀取複本執行個體，並將讀取量擴展到每秒數百萬次讀取。

以複本集形式連接，並將讀取分配至複本的主要優點，在於其會在叢集中增加可供您應用程式使用的整體資源。我們建議以複本集形式連接來進行最佳實務。此外，我們最常在下列案例中建議使用這個做法：
+ 您正使用主要執行個體上將近 100% 的 CPU。
+ 緩衝區快取命中率接近零。
+ 您的個別執行個體的連線或游標已達上限。

您可以選擇向上擴展叢集執行個體大小，而且在某些情況下，這可能是擴展叢集的最佳方式。但是，您也應該考慮如何提高叢集中既有複本的使用量。這可讓您直接增加擴展，而不用增加使用更大執行個體類型的成本。我們也建議您使用 CloudWatch 警示來監控和提醒這些限制 （即 `DatabaseConnections`、 `CPUUtilization`和 `BufferCacheHitRatio`)，以便您了解資源何時大量使用。

如需詳細資訊，請參閱下列主題：
+ [Amazon DocumentDB 的最佳實務](best_practices.md)
+ [Amazon DocumentDB 配額和限制](limits.md)

## 使用叢集連線
<a name="connect-to-replica-set.utilizing-cluster-connections"></a>

請考慮使用叢集中所有連線的案例。例如，`r5.2xlarge` 執行個體的連線數目限為 4,500 個 (而開放游標限制為 450 個)。如果您建立三執行個體 Amazon DocumentDB 叢集，並僅使用叢集端點連接至主要執行個體，則開放連線和游標的叢集限制分別為 4，500 和 450。如果您建立的應用程式會使用多個將從容器啟動的 Worker，那麼您可能會達到這些限制。這些容器會一次開啟多個連線，並使叢集達到飽和。

反之，您可以將 Amazon DocumentDB 叢集做為複本集來連接，並將您的讀取分散至複本執行個體。接著，您可以將叢集中的可用連線和游標數量成功增為三倍，分別為 13,500 和 1,350。將更多執行個體新增至叢集時，只會增加讀取工作負載的連線數和游標數。如果您需要在叢集中增加寫入連線數目，建議您增加執行個體大小。

**注意**  
`large`、`xlarge` 和 `2xlarge` 執行個體的連線數目會隨著執行個體大小增加，最多達 4,500 個。`4xlarge` 個或超過 4,500 個執行個體時，每個執行個體的連線數目上限。如需依執行個體類型限制的詳細資訊，請參閱 [執行個體限制](limits.md#limits.instance)。

一般而言，我們不建議您使用 `secondary` 的讀取偏好設定來連接至叢集 。原因在於如果您的叢集中沒有複本執行個體，該讀取將會失敗。例如，假設您有一個具有一個主要複本和一個複本的兩個執行個體 Amazon DocumentDB 叢集。如果複本發生問題，則設為 `secondary` 之連線集區的讀取請求將會失敗。使用 `secondaryPreferred` 的優點，在於如果用戶端找不到適合的複本執行個體來進行連接，則其會回復到主要執行個體來進行讀取。

## 多個連線集區
<a name="connect-to-replica-set.multiple-connection-pools"></a>

在某些情況下，應用程式中的讀取需要具有read-after-write一致性，只能從 Amazon DocumentDB 的主要執行個體提供。在這些情況下，您可以建立兩個用戶端連線集區：一個用於寫入，另一個用於需要先寫後讀一致性的讀取。若要這樣做，您的程式碼應該與下列類似。

```
## Create a MongoDB client, 
##    open a connection to Amazon DocumentDB as a replica set and specify the readPreference as primary
clientPrimary = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0&readPreference=primary') 
   
## Create a MongoDB client, 
##    open a connection to Amazon DocumentDB as a replica set and specify the readPreference as secondaryPreferred
secondaryPreferred = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0&readPreference=secondaryPreferred')
```

另一種選擇是建立單一連線集區，並覆寫指定集合的讀取偏好設定。

```
##Specify the collection and set the read preference level for that collection
col = db.review.with_options(read_preference=ReadPreference.SECONDARY_PREFERRED)
```

## Summary
<a name="connect-to-replica-set.summary"></a>

若要提高叢集資源的使用效能，建議您使用複本集模式連接至您的叢集。如果您的應用程式適合這種做法，您可以將讀取分配到該複本執行個體，讀取擴展您的應用程式。