Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/

接続問題のトラブルシューティング

このページでは、一般的な接続の問題とその解決策について説明しています。

Atlas クラスターへの接続の詳細については、Atlas を使い始める チュートリアルを参照してください。

注意

サポートを必要とするエンタープライズ カスタマーの場合は、チケットを提出してください。コミュニティ サポートについては MongoDB Community リソースにアクセスしてください。

インテリジェント支援を使用すると、接続エラーのデバッグを支援できます。

クラスターがプロビジョニング状態の場合、クラスターの [Connect] ボタンが無効になっていることがあります。クラスターは最初に配置するときにプロビジョニングする必要があります。クラスターは、スケールアップまたはスケールダウンするときにもプロビジョニングする必要があります。

Atlas がクラスターをプロビジョニングすると、Connect ボタンが有効になります。

無料クラスターの場合、プロビジョニングにかかる時間は 15 秒未満です。

Flex クラスターと専有クラスターの場合、プロビジョニングには最大 10 分かかる場合があります。

Atlas クラスターに接続する前に、ホストの IP アドレスがクラスターのプロジェクトの IP アクセス リストに追加されていることを確認してください。Atlas は、IP アクセス リスト内の IP アドレスと CIDR アドレス範囲からのクライアント接続のみを許可します。

MongoDB Atlas に接続するには、MongoDB データベースでユーザー認証する必要があります。クラスターにデータベースユーザーを作成するには、「データベースユーザーの設定」を参照してください。

作成済みのユーザーの認証で問題が生じた場合は、以下の手順をお試しください。

  • データベースユーザーの正しいユーザー名とパスワードを使用していること、および正しいクラスターに接続していることを確認してください。

  • 接続文字列で指定している authSource データベースが正しいことを確認してください。

  • パスワードに特殊文字が含まれている場合は、「接続文字列パスワードの特殊文字」を参照してください。

Atlas はクラスターへの同時着信接続数に制限を設定しています。クラスターでの制限はクラスター階層に基づいています。制限に達している状態で接続を試みると、MongoDB は「connection refused because too many open connections」というエラーを表示します。

クラスター階層とその最大同時接続数の詳細な比較については、「接続制限とクラスター階層」を参照してください。

  • 現在使用していないクラスターへのオープン接続を閉じてください。

  • クラスターをより高い階層にスケーリングすると、より多くの同時接続がサポートされます。

  • アプリケーションを再起動します。

  • 今後このような問題が生じないように、maxPoolSize 接続文字列オプションを使用して接続プール内の接続数を制限することを検討してください。

この問題を解決する方法については、「接続の問題の修正」を参照してください。

Atlas は、プライベートエンドポイント サービスのロード バランサーを使用して、シャーディングされたクラスター用に最適化された SRV 接続文字列を生成できます。最適化された接続文字列を使用する場合、Atlas はアプリケーションとシャーディングされたクラスター間の接続数を mongos ごとに制限します。mongos ごとの接続数を制限すると、接続数が急増したときのパフォーマンスが向上します。

プライベートエンドポイントの背後にあるシャーディングされたクラスターに最適化された接続文字列の詳細については、プライベートエンドポイントを使用してシャーディングされたクラスターの接続パフォーマンスを最適化するにはどうすればよいですか。

Atlas は CDN を使用してコンテンツを迅速に提供します。組織でファイアウォールを使用している場合は、Atlas UI へのアクセスに関する問題を防ぐために、Atlas CDN ホスト(https://assets.mongodb-cdn.com/)をファイアウォールの許可リストに追加します。

Atlas クラスターはポート 27017 で動作します。クラスターに接続するには、このポートにアクセスできる必要があります。さらに、次の適切なポートがオープンであることを確認してください。

  • シャーディングされたクラスターの場合は、ポート 27016 へのアクセスを許可します。

  • BI Connector の場合、ポート 27015 へのアクセスを許可します。

サードパーティの Outgoing port tester を使用して、ポートへのアクセス能力をチェックできます。

これらのポートにアクセスできない場合は、システムのファイアウォール設定を確認し、これらのポートへのアクセスがブロックされていないことを確認してください。

mongodb+srv://接続文字列を使用中に、ドライバーまたは shell が Atlas クラスターの DNS ホストを検出できない場合は、クラスターが一時停止状態にあるか削除されている可能性があります。クラスターが存在することを確認し、一時停止中である場合は、必要に応じてクラスターを再開できます。

注意

Atlas は、30 日間接続がない場合、アイドル状態の 無料クラスター(以前は M0 と呼ばれる)を自動的に一時停止します。

MongoDB Compass を使用してクラスターに接続し、問題が発生した場合は、以下を参照してください。

自己管理型 X.509 証明書または Atlas が管理する自動生成型 X.509証明書を使用して MongoDB データベースに認証する場合は、MongoDB Compass に接続するときに、次の操作を行う必要があります。

  1. MongoDB Compass で、Fill in connection fields individually を選択します。

  2. Authentication のドロップダウンで、[X.509] を選択します。

  3. More Options を選択します。

  4. SSL のドロップダウンで、[Server and Client Validation] を選択します。

  5. ダウンロードされた Atlas が管理する証明書、または自己管理する証明書(いずれか使用している方)への同じパスを、次の各フィールドに追加します。Certificate AuthorityClient CertificateClient Private Key

詳細については、MongoDB Compass ドキュメントの「MongoDB への接続」を参照してください。

Atlas への接続に使用する接続文字列の形式は、次のようないくつかの要因によって決まります。

本番環境に移行する前に、テスト環境で接続文字列を検証してください。

パスワードに特殊文字が含まれていて、接続文字列 URI でパスワードを使用する場合は、特殊文字をエンコードしてください。

パーセント エンコーディング を必要とする特殊文字を使用してパスワードの更新を試みると、次のエラー メッセージが表示されます。

This password contains special characters which will be URL-encoded.

注意

次の文字および空白文字は、ユーザー名またはパスワードに含まれている場合、パーセント エンコーディング を使用して変換する必要があります。

: / ? # [ ] @ ! $ & ' ( ) * , ; = %

たとえば、プレーンテキスト形式のパスワード p@ssw0rd'9'! は、次のようにエンコードする必要があります。

p%40ssw0rd%279%27%21

➤ [言語の選択] ドロップダウン メニューを使用して、このセクションで例示されるエンコーディングの言語を設定します。


1package main
2
3import (
4 "context"
5 "fmt"
6 "net/url"
7
8 "go.mongodb.org/mongo-driver/bson"
9 "go.mongodb.org/mongo-driver/mongo"
10 "go.mongodb.org/mongo-driver/mongo/options"
11)
12
13func main() {
14 username := "<username>"
15 password := "<password>"
16 cluster := "<clusterName>"
17 authSource := "<authSource>"
18 authMechanism := "<authMechanism>"
19
20 uri := "mongodb+srv://" + url.QueryEscape(username) + ":" +
21 url.QueryEscape(password) + "@" + cluster +
22 "/?authSource=" + authSource +
23 "&authMechanism=" + authMechanism
24
25 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
26 if err != nil {
27 panic(err)
28 }
29 defer client.Disconnect(context.TODO())
30
31 collection := client.Database("<dbName>").Collection("<collName>")
32
33 cursor, err := collection.Find(context.TODO(), bson.D{})
34 if err != nil {
35 panic(err)
36 }
37
38 var results []bson.D
39 if err = cursor.All(context.TODO(), &results); err != nil {
40 panic(err)
41 }
42 for _, result := range results {
43 fmt.Println(result)
44 }
45}
1import com.mongodb.client.MongoClient;
2import com.mongodb.client.MongoClients;
3import com.mongodb.client.MongoCollection;
4import com.mongodb.client.MongoDatabase;
5
6import org.bson.Document;
7import java.net.URLEncoder;
8
9public class Encoding {
10
11 public static void main(String [] args){
12
13 try{
14 String username = URLEncoder.encode("<username>", "UTF-8");
15 String password = URLEncoder.encode("<password>", "UTF-8");
16 String cluster = "<clusterName>";
17 String authSource = "<authSource>";
18 String authMechanism = "<authMechanism>";
19
20 String uri = "mongodb+srv://" + username + ":" + password + "@" + cluster +
21 "/?authSource=" + authSource + "&authMechanism=" + authMechanism;
22
23 MongoClient mongoClient = MongoClients.create(uri);
24
25 MongoDatabase database = mongoClient.getDatabase("<dbName>");
26 MongoCollection<Document> collection = database.getCollection("<collName>");
27
28 collection.find().forEach(doc -> System.out.println(doc.toJson()));
29
30 } catch(Exception e){
31 System.err.println(e.getCause());
32
33 }
34 }
35}
1const { MongoClient } = require("mongodb");
2
3const username = encodeURIComponent("<username>");
4const password = encodeURIComponent("<password>");
5const cluster = "<clusterName>";
6const authSource = "<authSource>";
7const authMechanism = "<authMechanism>";
8
9let uri =
10 `mongodb+srv://${username}:${password}@${cluster}/?authSource=${authSource}&authMechanism=${authMechanism}`;
11
12const client = new MongoClient(uri);
13
14async function run() {
15 try {
16 await client.connect();
17
18 const database = client.db("<dbName>");
19 const ratings = database.collection("<collName>");
20
21 const cursor = ratings.find();
22
23 await cursor.forEach(doc => console.dir(doc));
24 } finally {
25 await client.close();
26 }
27}
28run().catch(console.dir);
1import pymongo
2from urllib.parse import quote_plus
3
4username = quote_plus('<username>')
5password = quote_plus('<password>')
6cluster = '<clusterName>'
7authSource = '<authSource>'
8authMechanism = '<authMechanism>'
9
10uri = 'mongodb+srv://' + username + ':' + password + '@' + cluster + '/?authSource=' + authSource + '&authMechanism=' + authMechanism
11
12client = pymongo.MongoClient(uri)
13
14result = client["<dbName"]["<collName>"].find()
15
16# print results
17for i in result:
18 print(i)

重要

接続文字列 URI の外部でパスワードを使用する場合(mongosh にパスワードを貼り付けるなど)は、パスワード内の特殊文字をエンコードしないでください。

このエラー メッセージが表示される場合は、ドライバーが古くなっている可能性があります。ドライバーの更新手順については、特定のドライバーのドキュメントを参照してください。

DNS シードリスト接続文字列形式を使用して Atlas に接続すると、次のエラーが表示される場合があります。

DNSHostNotFound: Failed to look up service "<MongoDB service name>"

このエラーは、ISP が提供するデフォルトの DNS サーバーを使用している場合に発生することがあります。その DNS サーバーが DNS シードリストの接続文字列形式で使用される SRV lookup をサポートしていない可能性があります。

この問題を解決するには、DNS 構成を変更してパブリック DNSサーバーを使用してみてください。

ネットワーク設定を構成して、Google Public DNSISPDNS サーバーの代わりに使用することができます。

パブリック DNS サーバーを使用するようにネットワーク設定を更新したら、クラスターに接続します。

DNSシードリスト接続文字列形式(mongodb+srv://)を使用してMongoDB Database Toolsのいずれか(mongodumpmongorestore など)から Atlas に接続すると、次のエラーが表示される場合があります。

lookup nta8e.mongodb.net on 123.45.67.8:27017: cannot unmarshal DNS message

その場合は、次のいずれかの接続オプションを代わりに使用します。

  • --uri オプションを 非 SRV 接続文字列 (mongodb://)と併用する。

  • 接続するホストを指定するには、--host オプションを使用します。

ドライバーまたは Compass で DNS シードリスト接続文字列形式(mongodb+srv://)を使用する場合、次のエラーが表示されることがあります。

Error: querySrv ECONNREFUSED _mongodb._tcp.<SRV Record>

このエラーをトラブルシューティングするには、次の手順を実行します。

1
  1. アプリケーションの接続 の手順 1-6 に従います。

  2. ドライバーとバージョンを選択します。

  3. Use this connection string in your application の下では、SRV ホスト名が mongodb+srv://接続文字列に表示されます。これは、.mongodb.net で終わるホスト名の部分です。

    たとえば、cluster0.dfget.mongodb.net

2

同じ接続モーダルで:

  1. Use this connection string in your application の下で、SRV Connection String トグルをオフにします。

  2. 標準接続文字列(mongodb://)が表示され、各ノードのホスト名とポート番号が一覧表示されます。

    クラスターの接続文字列には、トポロジーと接続方法に応じて、さまざまなホスト名とポートが含まれる場合があります。プライベートエンドポイントの詳細については、プライベートエンドポイントの構成を参照してください。

3

問題が発生しているアプリケーション サーバーのターミナルまたはコマンドプロンプトで、次のコマンドを実行します。

  1. DNS SRV 解決テスト

    Linuxまたは macOS の場合は、次のコマンドを実行します。

    dig SRV _mongodb._tcp.<DNS SRV name>

    Windowsの場合は、次のコマンドを実行します。

    nslookup -debug -q=SRV _mongodb._tcp.<DNS SRV name>

    応答の ANSWER SECTION に、クラスター内の各ノードに対して 1 つの結果が表示されるはずです。以下がその例です。

    ;; ANSWER SECTION:
    _mongodb._tcp.gcluster0.dfget.mongodb.net. 60 IN SRV 0 0 27017 cluster0-shard-00-00.dfget.mongodb.net.
    _mongodb._tcp.gcluster0.dfget.mongodb.net. 60 IN SRV 0 0 27017 cluster0-shard-00-01.dfget.mongodb.net.
    _mongodb._tcp.gcluster0.dfget.mongodb.net. 60 IN SRV 0 0 27017 cluster0-shard-00-02.dfget.mongodb.net.
  2. DNSノードのホスト名解決テスト

    クラスター内の各ホスト名に対して次の操作を行います。

    Linuxまたは macOS の場合は、次のコマンドを実行します。

    dig <Node Hostname>

    Windowsの場合は、次のコマンドを実行します。

    nslookup -debug -q=A <Node Hostname>

    応答の ANSWER SECTION に、DNS ホスト名が解決された IP アドレスが表示されるはずです。 以下がその例です。

    ;; ANSWER SECTION: cluster0-shard-00-00.ag9in.mongodb.net. 60 IN A 10.10.10.10
  3. ping テスト

    注意

    ICMP リクエストは、プライベートエンドポイント接続を通じてクラウドプロバイダーによってブロックされる可能性があります。

    クラスター内の各ホスト名に対して次の操作を行います。

    Linuxまたは macOS の場合は、次のコマンドを実行します。

    ping -c 10 <Node Hostname>

    Windowsの場合は、次のコマンドを実行します。

    ping /n 10 <Node Hostname>

    出力を確認して、パケットロスとラウンドトリップ時間(RTT)を確認します。パケットロスやレイテンシが高い場合は、サーバーとクラスター ノード間のネットワークに問題が発生している可能性があります。

  4. end-to-End ネットワーク接続テスト

    Linuxまたは macOS の場合は、次のコマンドを実行します。

    nc -zv <Node Hostname> <Node Port Number>

    Windowsの場合は、次のコマンドを実行します。

    Test-NetConnection -Port <Node Port Number> -InformationLevel "Detailed" -ComputerName "<Node Hostname>"
4

前の手順のテストを実行中後、失敗したテストに基づいて接続エラーを解決するには、次のガイダンスを使用します。

  • DNS SRV 解決テストに失敗します: DNS リゾルバが SRVレコード検索をサポートしていないか、アウトバウンド DNS トラフィックがブロックされます。次のいずれかを試してください。

  • DNSノードのホスト名解決テストに失敗しました: DNS リゾルバは、個々のノードのホスト名を解決できません。プライベートエンドポイントを使用する場合は、プライベートエンドポイントの DNS 構成が正しいことを確認してください。

  • ping テストに失敗します: ICMP トラフィックは、ファイアウォールまたはクラウドプロバイダーによってブロックされる可能性があります。これは必ずしも TCP 接続の問題を示すものではありません。エンドツーエンド ネットワーク接続テストに進み、ポート 27017 で TCP 接続を確認します。

  • エンドツーエンドのネットワーク接続テストは失敗します:ファイアウォールまたはネットワーク ポリシーによって、ノードホスト名のポート 27017 へのアクセスがブロックされています。次の点を確認します。

    • アプリケーションサーバーのIPアドレスをクラスターのIP アクセス リストに追加します。

    • ファイアウォールを介して、ポート 27017 でのアウトバウンド TCP 接続を許可します。

  • すべてのテストは合格しますが、エラーは残ります: 問題はドライバーのバージョンにある可能性があります。古いバージョンのドライバーは SRV 接続文字列形式 を正しくサポートしていない可能性があります。ドライバーを最新バージョンに更新してください。標準(非 SRV)接続文字列形式mongodb://)に切り替えるには、Connect モーダルの Use this connection string in your application の下の SRV Connection String トグルをオフにすることもできます。

戻る

Google Cloud Platform Functions