MongoDBでホストごとの接続を制限するにはどうすればよいですか?


8

私は、javaドライバーを介して他のクライアントからの接続を受け入れるmongoサーバーを実行しています。私が気づいたのは、しばらくすると一部のユーザーが開いているポートが多すぎるため、他のユーザーがmongoに接続できなくなることです。1つのmongoClientオブジェクトのみを作成しますが、IPをチェックすると数百のポートが監視されます。

Javaドライバーでホストごとの接続を制限する例に出くわしましたが、クライアントにそれを混乱させたくありません。mongodインスタンスからクライアントを制限するにはどうすればよいですか?

インスタンスは、Linuxリモートサーバー上で実行される1つのmongodです。

回答:


12

以下に、接続管理の代替案を推奨される順に並べました。

サーバーで許可される接続を増やす

サーバーでの合計着信接続制限は、オペレーティングシステムまたはmaxIncomingConnectionsmaxConnsMongoDB 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がクライアントを一意に識別しない場合)、このアプローチは失敗します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.