2009-02-25 10 views
4

よろしくお願いします。 (良い仕事ジェフら)Webサーバーからリソースを解放するためにレポートサーバーを設定する

我々は、ユーザーがオンデマンドレポートを生成することができ始めたときに導入された当社のウェブアプリケーションの一つでボトルネックを解決しようとしています。

次のように当社のインフラは次のとおりです。Webサーバー/ DBServerの(ColdFusionの7とMSSQL 2005)として動作する 1台のサーバー

それは私たちのバックエンドユーザーとフロントエンドのウェブサイトのためのWebアプリケーションを提供しています。レポートはバックエンドのユーザーによって生成されるため、ユーザーがログインする必要のあるレベルのセキュリティ(Webベース)があります。

レポートが生成されるピーク時に、巨大なクエリ用のリソースを使用してSQL Serverを使用し、その後ColdFusionで複数ページのPDFを生成するため、WebアプリケーションおよびフロントエンドWebサイトが許容できない速度になります。

は、私たちは、ベストプラクティスは、いくつかの負荷を取り除くためにどのようになるかを正確にわからないが、レポートへのアクセス制限は、現時点ではオプションではありません。

私たちは、最も一般的なクエリを簡素化するために他のテーブルに非正規化データを検討してきましたが、それだけで問題をさらに押し込みますように、それはそうです。

そこで、我々は、第二のサーバを取得し、クエリが実行されるであろうに私たちのDBの複製されたコピーと「レポートサーバー」として使用を考えています。これは1つの問題を解決しますが、2番目の問題が残っています.PDFの生成はリソースを大量に消費します。

このタスクをレポートサーバーに委託したいと思いますが、セキュリティ保護されたWebアプリケーションでは、サーバー1からWebアプリケーションにログインしたユーザーでPDFを作成するためにHTTP GETを起動できません。 Webアプリケーションでそれを表示しますが、ユーザーの資格情報を検証せずに、サーバ2にそれをフェッチ/生成...

誰もがこの経験を持っていますか?事前に感謝スタックオーバーフロー!

答えて

3

"このタスクをレポートサーバーに委託したいが、セキュアなWebアプリケーションでは、サーバー1からWebアプリケーションにログインしたユーザーでPDFを作成するHTTP GETを起動できないWebアプリケーションに表示するが、ユーザーの資格情報を検証せずにサーバー2で生成/フェッチする」...

どうしてですか?あなたはウェブサービスを書くのに世界で最も簡単な言語を使用しています。ここに私の提案があります。

まず、自分のサーバーにデータベースを移動し、別のサーバーにcfとsqlサーバーがあるようにします。これを行う最初の理由はパフォーマンスです。既に述べたように、cfとsqlを同じサーバー上に持つことは、理想的な設定ではありません。 2番目の理由はセキュリティです。誰かがあなたのウェブサーバーをハックすることができれば、あなたのデータを入手するための場所があります。 cfとSQLサーバの間にファイアウォールを設置して、セキュリティを強化する必要があります。最後の理由はスケーラビリティです。より多くのリソースを投げたり、データベースをクラスタリングする必要がある場合は、それが自分のサーバー上にあるときは簡単です。

ウェブサービス用。あなたができることはcfを別のサーバーにインストールし、Webサービスを作成してレポートの生成を処理することです。新しいcfサーバーをロックしてssl接続のみを受け入れ、ユーザーのログイン資格情報をWebサービスに渡してください。 Webサービス内で、レポートを生成するメソッドを呼び出す前にユーザーを認証します。

今はpdfs自体です。私がパスで行ったメソッドの1つは、渡されたいくつかのパラメータ(ユーザーの資格情報とクエリを実行するために生成されたSQL)に基づいてハッシュを生成し、pdfが生成されると、pdfの名前にハッシュを割り当てますそれをディスクに保存します。今すぐpdfが存在するかどうかを調べることができるシンプルなキャッシングシステムがあります。それがあればそれを返し、それ以外の場合は生成してキャッシュします。

締め切り時には、あなたの問題は以前にほとんど見たことのないものではありません。あなたはちょっとした仕事をするだけで、アプリケーションの規模はより速くなります。

+0

返信いただきありがとうございます。ファイル名としてのハッシュは本当に良いアイデアです。同じレポートを何度も生成しているユーザーは問題です。私たちは今、自分自身を導くための確かな基盤を持っています。 – jfrobishow

3

最も基本的なベストプラクティスは、同じハードウェア上にWebサーバーとdbサーバーを持たないことです。私はそれから始めるだろう。

0

別のWeb & DBサーバへのアドバイスに加えて、私がしようとしただろう:あなたはまだそれを使用していない場合a)は、ストアドプロシージャにクエリを移動

b)スケジューラでレポートを生成し、使用可能な状態で特別なテーブルにキャッシュしておくことで、顧客は数少ない高速問合せでしか選択しないため、顧客のレポート作成時間も短縮されます。

これが役に立ちます。

+0

こんにちは、ありがとうございました。クエリ自体は問題の一部ですが、問題の30%は運用サーバー上でPDFをオンザフライで生成していると言えます。 私はまだ、Webアプリケーションのセキュリティを損なうことなく、他のサーバーにそのタスクを相殺するのが最善だろうと思っています。 – jfrobishow

1

PDFの生成と計算の間で、認識を分離する必要があります。両方とも別々のステップです。あなたは何ができるか

1である)毎日実行し、すべてのレポートのためのすべての計算値でそれを埋めますテーブルを算出したレポートを作成します。

2)誰かがPDFレポートをリクエストした場合、レポートにあらかじめ計算された値の単純な選択クエリを実行させます。飛行中の計算よりもはるかに少ないデータベースになります。あなたがPDFの設定を使っている場合は、coldfusionを使ってPDFを生成することができます。そうしないと、生のPDF形式(htmlマークアップに似ています)をテキスト形式で使用したり、別のライブラリ(cfx_pdf、適切なJavaライブラリなど)を使用して生成することができます。

ダウンロードしてレポートを表示/印刷する必要がない場合は、フラッシュ用紙を使用できますか?

また、レポートキューを作成する方法もあります。 2番目のサーバーに置いているかどうかにかかわらず、CFが離れてしまうことができれば、レポートリクエストをキューに入れ、処理されたときにユーザーに電子メールで知らせることができます。

スケジュールされたプロセスによってキューを制御し、好きなだけ定期的に実行し、一度にいくつかのレポートを作成することができます。あなたの状況に適したアプローチであるかどうかはわかりません。

上記のように、ストアドプロシージャを実行すると、MySQLでインデックスが正しく設定されているかどうかを確認することができます。以前は3分のクエリを持っていましたが、これは15秒に短縮しました。なぜなら、頻繁に使用されていた各テーブルで追加のインデックスを宣言するのを忘れてしまったからです。

どうすればいいのか教えてください。

関連する問題