以下に、接続管理の代替案を推奨される順に並べました。
サーバーで許可される接続を増やす
サーバーでの合計着信接続制限は、オペレーティングシステムまたはmaxIncomingConnections
(maxConns
MongoDB 2.4以前では別名)によって課された制限の小さい方によって決定されます。
通常、Linuxディストリビューションでは、プロセスごとのファイル記述子を1024に制限しています。MongoDBは、着信接続に80%を使用します(使用可能な接続は約819残ります)。
次のようにして、mongo
シェルで現在使用可能な接続を確認できます。
db.serverStatus().connections
本番システムでは、Linux のulimit
設定を調整して、より多くの同時接続を許可するのが一般的です。さらにベストプラクティスについては、MongoDBマニュアルのプロダクションノートを確認することをお勧めします。
APIを提供する
リソースが制限されている共有サーバーを管理している場合は、データベースに直接アクセスするのではなく、独自のAPIを提供するのが一般的です。このアプローチにより、追加の抽象化レイヤーが提供されるため、クライアント構成とは関係なく、リソースの使用状況とサーバーの展開を管理できます。たとえば、データベースサーバーを移動したり、スタンドアロンからレプリカセットに再構成したりできますが、クライアントはこれを意識する必要はありません。クライアントが接続に使用する資格情報に基づいて、APIを介してカスタムリソース制限(クライアントごとの接続など)を管理することもできます。
クライアントの接続プールサイズを減らす
MongoDB(2.6)には、クライアントごとの接続を制限するオプションがありません。通常、クライアントの制限はドライバを介して課せられます(つまり、接続プールのサイズを設定します)。たとえば、Javaドライバでは、MongoClient
デフォルトの最大プールサイズは100です。
クライアントが接続制限を台無しにしたくないので、これは望ましいオプションではありませんが、サーバー側の制限を課すつもりでも、プールサイズを設定することは妥当です。適切に。そうしないと、過剰な接続を切断すると、アプリケーションで頻繁に例外が発生します。
クライアント操作を監視する
クライアントまたはサーバーの制限を調整できない場合、考慮すべき代替策は、を介した同時クライアント接続(IPによる)をカウントし、db.currentOp()
を介しdb.killOp()
た過剰な接続を強制終了するスクリプトを実装することです。クライアントのリクエストのみを殺すように非常に注意する必要があります。このkillOp()
コマンドは、内部データベーススレッドも強制終了できるスーパーユーザーコマンドです(予期しない結果につながる可能性があります)。
注:クライアントが共有ゲートウェイ経由で接続している場合(つまり、ソースIPがクライアントを一意に識別しない場合)、このアプローチは失敗します。