接続問題のトラブルシューティング
項目一覧
このページでは、一般的な接続の問題とその解決策について説明しています。
Atlas クラスターへの接続の詳細については、「Atlas スタートガイド」チュートリアルを参照してください。
注意
サポートを必要とするエンタープライズ カスタマーの場合は、チケットを提出してください。コミュニティ サポートについては MongoDB Community リソースにアクセスしてください。
注意
サーバーレスインスタンスは、現時点では特定のドライバーまたはドライバー バージョンを介した接続をサポートしていません。詳細については、「サーバーレスインスタンスの制限」を参照してください。
クラスター [Connect] ボタンが無効
クラスターがプロビジョニング状態の場合、クラスターの [Connect] ボタンが無効になっていることがあります。クラスターは最初に配置するときにプロビジョニングする必要があります。クラスターは、スケールアップまたはスケールダウンするときにもプロビジョニングする必要があります。プロビジョニング プロセスには最大 10 分かかる可能性があり、このプロセスの完了後に [Connect] ボタンが有効になります。
IP アクセス リストに掲載されていない IP アドレスの接続
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 UI への接続
Atlas は CDN を使用してコンテンツを迅速に提供します。組織でファイアウォールを使用している場合は、Atlas UI へのアクセスに関する問題を防ぐために、Atlas CDN ホスト(https://assets.mongodb-cdn.com/
)をファイアウォールの許可リストに追加します。
クラスターへの接続
Atlas クラスターはポート 27017
で動作します。クラスターに接続するには、このポートにアクセスできる必要があります。さらに、次の適切なポートがオープンであることを確認してください。
シャーディングされたクラスターの場合は、ポート 27016 へのアクセスを許可します。
BI Connector の場合、ポート 27015 へのアクセスを許可します。
サードパーティの Outgoing port tester を使用して、ポートへのアクセス能力をチェックできます。
例
ポート 27017 への接続を確認するには、http://portquiz.net:27017にアクセスしてください。
これらのポートにアクセスできない場合は、システムのファイアウォール設定を確認し、これらのポートへのアクセスがブロックされていないことを確認してください。
クラスターの可用性
mongodb+srv://
接続文字列を使用中に、ドライバーまたは shell が Atlas クラスターの DNS ホストを検出できない場合は、クラスターが一時停止状態にあるか削除されている可能性があります。クラスターが存在することを確認し、一時停止中である場合は、必要に応じてクラスターを再開できます。
注意
Atlas は 60 日間接続がない場合、アイドル状態にある M0
クラスターを自動的に一時停止します。
MongoDB Compass のトラブルシューティング
MongoDB Compass を使用してクラスターに接続し、問題が発生した場合は、以下を参照してください。
このセクションの「SRV 接続文字列を使用した接続の拒否」。
MongoDB Compass ドキュメントの「Compass 接続エラー」。
自己管理型 X.509 証明書または Atlas が管理する自動生成型 X.509証明書を使用して MongoDB データベースに認証する場合は、MongoDB Compass に接続するときに、次の操作を行う必要があります。
MongoDB Compass で、Fill in connection fields individually を選択します。
Authentication のドロップダウンで、[
X.509
] を選択します。More Options を選択します。
SSL のドロップダウンで、[Server and Client Validation] を選択します。
ダウンロードされた Atlas が管理する証明書、または自己管理する証明書(いずれか使用している方)への同じパスを、次の各フィールドに追加します。Certificate Authority、Client Certificate、Client Private Key。
詳細については、MongoDB Compass ドキュメントの「MongoDB への接続」を参照してください。
接続文字列の問題
接続文字列の形式が不適切
Atlas への接続に使用する接続文字列の形式は、次のようないくつかの要因によって決まります。
お使いの
mongosh
バージョン。詳細については、「mongosh
経由で接続」を参照してください。ドライバーのバージョン。詳細については、「ドライバー経由での接続」を参照してください。
本番環境に移行する前に、テスト環境で接続文字列を検証してください。
接続文字列パスワード内の特殊文字
パスワードに特殊文字が含まれていて、接続文字列 URI でパスワードを使用する場合は、特殊文字をエンコードしてください。
パーセント エンコーディング を必要とする特殊文字を使用してパスワードの更新を試みると、次のエラー メッセージが表示されます。
This password contains special characters which will be URL-encoded.
注意
次の文字および空白文字は、ユーザー名またはパスワードに含まれている場合、パーセント エンコーディング を使用して変換する必要があります。
: / ? # [ ] @ ! $ & ' ( ) * , ; = %
たとえば、プレーンテキスト形式のパスワード p@ssw0rd'9'!
は、次のようにエンコードする必要があります。
p%40ssw0rd%279%27%21
➤ [言語の選択] ドロップダウン メニューを使用して、このセクションで例示されるエンコーディングの言語を設定します。
1 package main 2 3 import ( 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 13 func 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 }
1 import com.mongodb.client.MongoClient; 2 import com.mongodb.client.MongoClients; 3 import com.mongodb.client.MongoCollection; 4 import com.mongodb.client.MongoDatabase; 5 6 import org.bson.Document; 7 import java.net.URLEncoder; 8 9 public 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 }
1 const { MongoClient } = require("mongodb"); 2 3 const username = encodeURIComponent("<username>"); 4 const password = encodeURIComponent("<password>"); 5 const cluster = "<clusterName>"; 6 const authSource = "<authSource>"; 7 const authMechanism = "<authMechanism>"; 8 9 let uri = 10 `mongodb+srv://${username}:${password}@${cluster}/?authSource=${authSource}&authMechanism=${authMechanism}`; 11 12 const client = new MongoClient(uri); 13 14 async 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 } 28 run().catch(console.dir);
1 import pymongo 2 from urllib.parse import quote_plus 3 4 username = quote_plus('<username>') 5 password = quote_plus('<password>') 6 cluster = '<clusterName>' 7 authSource = '<authSource>' 8 authMechanism = '<authMechanism>' 9 10 uri = 'mongodb+srv://' + username + ':' + password + '@' + cluster + '/?authSource=' + authSource + '&authMechanism=' + authMechanism 11 12 client = pymongo.MongoClient(uri) 13 14 result = client["<dbName"]["<collName>"].find() 15 16 # print results 17 for i in result: 18 print(i)
重要
接続文字列 URI の外部でパスワードを使用する場合(mongosh
にパスワードを貼り付けるなど)は、パスワード内の特殊文字をエンコードしないでください。
接続文字列と互換性のないドライバーのバージョン
このエラー メッセージが表示される場合は、ドライバーが古くなっている可能性があります。ドライバーの更新手順については、特定のドライバーのドキュメントを参照してください。
インターネット サービス プロバイダーの DNS が接続文字列をブロック
DNS シードリスト接続文字列形式を使用して Atlas に接続すると、次のエラーが表示される場合があります。
DNSHostNotFound: Failed to look up service "<MongoDB service name>"
このエラーは、ISP が提供するデフォルトの DNS サーバーを使用している場合に発生することがあります。その DNS サーバーが DNS シードリストの接続文字列形式で使用される SRV lookup をサポートしていない可能性があります。
この問題を解決するには、 DNS 構成を変更してパブリック DNS サーバーを使用することをお試しください。
例
ネットワーク設定を構成して、Google Public DNS を ISP の DNS サーバーの代わりに使用することができます。
パブリック DNS サーバーを使用するようにネットワーク設定を更新したら、クラスターに接続します。
Ubuntu 18.04 で DB ツールを使用する場合の接続文字列エラー
Ubuntu 18.04 を実行中に DNS シードリスト接続文字列形式(mongodb+srv://
)を使用して MongoDB データベースツール のいずれか(mongodump
、mongorestore
など)から Atlas に接続すると、次のエラーが表示される場合があります。
lookup nta8e.mongodb.net on 123.45.67.8:27017: cannot unmarshal DNS message
その場合は、次のいずれかの接続オプションを代わりに使用します。
--uri
オプションを 非 SRV 接続文字列 (mongodb://
)と併用する。接続ホストを指定するために
--host
オプションを使用する。
SRV 接続文字列を使用した場合の接続拒否
ドライバーまたは Compass で DNS シードリスト接続文字列形式(mongodb+srv://
)を使用する場合、次のエラーが表示されることがあります。
Error: querySrv ECONNREFUSED _mongodb._tcp.<SRV Record>
トラブルシューティングを開始するには、クラスターのシードリスト接続文字列から DNS SRV 名とノードの個々のホスト名およびポート番号の両方が必要です。
DNS SRV名を見つけるには、次の手順に従ってください。
「アプリケーションの接続」の 手順 1 -6 に従ってください。
ステップ 7 で、選択したドライバーの最新バージョンを選択します。
DNS SRV 名は、パスワードの後の
@
記号から始まり、.mongodb.net
で終わります(例:cluster0.dfget.mongodb.net
)。
ノードのホスト名とポート番号を見つけるには、次の手順を実行してください。
「アプリケーションの接続」の 手順 1 -6 に従ってください。
ステップ 7 で、選択したドライバーの最新バージョンを選択します。
ステップ 7 で、Non-Stable API の下で最も古いドライバー バージョンを選択します
各ホスト名は、パスワードの後の
@
記号の後に始まり、.mongodb.net
で終わるカンマ区切りリストに含まれています。
各ホスト名の後のポート番号を記録してください。
クラスターの接続文字列は、そのトポロジーと接続方法に応じて、さまざまなホスト名とポートを含む場合があります。
プライベートエンドポイントの動作の詳細については、「プライベートエンドポイントの構成」を参照してください。
基本的なネットワーク接続をテストする:
問題が発生しているアプリケーション サーバーのターミナルまたはコマンドプロンプトで、次のコマンドを実行します。
- 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>"