

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

# 連線問題疑難排解
<a name="troubleshooting.connecting"></a>

連線時發生問題？ 以下是一些常見的案例，以及如何解決這些案例。

**主題**
+ [無法連線至 Amazon DocumentDB 端點](#troubleshooting-connecting)
+ [測試與 Amazon DocumentDB 執行個體的連線](#troubleshooting.testing-connection)
+ [連線至無效的端點](#troubleshooting.invalid-endpoint)
+ [影響連線數量的驅動程式組態](#troubleshooting.driver.config)

## 無法連線至 Amazon DocumentDB 端點
<a name="troubleshooting-connecting"></a>

當您嘗試連線至 Amazon DocumentDB 時，下列是您可能會收到的最常見錯誤訊息之一。

```
connecting to: mongodb://docdb-2018-11-08-21-47-27.cluster-ccuszbx3pn5e.us-east-
1.docdb.amazonaws.com:27017/
2018-11-14T14:33:46.451-0800 W NETWORK [thread1] Failed to connect to
172.31.91.193:27017 after 5000ms milliseconds, giving up.
2018-11-14T14:33:46.452-0800 E QUERY [thread1] Error: couldn't connect to server
docdb-2018-11-08-21-47-27.cluster-ccuszbx3pn5e.us-east-1.docdb.amazonaws.com:27017,
connection attempt failed :
connect@src/mongo/shell/mongo.js:237:13
@(connect):1:6
exception: connect failed
```

此錯誤訊息通常表示您的用戶端 （此範例中的 mongo shell) 無法存取 Amazon DocumentDB 端點。這可能有幾個原因：

**Topics**
+ [從公有端點連線](#troubleshooting.cannot-connect.public-endpoints)
+ [跨區域連線](#troubleshooting.cannot-connect.different-regions)
+ [從不同的 Amazon VPCs 連線](#troubleshooting.cannot-connect.different-vpcs)
+ [安全群組封鎖傳入連線](#troubleshooting.cannot-connect.inbound-not-allowed)
+ [Java Mongo 驅動程式讀取偏好設定問題](#troubleshooting-cannot-connect-java-mongo-issue)

### 從公有端點連線
<a name="troubleshooting.cannot-connect.public-endpoints"></a>

**您正在嘗試直接從筆記型電腦或本機開發機器連線至 Amazon DocumentDB 叢集。**

嘗試直接從您的筆記型電腦或本機開發機器等公有端點連線至 Amazon DocumentDB 叢集將會失敗。Amazon DocumentDB 是僅限虛擬私有雲端 (VPC)，目前不支援公有端點。因此，您無法從筆記型電腦或 VPC 外部的本機開發環境直接連線至 Amazon DocumentDB 叢集。

若要從 Amazon VPC 外部連線至 Amazon DocumentDB 叢集，您可以使用 SSH 通道。如需詳細資訊，請參閱[從 Amazon VPC 外部連線至 Amazon DocumentDB 叢集](connect-from-outside-a-vpc.md)。此外，如果您的開發環境位於不同的 Amazon VPC 中，您也可以使用 VPC 對等互連，並從相同區域或不同區域的另一個 Amazon VPC 連線至您的 Amazon DocumentDB 叢集。

### 跨區域連線
<a name="troubleshooting.cannot-connect.different-regions"></a>

**您嘗試連線到另一個區域中的 Amazon DocumentDB 叢集。**

如果您嘗試從叢集區域以外的 區域中的 Amazon EC2 執行個體連線至 Amazon DocumentDB 叢集，例如，嘗試從美國西部 （奧勒岡） 區域 (us-west-2) 連線至美國東部 （維吉尼亞北部） 區域 (us-east-1) 中的叢集，連線將會失敗。

若要驗證 Amazon DocumentDB 叢集的區域，請執行下列命令。區域在端點中。

```
aws docdb describe-db-clusters \
   --db-cluster-identifier sample-cluster \
   --query 'DBClusters[*].Endpoint'
```

此操作的輸出將會如下所示。

```
[
    "sample-cluster.node.us-east-1.docdb.amazonaws.com"
]
```

為了驗證您的 EC2 執行個體的區域，請執行以下命令。

```
 aws ec2 describe-instances \
     --query 'Reservations[*].Instances[*].Placement.AvailabilityZone'
```

此操作的輸出將會如下所示。

```
[
    [
        "us-east-1a"
    ]
]
```

### 從不同的 Amazon VPCs 連線
<a name="troubleshooting.cannot-connect.different-vpcs"></a>

**您嘗試從與您部署叢集的 Amazon VPC 不同的 VPC 連線至 Amazon DocumentDB 叢集。**

如果您的 Amazon DocumentDB 叢集和 Amazon EC2 執行個體都位於相同的 Amazon VPC 中 AWS 區域，但不在相同的 Amazon VPC 中，除非在兩個 Amazon VPCs 之間啟用 VPC 對等互連，否則您無法直接連線至 Amazon DocumentDB 叢集。

若要驗證 Amazon DocumentDB 執行個體的 Amazon VPC，請執行下列命令。

```
aws docdb describe-db-instances \
   --db-instance-identifier sample-instance \
   --query 'DBInstances[*].DBSubnetGroup.VpcId'
```

若要驗證 Amazon EC2 執行個體的 Amazon VPC，請執行下列命令。

```
aws ec2 describe-instances \
   --query 'Reservations[*].Instances[*].VpcId'
```

### 安全群組封鎖傳入連線
<a name="troubleshooting.cannot-connect.inbound-not-allowed"></a>

**您嘗試連線到 Amazon DocumentDB 叢集，而叢集的安全群組不允許叢集連接埠上的傳入連線 （預設連接埠：27017)。**

假設您的 Amazon DocumentDB 叢集和 Amazon EC2 執行個體都位於相同的區域和 Amazon VPC，並使用相同的 Amazon VPC 安全群組。如果您無法連線至 Amazon DocumentDB 叢集，可能原因為叢集的安全群組 （也就是防火牆） 不允許您為 Amazon DocumentDB 叢集選擇的連接埠 （預設連接埠為 27017) 上的傳入連線。

若要驗證 Amazon DocumentDB 叢集的連接埠，請執行下列命令。

```
aws docdb describe-db-clusters \
   --db-cluster-identifier sample-cluster \
   --query 'DBClusters[*].[DBClusterIdentifier,Port]'
```

若要取得叢集的 Amazon DocumentDB 安全群組，請執行下列命令。

```
aws docdb describe-db-clusters \
   --db-cluster-identifier sample-cluster \
   --query 'DBClusters[*].[VpcSecurityGroups[*],VpcSecurityGroupId]'
```

若要檢查安全群組的傳入規則，請參閱 Amazon EC2 文件中的下列主題：
+ [ 授權 Linux 執行個體的傳入流量](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/authorizing-access-to-an-instance.html)
+ [ 授權 Windows 執行個體的傳入流量](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/authorizing-access-to-an-instance.html)

### Java Mongo 驅動程式讀取偏好設定問題
<a name="troubleshooting-cannot-connect-java-mongo-issue"></a>

**除非重新啟動，否則不會遵守用戶端讀取偏好設定，而且某些用戶端無法在容錯移轉後寫入 Amazon DocumentDB。**

此問題在 Java Mongo Driver 3.7.x 中首次發現，發生在用戶端使用 建立與 Amazon DocumentDB 的連線`MongoClientSettings`，特別是鏈結`applyToClusterSettings`方法時。MongoClient 叢集設定可以使用幾種不同的方法來定義，例如 `hosts()`、 `requiredReplicaSetName()`和 `mode()`。

 當用戶端在 `hosts()`方法中只指定一個主機時，模式會設定為 `ClusterConnectionMode.SINGLE`而非 `ClusterConnectionMode.MULTIPLE` 這會讓用戶端忽略讀取偏好設定，並只連線到 中設定的伺服器`hosts()`。因此，即使用戶端設定初始化如下，所有讀取仍會移至主要 而非次要 。

```
final ServerAddress serverAddress0 = new ServerAddress("cluster-endpoint", 27317));
    final MongoCredential credential = MongoCredential.createCredential("xxx",
            "admin", "xxxx".toCharArray());
    final MongoClientSettings settings = MongoClientSettings.builder()
            .credential(credential)
            .readPreference(ReadPreference.secondaryPreferred())
            .retryWrites(false)
            .applyToSslSettings(builder -> builder
                    .enabled(false))
            .applyToClusterSettings(builder -> builder.hosts(
                            Arrays.asList(serverAddress0
                            ))
                    .requiredReplicaSetName("rs0"))
            .build();
    MongoClient mongoClient = MongoClients.create(settings);
```

**容錯移轉案例**

使用上述用戶端連線設定，如果叢集寫入器端點有容錯移轉和延遲 DNS 記錄更新，用戶端仍會嘗試向舊寫入器發出寫入 （現在容錯移轉後的讀取器）。這會導致伺服器端錯誤 （非主要），Java 驅動程式未適當處理 （這仍在調查中）。因此，用戶端可能會處於錯誤狀態，直到應用程式伺服器重新啟動為止。

有兩種解決方法：
+ 透過連線字串連線至 Amazon DocumentDB 的用戶端不會發生此問題，因為 `ClusterConnectionMode`會在設定讀取偏好設定`MULTIPLE`時設定為 。

  ```
  MongoClientURI mongoClientURI = new MongoClientURI("mongodb://usr:pass:cluster-endpoint:27317/test?ssl=false&replicaSet=rs0&readpreference=secondaryPreferred");
  MongoClient mongoClient = MongoClients.create(mongoClientURI.getURI());
  ```

  或搭配 `applyConnectionString`方法使用`MongoClientSettings`建置器。

  ```
  final MongoClientSettings settings = MongoClientSettings.builder()
          .credential(credential)
          .applyConnectionString(new ConnectionString("usr:pass:cluster-endpoint:27317/test?ssl=false&replicaSet=rs0&readpreference=secondaryPreferred"))
          .retryWrites(false)
          .applyToSslSettings(builder → builder
                  .enabled(false))
          .build();
  MongoClient mongoClient = MongoClients.create(settings);
  ```
+ 明確`ClusterConnectionMode`設定為 `MULTIPLE`。這只有在使用 `applyToClusterSettings`和 時才需要`hosts().size() == 1`。

  ```
  final ServerAddress serverAddress0 = new ServerAddress("cluster-endpoint", 27317));
  final MongoCredential credential = MongoCredential.createCredential("xxx","admin", "xxxx".toCharArray());
  final MongoClientSettings settings = MongoClientSettings.builder()
      .credential(credential)
      .readPreference(ReadPreference.secondaryPreferred())
      .retryWrites(false)
      .applyToSslSettings(builder → builder
      .enabled(false))
      .applyToClusterSettings(builder → builder
                  .hosts(Arrays.asList(serverAddress0))
                  .requiredReplicaSetName("rs0"))
                  .mode(ClusterConnectionMode.MULTIPLE))
      .build();
  MongoClient mongoClient = MongoClients.create(settings);
  ```

## 測試與 Amazon DocumentDB 執行個體的連線
<a name="troubleshooting.testing-connection"></a>

您可以使用通用的 Linux 或 Windows 工具來測試您的叢集連線。

 從 Linux 或 Unix 終端機測試連線，方法是輸入下列命令 (以端點取代 `cluster-endpoint`，以及以執行個體的連接埠取代 `port`)：

```
nc -zv cluster-endpoint port 
```

以下是範例操作和傳回值的範例：

```
nc -zv docdbTest.d4c7nm7stsfc0.us-west-2.docdb.amazonaws.com 27017
   
Connection to docdbTest.d4c7nm7stsfc0.us-west-2.docdb.amazonaws.com 27017 port [tcp/*] succeeded!
```

## 連線至無效的端點
<a name="troubleshooting.invalid-endpoint"></a>

連線至 Amazon DocumentDB 叢集並使用無效的叢集端點時，會出現類似以下的錯誤。

```
mongo --ssl \
   --host sample-cluster.node.us-east-1.docdb.amazonaws.com:27017 \
   --sslCAFile global-bundle.pem \
   --username <user-name> \
   --password <password>
```

輸出如下：

```
MongoDB shell version v3.6
connecting to: mongodb://sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/
2018-11-14T17:21:18.516-0800 I NETWORK [thread1] getaddrinfo("sample-cluster.node.us-east-1.docdb.amazonaws.com") failed: 
nodename nor servname provided, or not known 2018-11-14T17:21:18.537-0800 E QUERY [thread1] Error: couldn't initialize
connection to host sample-cluster.node.us-east-1.docdb.amazonaws.com, address is invalid :
connect@src/mongo/shell/mongo.js:237:13@(connect):1:6
exception: connect failed
```

若要取得有效的叢集端點，請執行下列命令：

```
aws docdb describe-db-clusters \
   --db-cluster-identifier sample-cluster \
   --query 'DBClusters[*].[Endpoint,Port]'
```

若要取得有效的執行個體端點，請執行下列命令：

```
aws docdb describe-db-instances \
   --db-instance-identifier sample-instance \
   --query 'DBInstances[*].[Endpoint.Address,Endpoint.Port]'
```

如需詳細資訊，請參閱[了解 Amazon DocumentDB 端點](endpoints.md)。

## 影響連線數量的驅動程式組態
<a name="troubleshooting.driver.config"></a>

使用用戶端驅動程式連線至 Amazon DocumentDB 叢集時，請務必考慮`maxPoolSize`組態參數。此`maxPoolSize`設定決定用戶端驅動程式在其連線集區中將維持的最大連線數。