0

ディスク上に多数のデータベースがあり、顧客ごとに 1 つのデータベース ファイルがあるアプリケーション アーキテクチャを実装したいと考えています。

ユーザー要求がデータベースに入ると、データベースが開かれます (まだ開かれていない場合)。

一定期間アクティビティがないと、データベースはサーバーによって自動的に閉じられ、データベース サーバーのリソースが解放されます。

このアーキテクチャでは、ディスク上に多数のデータベースを保持できるはずですが、データベース サーバーにロードされるのは常にそのサブセットのみです。

問題は、データベースを自動的に閉じるという概念をサポートしているデータベースがほとんどないように見えることです。おそらく Microsoft SQL サーバーがこれを許可しているようですが、すべてのオープン ソース テクノロジを使用しているため、SQL サーバーはオプションではありません。

無料またはオープンソースのデータベース技術を検討しますが、自動クローズ機能をサポートするものは見当たりません。

違うの知ってる人いますか?

更新: Windows ではなく Linux に基づくソリューションを探しています。

ありがとう

4

5 に答える 5

1

これが本当に問題であることを確認しましたか?オープンデータベースのコストは非常に小さい可能性が高いため、特に「オープン」は、データベースを待機している未処理のトランザクションを同期し、基本的な整合性チェックを行うことで構成される可能性が高いため、言及するだけです (特に、保存されたデータのページをロードする)ディスク上)。

これが完了すると、アクティビティがなければ、サーバー上で維持するデータはそれほど多くありません。

考えてみれば、DB システムの最も基本的な機能は、メモリを使用してデータベース ページのキャッシュを管理することです。データの一部に対する要求が行われると、システムは実際のページを特定し、RAM をチェックしてロードされているかどうかを確認します。そうでない場合は、ディスクからロードします。

また、DB の「メタ」データの膨大な量がデータベースに保存されていることにも注意してください。つまり、システムが何かを知りたい場合、システム自体を効果的に使用して、特にデータ ページ キャッシング サブシステムで情報を見つけます。

他のキャッシュと同様に、データが期限切れになり不要になると、データはディスクにフラッシュされ、必要に応じて再フェッチされます。

したがって、これは、データベースが「開かれる」と、その状態を維持するために本当に必要な情報がデータ キャッシュ サブシステムを介して維持される可能性が高く、未使用のデータベースについては、現在のトラフィックのためのスペースを確保するためにディスクに戻されることを意味します。

これが、候補 DB をテストして、これに関する問題が発生したかどうか、またはデータベースに「データベースを開く」という概念さえあるかどうかを知りたい理由です。

クライアントとしてこれについて話し合うとき、焦点はデータベース サーバーへの接続に集中する傾向があります。しかし、それらがすべて閉じられると、システムが非アクティブな特定のデータベースに関する大量のメモリ データを保持することはないと思います。

結局のところ、データベース内のすべてのデータは「同じ」ように格納され、テーブルはテーブルであり、インデックスはインデックスであり、特にすべてのデータ ページが管理される中央サーバーではインデックスです。データの単一の大きな「スープ」として。

発生する可能性のある唯一の問題は、データベースがたまたま各データベース専用のファイルを作成し、そのファイルが開いたままになっている場合です。最終的に、ファイル記述子が不足する可能性があります。

しかし、最新のシステムのほとんどはそれを行わず、それらが存在するデータベースやスキーマに関係なく、すべてをファイルの大きな塊に保存します (もちろん、作成した特定のテーブルスペースの割り当てやサーバーが許可した場合を除きます)。

したがって、基本的に、これは問題ではないと思います。なぜなら、現代のデータベースは、あなたが社内で話しているような区別を実際に行っているとは思わないからです。複数のデータベースまたはスキーマはシステム内の論理的な成果物であり、技術的な実装ではありません。また、すべてのデータ ページは最終的に同じキャッシュに格納され、元のスキーマ、データベース、テーブル、またはインデックスに関係なく同じリソースを使用します。 .

これが問題かどうかを確認するために、選択したデータベースでいくつかのテストを行います。たとえば、100 万個のデータベースを作成し、データベースのメモリを可能な限り減らしてから、それらの循環を開始し、適切と思われる数 (10、100、1000 など) を一度に開いて、問題があります。

最後に、特定のデータベースについてこれを「知っている」わけではありません。これは、歴史的にデータベースがどのように実装されているかについての本能です。

于 2010-01-30T23:31:55.147 に答える
0

「データベースを閉じる」とは、キャッシュメモリを解放することを意味すると思いますか?ディスク上の実際のファイルを「閉じる」ことには実際にはメリットがないため、それらのリソース使用量はごくわずかです。

一部のデータベースエンジンは、オペレーティングシステムのディスクキャッシュを使用します。MySQLのMyISAMストレージエンジンは一例ですが、整合性の保証を提供していないため、その用途の多くを除外しています。ただし、InnoDBなどのMySQLの他のエンジンはこれを提供していません。

PostgreSQLは、オペレーティングシステムのキャッシュを第2レベルのキャッシュとしてネイティブに使用します。第1レベルのキャッシュ(shared_buffers)は常にメモリを消費しますが、パフォーマンスが重要なサーバーでも、メモリの10〜25%に設定するのが一般的です。残りはOSレベルのキャッシュに無料で使用でき、必要に応じてデータベースに割り当てられ、他のアプリケーションが必要なときに利用できます。

于 2010-05-05T00:39:10.250 に答える
0

cronジョブを使用したmySql。

さらに、mySqlのフットプリントは(SQL Serverと比較して)非常に小さいです... 1つの例は、メモリを占有しないことです(もちろん、SQL Serverのメモリ使用量を制限できることはわかっています)。

mySqlには、非常に効率的で便利な接続プールもあります。

于 2010-01-30T23:17:39.100 に答える
0

ファイル ハンドルが不足するプロセスに十分な数の顧客がいる可能性があることを理解しています。DB接続のプールはどうですか?

ユーザーのリクエストが届いたら、そのユーザーのDBが開いているかどうかを確認します。その場合は、接続を使用して、最終アクセス フラグの時刻をリセットします。

そのユーザーの DB が開いていない場合は、接続を開き、最終アクセス時刻を設定して、その接続を使用します (使用可能な接続がない場合は、エラーをスローします)。また、プロセス/スレッド/軽量プロセス/環境で呼び出すものは何でもフォークして、以下を確認します。

プールに十分な数の未使用の接続がある場合、スレッドは終了します

そうでない場合は、最後にアクセスされた 5% ~ 25% の最も古いもの、または直近の 1 分間/1 時間/1 日に使用されていないもの (ユーザー要求パターンに適したもの) をスキャンし、それらを閉じて、未使用のプールに移動します。

着信要求を処理するために、未使用のプールに十分な数の使用可能な接続を保持していることを確認してください。

于 2010-01-30T23:50:50.007 に答える
0

私はこの考えを持っており、あなたがWindowsを使用していると仮定しています:

  1. データベースはサービスとして実行され、各クライアントには独自の一意のサービス名があります。
  2. そのサービスを開始/停止するバッチファイルを作成します。
  3. バッチ ファイルはいつでもサーバーから呼び出されます。
于 2010-01-30T22:33:23.407 に答える