Docs Menu
Docs Home
/
MongoDB Atlas
/

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

項目一覧

  • クラスター [Connect] ボタンが無効
  • IP アクセス リストに掲載されていない IP アドレスの接続
  • クラスター認証の失敗
  • クラスターへの過剰なオープン接続
  • 接続数の急増時におけるシャーディングされたクラスターのパフォーマンス低下
  • ファイアウォールの背後からの接続試行
  • クラスターの可用性
  • MongoDB Compass のトラブルシューティング
  • 接続文字列の問題

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

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

注意

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

注意

サーバーレスインスタンスは、現時点では特定のドライバーまたはドライバー バージョンを介した接続をサポートしていません。詳細については、「サーバーレスインスタンスの制限」を参照してください。

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

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 は 60 日間接続がない場合、アイドル状態にある 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 サーバーを使用するようにネットワーク設定を更新したら、クラスターに接続します。

Ubuntu 18.04 を実行中に DNS シードリスト接続文字列形式(mongodb+srv://)を使用して MongoDB データベースツール のいずれか(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>

トラブルシューティングを開始するには、クラスターのシードリスト接続文字列から DNS SRV 名とノードの個々のホスト名およびポート番号の両方が必要です。

  1. アプリケーションの接続」の 手順 1 -6 に従ってください。

  2. ステップ 7 で、選択したドライバーの最新バージョンを選択します。

  3. DNS SRV 名は、パスワードの後の @ 記号から始まり、.mongodb.net で終わります(例: cluster0.dfget.mongodb.net )。

  1. アプリケーションの接続」の 手順 1 -6 に従ってください。

  2. ステップ 7 で、選択したドライバーの最新バージョンを選択します。

  3. ステップ 7 で、Non-Stable API の下で最も古いドライバー バージョンを選択します

    • 各ホスト名は、パスワードの後の @ 記号の後に始まり、.mongodb.net で終わるカンマ区切りリストに含まれています。

  4. 各ホスト名の後のポート番号を記録してください。

    • クラスターの接続文字列は、そのトポロジーと接続方法に応じて、さまざまなホスト名とポートを含む場合があります。

    • プライベートエンドポイントの動作の詳細については、「プライベートエンドポイントの構成」を参照してください。

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

  • 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.
  • 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
  • Ping テスト:

    注意

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

    クラスター内の各ホスト名に対して、このコマンドを実行します。

    Linux/Mac OS:

    ping -c 10 <Node Hostname>

    Windows:

    ping /n 10 <Node Hostname>
  • エンドツーエンドのネットワーク接続テスト:

    Linux/Mac/OS:

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

    Windows:

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

戻る

Google Cloud