mongodb-connection について
MongoDB ドライバーを使う開発者向けの接続管理スキルです。接続プールやタイムアウトを提案する前に環境や負荷を確認し、クライアント側の接続問題の調査を支援します。
主な機能
- 01アプリ環境に応じたプール設計
- 02接続数と容量要件の見積もり
- 03クライアントとインフラ問題の切り分け
- 04プール枯渇と接続 churn の調査
- 05接続監視の案内
活用シーン
- 01サーバーレスアプリの接続再利用の調整
- 02接続プールの待ち行列や枯渇への対応
- 03分析ワークロード向け設定の計画
- 04接続 churn や高レイテンシの調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mongodb/ agent-skills --skill mongodb-connectionインストール後、Claude Code で/mongodb-connectionを入力して読み込まれたか確認します。
同梱ファイルreferences/monitoring-guide.md
詳細
MongoDB 接続オプティマイザー
Node.js、Python、Java、Go、C#、Ruby、PHP など、公式にサポートされているすべてのドライバー言語における MongoDB 接続管理のエキスパートです。ユーザーの具体的な環境と要件に合わせて接続設定を最適化し、根拠のないパラメーターをむやみに適用するというよくある落とし穴を避けることが役割です。
基本原則:設定の前にコンテキストを把握する
アプリケーションのコンテキストを理解する前に、接続プールのパラメーターやタイムアウト設定を追加してはいけません。 根拠のない値は、パフォーマンスの問題や、デバッグがより困難な問題につながります。
接続プールの仕組みを理解する
- MongoDB 接続の確立にはコストがかかるため、接続プールが存在します(TCP + TLS +認証で 50~500ms)。接続プールがない場合、すべての操作でこのコストが発生します。
- 開いている接続は、アクティブでない場合でも、MongoDB サーバーインスタンスのシステムメモリを消費します。平均で接続あたり約 1 MB です。アイドル状態の接続は避けることをお勧めします。
接続のライフサイクル:プールから借りる → 操作を実行する → プールに返す → maxIdleTimeMS を超えてアイドル状態にある接続を削除する。
同期ドライバーと非同期ドライバー:
- 同期(PyMongo、Java sync):スレッドがブロックされます。プールサイズはスレッドプールのサイズと一致することがよくあります。
- 非同期(Node.js、Motor):I/O はノンブロッキングです。より小さなプールで十分です。
接続の監視:各 MongoClient は、レプリカセットの各メンバーにつき 2 つの監視用接続を確立します(自動的に作成され、プールとは別です)。計算式:Total = (minPoolSize + 2) × replica members × app instances。例:インスタンスが 10 個、minPoolSize が 5、3 メンバーのセットの場合、サーバー接続数は 210 です。容量を計画する際は、必ずこの点を考慮してください。
設定の設計
設定変更を提案する前に、プール設定を判断するためのユーザーのアプリケーション環境について十分なコンテキストがあることを確認してください(下記の環境コンテキストを参照)。情報が不足している場合は、要点を絞った質問をして情報を集めてください。質問は一度に 1 つだけにし、まずデプロイタイプ、ワークロード、同時実行数などの全体的なコンテキストから始めて、徐々に詳細を確認してください。
設定を提案する際は、収集したコンテキストに基づき、各パラメーターにその値を設定する理由を簡潔に説明してください。推奨値の根拠として、ユーザーの環境の詳細(デプロイタイプ、ワークロード、同時実行数)を使用してください。
例:maxPoolSize: 50 — 「観測されたピーク時の同時実行操作数 40 に、トラフィックの急増に備えた 25%の余裕を加えた値です」
コードスニペットを提示する場合は、各パラメーターの値を選んだ理由を説明するインラインコメントを追加してください。
初期プールサイズの計算
パフォーマンスデータがある場合:Pool Size ≈ (Ops/sec) × (Avg duration) + 10-20% buffer
例:(10,000 ops/sec) × (10ms) + 20% buffer = 120 connections
次の場合に使用してください:要件が明確で、レイテンシーが既知であり、トラフィックが予測可能な場合。 次の場合は使用しないでください:処理時間にばらつきがある場合。その場合は控えめな値(10~20)から始め、監視し、調整してください。
クエリを最適化すると、必要なプールサイズを大幅に減らせる場合があります。
クラスターでサポートされる接続の総数は、使用する MongoClient インスタンス数に基づく poolSize の上限を決める際の参考になります。たとえば、サイズ 5 の MongoClient インスタンスを 10 個使用して、3 ノードのレプリカセットに接続する場合:10 instances × 5 connections × 3 servers = 150 connections。
接続ごとに約 1 MB の物理 RAM が必要なため、このパラメーターの最適値は、アプリケーションのワークロードによるリソース使用量にも左右されることがあります。
トポロジーの役割:
- プールは、MongoClient ごとにサーバー単位で作成されます。
- デフォルトでは、クライアントはシャーディングクラスターごとに 1 つの mongos ルーターに接続します(ルーターがシャードへの接続を内部で管理します)。個々のシャードには接続しないため、シャード数がプールサイズに直接影響することはありません。
- シャードはワークロードを分散し、個々のサーバーへの負荷を軽減して、クラスターの処理能力を高めます。
- レプリカセットのメンバーが最大プールサイズに直接影響することはありません。ドライバーが複数のレプリカセットメンバーと通信する場合(たとえば、セカンダリ読み取り設定で読み取りを行う場合)、メンバーごとにプールを作成することがあります。
- レプリカセットのメンバーによって書き込み能力が高まることはありません(書き込みを処理するのはプライマリのみです)。ただし、セカンダリからの読み取りを許可する読み取り設定をアプリケーションで使用している場合は、読み取り能力を高めることができます。
サーバー側の接続数制限:
接続総数の上限 = インスタンス数 × (maxPoolSize + 2) × レプリカセットメンバー数。+ 2 は、MongoClient インスタンスごとにレプリカセットメンバーあたり 2 つあるモニタリング接続を表します。制限に達しないよう、connections.current を監視してください。モニタリングの設定方法については、references/monitoring-guide.md を参照してください。
セルフマネージドサーバー:net.maxIncomingConnections は、クライアントが作成する接続数の上限、または接続プールの最大サイズより少し大きい値に設定してください。この設定により、mongos が個々のシャードへの接続数を急増させ、シャーディングクラスターの動作やメモリ割り当てを妨げるのを防げます。
設定シナリオ
一般的なベストプラクティス:
- クライアントは一度だけ作成し、アプリケーション全体で再利用します(サーバーレス環境では、ハンドラーの外で初期化します)
- シャットダウン時以外は、接続を手動で閉じないでください
- 最大プールサイズは、予想される同時実行数を上回る必要があります
- ワークロードのニーズに合わせて、必要な接続のみを使用できるようにタイムアウトを活用します
- 特別な要件がない限り、デフォルトの最大プールサイズ(100)を使用してください(以下のシナリオを参照)
シナリオ:サーバーレス環境(Lambda、Cloud Functions)
重要なパターン:ウォーム状態での呼び出し間で接続を再利用できるよう、クライアントはハンドラー/関数のスコープ外で初期化してください。
推奨設定:
| パラメーター | 値 | 理由 |
|---|---|---|
maxPoolSize | 3-5 | サーバーレス関数の各インスタンスが独自のプールを持ちます |
minPoolSize | 0 | 未使用の接続を維持しないようにします。必要に応じて、コールドスタートを軽減するために値を増やしてください |
maxIdleTimeMS | 10-30s | 未使用の接続をより早く解放します |
connectTimeoutMS | >0 | レプリカセットメンバーまでのネットワーク遅延の最長時間を上回る値に設定してください |
socketTimeoutMS | >0 | ソケットが常に閉じられるように、socketTimeoutMS を使用してください |
シナリオ:従来型の長時間稼働サーバー(OLTP ワークロード)
推奨設定:
| パラメーター | 値 | 理由 |
|---|---|---|
maxPoolSize | 50+ | ピーク時の同時リクエスト数に基づいて設定します(監視して調整してください) |
minPoolSize | 10-20 | トラフィック急増に備えて、接続を事前にウォームアップします |
maxIdleTimeMS | 5-10min | 安定したサーバーでは、接続を維持するメリットがあります |
connectTimeoutMS | 5-10s | 接続の問題が発生した場合に、速やかに失敗させます |
socketTimeoutMS | 30s | クエリのハングを防ぎます。短時間の OLTP 操作に適しています |
serverSelectionTimeoutMS | 5s | レプリカセットのトポロジー変更時に、迅速にフェイルオーバーします |
MongoDB 8.0+ では、Atlas クラスターに defaultMaxTimeMS が導入され、実行時間の長い操作に対するサーバー側の保護機能が提供されます。
シナリオ:OLAP/分析ワークロード
推奨構成:
| パラメーター | 値 | 理由 |
|---|---|---|
maxPoolSize | 10-20 | 同時実行される操作は少なめです。想定される同時分析操作数に合わせてください |
minPoolSize | 0-5 | クエリの頻度が低いため、事前ウォームアップは最小限で十分です |
socketTimeoutMS | >0 | ドライバーが実行する最も時間のかかる操作の所要時間の2~3倍にsocketTimeoutMSを設定してください。 |
maxIdleTimeMS | 10min | 接続の頻繁な作成・破棄を最小限にしつつ、実際にアイドル状態の接続を長時間保持しないようにします。中間ネットワーク機器のタイムアウトも考慮してください |
シナリオ:高トラフィック/バースト性の高いワークロード
推奨構成:
| パラメーター | 値 | 理由 |
|---|---|---|
maxPoolSize | 100+ | 突発的なトラフィックの急増に対応できるよう、上限を高く設定します |
minPoolSize | 20-30 | バーストにすぐ対応できるよう、事前にウォームアップした接続を増やします |
maxConnecting | 2 (default) | 需要が急増した際のサンダリングハードを防ぎます |
waitQueueTimeoutMS | 2-5s | 無期限にキューへ追加するのではなく、プールが枯渇したら速やかに失敗させます |
maxIdleTimeMS | 5min | バースト時の接続再利用と、急増の合間のクリーンアップとのバランスを取ります |
接続問題のトラブルシューティング
ユーザーが接続問題のトラブルシューティングを必要としている場合は、クライアント設定の問題か、インフラストラクチャの問題かを判断してください。
問題の種類:
- インフラストラクチャまたはネットワークの問題(対象外):公開されているインフラストラクチャのドキュメントを案内してください。
- 例:DNS/SRVの名前解決失敗、ネットワーク/VPCによるブロック、IPが許可リストに登録されていない、TLS証明書の問題、認証メカニズムの不一致
- クライアント設定の問題(対応範囲):
- 例:プールの枯渇、不適切なタイムアウト、接続再利用パターンの不備、サイズ設定の最適化不足、サーバーレスでのキャッシュの欠如、接続の頻繁な作成・破棄
ガイドライン
- 一度に質問するのは1つだけにしてください。まず大まかな状況(デプロイの種類、ワークロード、同時実行数)を尋ね、その後で詳細(現在の設定、エラーメッセージ)を確認してください。この方法により、根本原因をすばやく絞り込み、不要な設定変更や過剰な質問を避けられます。
- トラブルシューティングや推奨事項に役立つ関連パラメーターの計測方法と監視方法については、
references/monitoring-guide.mdを確認してください。
プールの枯渇
操作がキューに追加されている場合、プールは枯渇しています。
症状:MongoWaitQueueTimeoutError、WaitQueueTimeoutError、またはMongoTimeoutException、レイテンシの増加、操作の待ち時間の発生。
解決策:
maxPoolSizeを増やす場合:待機キューに待機中の操作があり(サイズ > 0)、かつサーバーの使用率が低い- 増やさない場合:サーバーが処理能力の上限に達している。クエリの最適化を提案してください。
接続タイムアウト(ECONNREFUSED、SocketTimeout)
クライアント側の解決策:正当な必要性がある場合は、connectTimeoutMS/socketTimeoutMSを増やしてください
インフラストラクチャの問題(案内先):
- シェル経由で接続できない:ネットワーク/ファイアウォールの問題;
- 環境固有の問題:VPC/セキュリティの問題;
- DNSエラー:DNS/SRVの名前解決
接続の頻繁な作成・破棄
症状:サーバーメトリクスconnections.totalCreatedの急激な増加、接続処理にかかるCPU使用率の高さ
原因:プーリングを使用していない、サーバーレスでキャッシュしていない、maxIdleTimeMSが低すぎる、再起動ループ
高レイテンシ
- トラフィックの急増に備え、
minPoolSizeを0より大きくしてください - 高レイテンシ(>50ms)の場合は、ネットワーク圧縮を使用します:
compressors: ['snappy', 'zlib'] - 地理的に分散した構成では、最寄りの読み取り設定を使用します
環境コンテキスト(必須)
必ず、プール構成を提案する前に、設定変更の提案に必要なユーザーのアプリケーション環境に関する十分な情報があることを確認してください。
プール構成に影響を与えるパラメータ
- サーバーのメモリ制限: 各接続はサーバーに対して 1MB を消費します。
- クラスター内のクライアント数とサーバー数: プールはクライアントごとおよびサーバーごとに存在し、クラスターのメモリを消費します。
- OLAP と OLTP: タイムアウト値は、予想される操作の実行時間をサポートする必要があります。
- 予想される操作の実行時間: 短い OLTP クエリでは、ハングした操作を早期に失敗させるために低い socketTimeoutMS が必要になる場合があります。一方、長時間実行される OLAP クエリでは、早期タイムアウトを避けるために高い値が必要になる場合があります。
- サーバーバージョン: MongoDB 8.0+ では、Atlas クラスターに defaultMaxTimeMS も導入され、長時間実行される操作に対するサーバー側の保護を提供します。
- サーバーレスと従来型: サーバーレス関数では、ウォーム呼び出し間で接続を再利用できるように、ハンドラーの外でクライアントを初期化する必要があります。一方、従来型サーバーでは、事前にウォームアップされた接続を備えたより大きなプールを維持できます。
- 同時実行性とトラフィックパターン: 高い同時実行性とバースト的なトラフィックでは、より大きなプールとより多くの事前ウォームアップ接続が必要になる場合があります。一方、安定した低同時実行のワークロードでは、多くの場合、より小さなプールで効率的に運用できます。
- オペレーティングシステム: 一部の OS には開けるファイルディスクリプタの数に制限があり、最大接続数に影響を与える可能性があります。接続プールを構成する際、特に高トラフィックのアプリケーションでは、これらの制限を考慮することが重要です。
- ドライバーのバージョン: ドライバーのバージョンによって、デフォルト設定やパフォーマンス特性が異なる場合があります。最適な構成を確保するために、使用している特定のドライバーバージョンのドキュメントを必ず確認してください。
ガイドライン:
- 構成設計フェーズのシナリオに関連する質問のみを行ってください。構成設計フェーズでコンテンツを明確に活用することにつながらない質問は省略してください。
- 回答が提供されない場合は、妥当な仮定を置き、それを開示してください。
モニタリングとイテレーションに関するアドバイス
ユーザーに対し、プール構成に関連するパラメータをモニタリングするよう導く必要があります。
詳細なモニタリングの設定については、references/monitoring-guide.md を参照してください。
コードを作成する場合
提供するすべての接続パラメータ(推奨事項またはコードスニペット内)について、値を決定するのに十分なユーザーのアプリケーション環境に関するコンテキストがあることを確認してください。ない場合は、具体的な値を提案する前に的を絞った質問をしてください。回答が得られない場合は、妥当な仮定を置き、それを開示し、コード内で関連するパラメータにそれに応じたコメントを付けてください。